對生成的數據進行保序回歸的一個實例.保序回歸能在訓練數據上發現一個非遞減逼近函數的同時最小化均方誤差。這樣的模型的好處是,它不用假設任何形式的目標函數,(如線性)。為了比較,這里用一個線性回歸作為參照。
# coding:utf-8
print (__doc__)
#作者:Nelle Varoquaux <nelle.varoquaux@gmail.com>
# Alexandre Gramfort <alexandre.gramfort@inria.fr>
#協議:BSD
import numpy as np
from matplotlib.collections import LineCollection
from pylab import *
from sklearn.linear_model import LinearRegression
from sklearn.isotonic import IsotonicRegression
from sklearn.utils import check_random_state
n = 100
x = np.arange(n)
rs = check_random_state(0)
y = rs.randint(-50,50,size=(n,))+50.*np.log(1+np.arange(n))
#擬合保存回歸和線性回歸模型
ir = IsotonicRegression()
y_ = ir.fit_transform(x,y)
lr = LinearRegression()
lr.fit(x[:,np.newaxis],y) #線性回歸中x需要是二維的
#繪制結果
segments = [[[i, y[i]], [i, y_[i]]] for i in range(n)]
lc = LineCollection(segments, zorder=0)
lc.set_array(np.ones(len(y)))
lc.set_linewidths(0.5 * np.ones(n))
plt.plot(x,y,"r.",markersize=12)
plt.plot(x,y_,"g.-",markersize=12)
plt.plot(x,lr.predict(x[:,np.newaxis]),"b-")
plt.gca().add_collection(lc)
myfont = matplotlib.font_manager.FontProperties(fname="Microsoft-Yahei-UI-Light.ttc")
mpl.rcParams['axes.unicode_minus'] = False
plt.legend((u"數據",u"保存擬合",u"線性擬合"),loc="lower right",prop=myfont)
plt.title(u'保存回歸',fontproperties=myfont)
plt.show()