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()