1.數學定義算法
保序迴歸是迴歸算法的一種,基本思想是:給定一個有限的實數集合,訓練一個模型來最小化下列方程:數組
而且知足下列約束條件:dom
2.算法過程說明函數
從該序列的首元素日後觀察,一旦出現亂序現象中止該輪觀察,從該亂序元素開始逐個吸取元素組成一個序列,直到該序列全部元素的平均值小於或等於下一個待吸取的元素。spa
舉例:3d
原始序列:<9, 10, 14>code
結果序列:<9, 10, 14>orm
分析:從9日後觀察,到最後的元素14都未發現亂序狀況,不用處理。blog
原始序列:<9, 14, 10>排序
結果序列:<9, 12, 12>
分析:從9日後觀察,觀察到14時發生亂序(14>10),中止該輪觀察轉入吸取元素處理,吸取元素10後子序列爲<14, 10>,取該序列全部元素的平均值得12,故用序列<12, 12>替代<14, 10>。吸取10後已經到了最後的元素,處理操做完成。
原始序列:<14, 9, 10, 15>
結果序列:<11, 11, 11, 15>
分析:從14日後觀察,觀察到9時發生亂序(14>9),中止該輪觀察轉入吸取元素處理,吸取元素9後子序列爲<14,9>。求該序列全部元素的平均值得12.5,因爲12.5大於下個待吸取的元素10,因此再吸取10,得序列<14, 9, 10>。求該序列全部元素的平均值得11,因爲11小於下個待吸取的元素15,因此中止吸取操做,用序列<11, 11, 11>替代<14, 9, 10>。
3.舉例說明下面實驗的原理
以某種藥物的使用量爲例子:
假設藥物使用量爲數組X=0,1,2,3,4….99,病人對藥物的反應量爲Y=y1,y2,y3…..y99 ,而因爲個體的緣由,Y不是一個單調函數(即:存在波動),若是咱們按照藥物反應排序,對應的X就會成爲亂序,失去了研究的意義。而咱們的研究的目的是爲了觀察隨着藥物使用量的遞增,病人的平均反應情況。在這種狀況下,使用保序迴歸,即不改變X的排列順序,又求的Y的平均值情況。以下圖所示:
從圖中能夠看出,最長的綠線x的取值約是30到60,在這個區間內,Y的平均值同樣,那麼從經濟及病人抗藥性等因素考慮,使用藥量爲30個單位是最理想的。
當前IT行業虛擬化比較流行,使用這種方式,找到合適的判斷參數,就可使用此算法使資源獲得最大程度的合理利用。
4.實驗代碼
import numpy as np import matplotlib.pyplot as plt from matplotlib.collections import LineCollection from sklearn.isotonic import IsotonicRegression from sklearn.utils import check_random_state n = 100 ##產生一個0-99的列表 x = np.arange(n) ##實例化一個np.random.RandomState的實例,做用是每次取的隨機值相同 rs = check_random_state(0) ##randint(-50, 50):產生-50到50之間的整數 ##np.log 求以e爲低的對數 y = rs.randint(-50, 50, size=(n,)) + 50. * np.log(1 + np.arange(n)) ##設置保序迴歸函數 ir = IsotonicRegression() ##訓練數據 y_ = ir.fit_transform(x, y) ##繪圖 segments = [[[i, y[i]], [i, y_[i]]] for i in range(n)] ##plt.gca().add_collection(lc),這兩步就是畫點與平均直線的連線 lc = LineCollection(segments) fig = plt.figure() plt.plot(x, y, 'r.', markersize=12) plt.plot(x, y_, 'g.-', markersize=12) plt.gca().add_collection(lc) plt.legend(('Data', 'Isotonic Fit'), loc='lower right') plt.title('Isotonic regression') plt.show()