如何画根据散列节点画一条二维曲线
Polynomial‘s Examples
一个二元线性数据学习的例子。初衷即使希望能够看到基于二次曲线的随机点,训练模型能够画出一条二次曲线。
1 >>> X = np.arange(6).reshape(3, 2) 2 >>> X 3 array([[0, 1], 4 [2, 3], 5 [4, 5]]) 6 >>> poly = PolynomialFeatures(2) 7 >>> poly.fit_transform(X) 8 array([[ 1., 0., 1., 0., 0., 1.], 9 [ 1., 2., 3., 4., 6., 9.], 10 [ 1., 4., 5., 16., 20., 25.]]) 11 >>> poly = PolynomialFeatures(interaction_only=True) 12 >>> poly.fit_transform(X) 13 array([[ 1., 0., 1., 0.], 14 [ 1., 2., 3., 6.], 15 [ 1., 4., 5., 20.]])
首先是对6元素的数组进行reshape,3行2列。
通过Polynomial函数的fit_transform可以为其添加全“1”列,以及a*b, a*a, b*b三列。
#多项式回归
#二次回归(Quadratic Regression),y = α + β1x + β2x2,我们有一个解释变量,但是模型有三项,通过第三项(二次项)来实现曲线关系
import numpy as np from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures def runplt(): plt.figure() plt.axis([0,25,0,25],fontsize=18) plt.grid(True) return plt X_train = [[6], [8], [10], [14], [18]] y_train = [[7], [9], [13], [17.5], [18]] X_test = [[6], [8], [11], [16]] y_test = [[8], [12], [15], [18]]
对于数据集进行拆分,其中test数据是用于评分的validation set;train数据是用于训练的的;
1 plt = runplt() 2 regressor = LinearRegression() 3 regressor.fit(X_train,y_train) 4 xx = np.linspace(0, 26, 100) 5 print(xx) 6 print(xx.shape[0]) 7 yy = regressor.predict(xx.reshape(xx.shape[0], 1)) 8 plt.plot(X_train, y_train, 'k.') 9 plt.plot(xx, yy)
上面这段代码只是直接进行线性学习,于是得到的也只是一条穿过尽量多点的一条直线而已。
#构造第三项
1 quadratic_fearurizer = PolynomialFeatures(degree=2) 2 X_train_quadratic = quadratic_fearurizer.fit_transform(X_train) 3 X_test_quadratic = quadratic_fearurizer.transform(X_test) 4 regressor_quadratic = LinearRegression() 5 regressor_quadratic.fit(X_train_quadratic, y_train) 6 xx_quadratic = quadratic_fearurizer.transform(xx.reshape(xx.shape[0],1)) 7 print(xx.reshape(xx.shape[0],1)) 8 print(xx_quadratic) 9 plt.plot(xx,regressor_quadratic.predict(xx_quadratic),'r-') 10 plt.show() 11 print ('一元线性回归 r^2: %.2f'%regressor.score(X_test,y_test)) 12 print('二次回归 r^2: %.2f'%regressor_quadratic.score(X_test_quadratic, y_test))
quadratic_fearurizer.fit_transform(X_train) 里面fit和regressor_quadratic.fit(X_train_quadratic, y_train) fit是不一样的,前者是对于X_train进行多项式化,返回一个a,b, a*a, ab, b*b的矩阵,后者则是一种学习,对于前者返回的多项式矩阵以及y_train进行学习,构建模型,求出误差最小的系数矩阵,这样就建立了基于输入数据的模型。
上面这段代码主要是对于X_train进行多项式化,然后将多项式以及y_train放入到线性模型中进行学习,此时X值已经不再是上面的简单的直线模型,而是一个二元函数,线性模型将会基于二次方程来尽量匹配y_trian(计算系数矩阵);很好,有了这个模型后,我们在首先是根据随记生成的数据(xx)转换为列项列(第6行),因为未来我们进行predict的时候,参数需要是列向量的(是这样吗),于是在第9行,我们看到X序列就是xx,y序列是经过线性模型转化的值。
这里数据是分成三部分,X_train,y_train是用于训练的,X_test以及y_test是用于测试(分数)的,xx(变形后的xx_quadratic)则是扮演“辅助线”的功能,主要用于显示一条二元曲线。