【机器学习】多项式回归

1前边我们说到了一元线性回归,其实很显然,我们直到对一件事的影响显然很少会只有一种因素,很多时候是多个因素互相作用。所以就有了多元线性回归,这个原理和一元线性回归的原理是一样的,没有很大的区别,使用的方法是梯度下降法,关于这个方法的实现可以参考一下数学书籍(因为我懒,嘻嘻)。关于多元线性回归我们就不再专门的讨论,其实一元线性回归懂了,多元线性回归就是加了一个维度,影响不大,原理没有大的变化。今天我们说一另一种回归-多项式回归。

2.我们直到,尽管多元线性回归解决了问题影响因子的问题,但是还是又很大的局限性,因为这个模型的假设是基于问题的解和变量是线性关系。但是我们直到,很多时候,这个理想的条件是不存在的。比如在指数增长的模型中,我们是无法用直线来很好的拟合问题的解。所以我们需要用更加合适的曲线来拟合问题的解。

3.多项式回归就是来解决这个问题的,多项式回归也是分为一元多项式回归和多元多项式回归,也是一个变量和多个变量的区别。我们还是从一个变量看起,我们直到一元多项式的基本形式为:F(x)=a0+a1*x+a2*x^2+....an*x^n.它的形状也随着这个多项式的次数和系数的改变而改变,能够在很大的程度上拟合一条平面上的曲线。多项式回归的原理其实也很简单,一种类似与高斯消元的方法,也是使用代价函数来修正模型。我们暂时不关心这个算法里面的数学知识(并不是我数学不好啊,相反,我的数学其实是很棒的!)。来看一下如何调用别人的库函数(哈哈,我的学习方法就是先学会调库,然后再研究别人是怎么实现的)。在sklearn中实现了这个算法,我们就用一组数据来实现一下。

(1)首先这是我们的数据集:

                                                   

(2)我们先把这个数据散点图画出来看一下:

                                                       

显然这不是一条直线,或者说用直线拟合是不太合适的。我们来看一下直线拟合的效果:

代码如下:

from sklearn.linear_model import LinearRegression
from  sklearn.preprocessing import PolynomialFeatures
import matplotlib.pyplot as plt
import numpy as np
data=np.genfromtxt("D:/ML/data.csv",delimiter=',')
x_data=data[1:,1]
y_data=data[1:,2]
# print(x_data)
# print(y_data)
plt.scatter(x_data,y_data)
plt.show()

# 采用一元线性的回归
x_data=x_data[:,np.newaxis]
y_data=y_data[:,np.newaxis]
model=LinearRegression()
model.fit(x_data,y_data)
plt.plot(x_data,y_data,'b')
plt.plot(x_data,model.predict(x_data),'r')
plt.show()

得到的效果图:

                                   

在这个图中我们可以直观的看到拟合的效果,是很差的。这并不是说线性回归不好,只能说它已经不再适合这个问题,看图我们就知道我们需要用一条曲线来拟合这些点。所以我们可以采用多项式来拟合这些点,直接上代码:

x_data=x_data[:,np.newaxis]
y_data=y_data[:,np.newaxis]
# model=LinearRegression()
# model.fit(x_data,y_data)
# plt.plot(x_data,y_data,'b')
# plt.plot(x_data,model.predict(x_data),'r')
# plt.show()
# 效果不是很好,所以采用多项式拟合的方法
poly_reg=PolynomialFeatures(degree=3)
# 做一个特征处理
x_poly=poly_reg.fit_transform(x_data)
# print(x_poly)
lin_reg=LinearRegression()
lin_reg.fit(x_poly,y_data)
# 这个是作为一个散点图的连线图画出来
plt.plot(x_data,y_data,'b')
# plt.show()
# 预测图
plt.plot(x_data,lin_reg.predict(x_poly),c='purple')
plt.show()

这里需要解释的地方又很多:首先参数为degree的那个函数,这个参数的意思是你想用几次多项式来拟合这些点?这个东西决定着拟合的效果,我们先看看degree=3的效果,一般的经验是degree的增大会让拟合程度变得更加好一点,但是也不是说越大越好。后边我们再来讨论这个问题。然后是fit_transform()这个函数这个函数是在给数据加上特征,也叫特征化处理。接着就是我们的回归模型,填充数据来训练,并且得到预测的值作图。用法和一元线性回归没有很大的区别。我们看一下degree=3时的效果:

(紫色的为预测的曲线)

emmm,看上去还不错,但是还是又一点差距,不过比直线肯定是好了很多,我们把degree调整为5再看:

这样看上去就很棒了!但是有人可能有疑问?说好的曲线了,这看上去就是折线啊,其实这是一条曲线,只不过是因为点取得太少了看上去是一条折线。OK,多项式的回归大概就是这些了,多元函数的多项式回归也是类似的。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值