机器学习入门(七):多项式回归, PolynomialFeatures详解

机器学习入门专栏其他几个章节:

机器学习入门(一)线性回归

机器学习入门(二)KNN

机器学习入门(三)朴素贝叶斯

机器学习入门(四)决策树

机器学习入门(五)集成学习

机器学习入门(六)支持向量机

机器学习入门(八)主成分分析

机器学习入门(九)无监督学习

前言

机器学习入门(六)中,已经通过pipeline快速实现了多项式回归。代码如下:

PolyRegr = Pipeline([
        ('poly',PolynomialFeatures(degree=2)),
        ('clf',LinearRegression())
        ])
PolyRegr.fit(X, y)

这个方式省略了很多步骤,并且也无法得知PolynomialFeatures是如何运作的。

PolynomialFeatures详细探讨

现在有(a,b)两个特征,使用degree=2的二次多项式则为(1,a, a^2, ab, b ,b^2)。
PolynomialFeatures主要有以下几个参数:

degree:度数,决定多项式的次数

interaction_only: 默认为False,字面意思就是只能交叉相乘,不能有a^2这种.

include_bias: 默认为True, 这个bias指的是多项式会自动包含1,设为False就没这个1了.

order:有"C" 和"F" 两个选项。官方写的是在密集情况(dense case)下的输出array的顺序,F可以加快操作但可能使得subsequent estimators变慢。
利用代码试验一下:

from sklearn.preprocessing import PolynomialFeatures
a=[[2,3]]
pf=PolynomialFeatures(degree=2)
print(pf.fit_transform(a))
pf=PolynomialFeatures(degree=2,include_bias=False)
print(pf.fit_transform(a))
pf=PolynomialFeatures(degree=2,interaction_only=True)
print(pf.fit_transform(a))

得到结果如下:
在这里插入图片描述
如果是c=[[a],[b]]这种形式,生成的多项式就没有ab交叉项了,只有[[1,a,a^2], [1,b,b^2]] 。

c=[[2],[3]]
print(pf.fit_transform(c))

在这里插入图片描述

如何实现多项式回归

多项式回归是多元线性回归的一个特例
所以其本质是一个求解多元线性方程组的问题:
f ( x ) = w T x + b f(x) = w^Tx+b f(x)=wTx+b
或者:
f ( x ) = w n x n + w n − 1 x n − 1 + . . . + w 2 x 2 + w 1 x + b f(x)=w_nx^n+w_{n-1}x^{n-1}+...+w_2x^2+w_1x+b f(x)=wnxn+wn1xn1+...+w2x2+w1x+b
这里无论是 x n x^n xn还是 x n x_n xn,其实本质都一样.

把b处理一下写成 w 0 , x 0 w_0,x^0 w0,x0的形式带入,以矩阵的形式更容易理解:
[ 1 x 0 x 0 2 ⋯ x 0 n − 1 x 0 n 1 x 1 x 1 2 ⋯ x 1 n − 1 x 1 n ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ 1 x n x n 2 ⋯ x n n − 1 x n n ] [ w 0 w 1 ⋮ w n ] = [ y 0 y 1 ⋮ y n ] \left[\begin{array}{c}1&x_0&x_0^2&\cdots &x_0 ^{n-1}& x_0^n\\ 1&x_1&x_1^2&\cdots &x_1^{n-1}&x_1^n\\ \vdots &\vdots&\vdots&\ddots&\vdots&\vdots\\ 1&x_n&x_n^2&\cdots &x_n^{n-1}&x_n^n\end{array}\right]\begin{bmatrix}w_0\\w_1\\\vdots \\w_n\end{bmatrix}= \begin{bmatrix} y_0\\y_1\\ \vdots\\ y_n\end{bmatrix} 111x0x1xnx02x12xn2x0n1x1n1xnn1x0nx1nxnn w0w1wn = y0y1yn
左边是关于x的矩阵,右边是关于w系数的矩阵,每一个系数w都对应x中的一列。而PolynomialFeatures就是用来生成关于x的矩阵的。

然后再用LinearRegression学习,获得相应的w。

说的再简单一点,比如现在有横坐标[[a], [b], [c]], 纵坐标[[x], [y], [z]],通过PolynomialFeatures(degree=2)即生成二次多项式矩阵,degree是多少,就是几次。
[ 1 a a 2 1 b b 2 1 c c 2 ] × w = [ x y z ] \begin{bmatrix} 1 & a&a^2\\ 1&b&b^2\\ 1&c&c^2\end{bmatrix}\times w= \begin{bmatrix} x\\ y\\ z \end{bmatrix} 111abca2b2c2 ×w= xyz
其中每一列都会对应生成一个系数,很直观的理解,如果是一维的,LinearRegression就会学得一次项系数,二维的就会学得二次项系数,一次类推。所以最后LinearRegression模型中的coef_参数返回的是一个关于系数的list。

代码实现:

首先创建数据并且添加噪音:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
X = np.sort(3 * np.random.rand(40, 1), axis=0)  
y = np.sin(X).ravel()   
# 噪音
y[::5] += 2.5 * (0.5 - np.random.rand(8)) 
plt.plot(X,y,'b^')
plt.show()

生成这样的数据:

在这里插入图片描述
然后实现多项式矩阵,并且训练模型,查看训练出来的系数w和截距b:

lr = LinearRegression()
pf=PolynomialFeatures(degree=2)
lr.fit(pf.fit_transform(X), y)
print(lr.coef_)
print(lr.intercept_)

结果如下:
在这里插入图片描述
正好三个系数,分别对应常数项,一次项,二次项。
然后绘制图像:

xx = np.linspace(0, 5, 100) #生成密集点
xx2 = pf.transform(xx[:, np.newaxis]) #转换格式

yy2 = lr.predict(xx2)
plt.plot(xx ,yy2,c='r')

生成图像,由于二次项系数为负,所以这个二次函数先增后减。:
在这里插入图片描述

正规方程验证

其实,想要获得w系数,更直接的方式是利用正规方程:
w = ( X T X ) − 1 X T y w=(X^TX)^{-1}X^Ty w=(XTX)1XTy

想要得到这个公式也非常简单, 已知我们要求解 X w = y Xw=y Xw=y,两边同时乘上 X T X^T XT得:
X T X w = X T y X^TXw=X^Ty XTXw=XTy

将左边的 X T X X^TX XTX除到右边即可

python代码验证:

w=np.linalg.inv(X.T@X)@X.T@y
print(w)

这里X是经过PolynomialFeatures处理之后的矩阵,对应之前代码中的XX2。

np.linalg.inv()表示逆矩阵,X.T就是转置,@等价于.dot()操作,可以获得结果如下:
在这里插入图片描述
和之前求的w和b一模一样,说明结果完全正确!

  • 61
    点赞
  • 251
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值