java求多项式回归_多项式回归

撰写日期:2017-03-12

多元真实情况未必是线性的,有时需要增加指数项,也就是多项式回归,现实世界的曲线关系都是通过增加多项式实现的,本节介绍用scikit-learn解决多项式回归问题。

1、住房价格成本

样本 面积(平方米) 价格(万元)

样本

面积(平方米)

价格(万元)

1

50

150

2

100

200

3

150

250

4

200

280

5

250

310

6

300

330

2、绘图

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 importsys2 reload(sys)3 sys.setdefaultencoding("utf-8")4 importmatplotlib.pyplot as plt5 importnumpy as np6

7 plt.figure()## 实例化作图变量

8 plt.title("single variable")#图像标题

9 plt.xlabel("x")10 plt.ylabel("y")11 plt.axis([30, 400, 100, 400])12 plt.grid(True) #是否绘制网格线

13

14 xx = [[50],[100], [150], [200], [250], [300]]15 yy = [[150], [200], [250], [280], [310], [330]]16 plt.plot(xx, yy, 'k.')17 plt.show()

View Code

java求多项式回归_多项式回归_第1张图片

2.1 使用线性回归

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 from sklearn.linear_model importLinearRegression2 model =LinearRegression()3 model.fit(xx, yy)4 x2 = [[30], [400]]5 y2 =model.predict(x2)6 print(type(y2))7 print(y2)8 plt.plot(x2, y2, 'g-')9 plt.show()

View Code

java求多项式回归_多项式回归_第2张图片

但是实际情况是,如果房屋面积一味的增加,房价并不会线性增长,因此线性关系已经无法描述真实的房价问题。

2.1 使用多项式回归

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 importmatplotlib.pyplot as plt2 importnumpy as np3 from sklearn.linear_model importLinearRegression4 from sklearn.preprocessing importPolynomialFeatures5 plt.figure()#实例化作图变量

6 plt.title("single variable")7 plt.xlabel("x")8 plt.ylabel("y")9 plt.axis([30, 400, 100, 400])10 plt.grid(True)11 X = [[50],[100],[150],[200],[250],[300]]12 y = [[150],[200],[250],[280],[310],[330]]13 X_test = [[250],[300]] #用来做最终效果测试

14 y_test = [[310],[330]] #用来做最终效果测试

15 plt.plot(X, y, 'k.')16 model =LinearRegression()17 model.fit(X, y)18 X2 = [[30], [400]]19 y2 =model.predict(X2)20 plt.plot(X2, y2, 'g-')21 plt.show()22 print(X2)23 print(y2)

View Code

结果:

java求多项式回归_多项式回归_第3张图片

1 [[30], [400]]2 [[ 148.93333333]3 [ 415.33333333]]

多项式映射

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 xx = np.linspace(30, 400, 100)#设计x轴一系列点作为画图的x点集

2 quadratic_featurizer = PolynomialFeatures(degree=2)#实例化一个二次多项式特征实例

3 X_train_quadratic = quadratic_featurizer.fit_transform(X) #用二次多项式对样本X值做变换

4 xx_quadratic = quadratic_featurizer.transform(xx.reshape(xx.shape[0], 1)) #把训练好X值的多项式特征实例应用到一系列点上,形成矩阵

5 regressor_quadratic = LinearRegression() #创建一个线性回归实例

6 regressor_quadratic.fit(X_train_quadratic, y) #以多项式变换后的x值为输入,代入线性回归模型做训练

7 plt.plot(xx, regressor_quadratic.predict(xx_quadratic), 'r-') #用训练好的模型作图

8

9 print '一元线性回归 r-squared', model.score(X_test, y_test)10 X_test_quadratic =quadratic_featurizer.transform(X_test)11 print '二次回归 r-squared', regressor_quadratic.score(X_test_quadratic, y_test)12

13 plt.show() #展示图像

14 #print(X)

15 #print(X_train_quadratic)

16 #print(xx_quadratic)

View Code

结果:

1 一元线性回归 r-squared 0.0755555555556

2 二次回归 r-squared 0.999336734694

java求多项式回归_多项式回归_第4张图片

红色为二次多项式回归图像,可以看到比线性模型吻合度高,输出的R方结果为:

1 一元线性回归 r-squared 0.0755555555556

2 二次回归 r-squared 0.999336734694

可以看到二次回归效果更好。

我们继续尝试一下三次回归:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 cubic_featurizer = PolynomialFeatures(degree=3)2 X_train_cubic =cubic_featurizer.fit_transform(X)3 regressor_cubic =LinearRegression()4 regressor_cubic.fit(X_train_cubic, y)5 xx_cubic = cubic_featurizer.transform(xx.reshape(xx.shape[0], 1))6 plt.plot(xx, regressor_cubic.predict(xx_cubic))7

8 X_test_cubic =cubic_featurizer.transform(X_test)9 print '三次回归 r-squared', regressor_cubic.score(X_test_cubic, y_test)10 plt.show() #展示图像

View Code

结果:

1 一元线性回归 r-squared 0.0755555555556

2 二次回归 r-squared 0.999336734694

3 三次回归 r-squared 0.999464600659

java求多项式回归_多项式回归_第5张图片

可以看到三次回归比二次回归效果又好了一些,但是不是很明显。所以二次回归更可能是最适合的回归模型,三次回归可能有过拟合现象。

xx是用于预测输出的样本数据集。

你可能感兴趣的:(java求多项式回归)