回归-多项式回归算法

文章目录

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

简介

多项式回归(Polynomial Regression)顾名思义是包含多个自变量的回归算法,也叫多元线性回归,多数时候利用一元线性回归(一条直线)不能很好拟合数据时,就需要用曲线,而多项式回归就是求解这条曲线。

回归-多项式回归算法

也就是说一元回归方程是y = w x + b y=wx+b y =w x +b
而多元回归方程是y = w n x n + w n − 1 x n − 1 + ⋅ ⋅ ⋅ + w 1 x + w 0 y=w_nx^n+w_{n-1}x^{n-1}+···+w_1x+w_0 y =w n ​x n +w n −1 ​x n −1 +⋅⋅⋅+w 1 ​x +w 0 ​
比如二元就是y = a x 2 + b x + c y=ax^2+bx+c y =a x 2 +b x +c,三元就是y = a x 3 + b x 2 + c x + d y=ax^3+bx^2+cx+d y =a x 3 +b x 2 +c x +d
但是并不是元数越多越好,可能存在过拟合问题,在最后一节介绍。

一元线性回归可参考另一篇博客:回归-线性回归算法(房价预测项目)

; 原理

多元线性回归很复杂,特别是当特征数多元数多的时候,可视化难以想象。
用向量矩阵的来表达:y = x w \bold y=\bold x\bold w y =x w
x = ( 1 x 1 x 1 2 ⋯ x 1 n 1 x 2 x 2 2 ⋯ x 2 n ⋮ ⋮ ⋮ ⋱ ⋮ 1 x k x k 2 ⋯ x k n ) x=\begin{pmatrix}\begin{array}{ccccc}1& x_1 & x_1^2 &\cdots& x_1^n\1& x_2 & x_2^2 &\cdots& x_2^n\ \vdots & \vdots & \vdots&\ddots & \vdots\ 1&x_k&x_k^2&\cdots&x_k^n \end{array}\end{pmatrix}x =⎝⎜⎜⎜⎛​1 1 ⋮1 ​x 1 ​x 2 ​⋮x k ​​x 1 2 ​x 2 2 ​⋮x k 2 ​​⋯⋯⋱⋯​x 1 n ​x 2 n ​⋮x k n ​​​⎠⎟⎟⎟⎞​,w = ( w 01 w 02 ⋯ w 0 k w 11 w 12 ⋯ w 1 k ⋮ ⋮ ⋱ ⋮ w n 1 w n 2 ⋯ w n k ) \bold w=\begin{pmatrix}\begin{array}{cccc}w_{01} & w_{02} &\cdots& w_{0k}\w_{11} & w_{12} &\cdots& w_{1k}\ \vdots & \vdots&\ddots & \vdots\ w_{n1}&w_{n2}&\cdots&w_{nk} \end{array}\end{pmatrix}w =⎝⎜⎜⎜⎛​w 0 1 ​w 1 1 ​⋮w n 1 ​​w 0 2 ​w 1 2 ​⋮w n 2 ​​⋯⋯⋱⋯​w 0 k ​w 1 k ​⋮w n k ​​​⎠⎟⎟⎟⎞​

比如一个特征量二元回归方程:k = 1 k=1 k =1,n = 2 n=2 n =2:
y = ( 1 x 1 x 1 2 ) ( w 01 w 11 w 21 ) = w 01 + w 11 x 1 + w 21 x 1 2 y=(\begin{array}{ccc}1&x_1&x_1^2 \end{array})\begin{pmatrix} w_{01}\ w_{11}\w_{21}\end{pmatrix}=w_{01}+w_{11}x_1+w_{21}x_1^2 y =(1 ​x 1 ​​x 1 2 ​​)⎝⎛​w 0 1 ​w 1 1 ​w 2 1 ​​⎠⎞​=w 0 1 ​+w 1 1 ​x 1 ​+w 2 1 ​x 1 2 ​

再如两个特征量二元回归方程:k = 2 k=2 k =2,n = 2 n=2 n =2:
y = x = ( 1 x 1 x 1 2 1 x 2 x 2 2 ) ( w 01 w 02 w 11 w 12 w 21 w 22 ) = ( w 01 + w 11 x 1 + w 21 x 1 2 w 02 + w 12 x 1 + w 22 x 1 2 w 01 + w 11 x 2 + w 21 x 2 2 w 02 + w 12 x 2 + w 22 x 2 2 ) y= x=\begin{pmatrix}\begin{array}{ccc}1& x_1 & x_1^2\1& x_2 & x_2^2 \end{array}\end{pmatrix}\begin{pmatrix} w_{01}&w_{02}\ w_{11}&w_{12}\w_{21}&w_{22}\end{pmatrix}=\begin{pmatrix}\begin{array}{cc}w_{01}+w_{11}x_1+w_{21}x_1^2 & w_{02}+w_{12}x_1+w_{22}x_1^2\w_{01}+w_{11}x_2+w_{21}x_2^2& w_{02}+w_{12}x_2+w_{22}x_2^2 \end{array}\end{pmatrix}y =x =(1 1 ​x 1 ​x 2 ​​x 1 2 ​x 2 2 ​​​)⎝⎛​w 0 1 ​w 1 1 ​w 2 1 ​​w 0 2 ​w 1 2 ​w 2 2 ​​⎠⎞​=(w 0 1 ​+w 1 1 ​x 1 ​+w 2 1 ​x 1 2 ​w 0 1 ​+w 1 1 ​x 2 ​+w 2 1 ​x 2 2 ​​w 0 2 ​+w 1 2 ​x 1 ​+w 2 2 ​x 1 2 ​w 0 2 ​+w 1 2 ​x 2 ​+w 2 2 ​x 2 2 ​​​)

∣ y ∣ = w 01 + w 11 x 1 + w 21 x 1 2 + w 02 + w 12 x 2 + w 22 x 2 2 |y|=w_{01}+w_{11}x_1+w_{21}x_1^2+w_{02}+w_{12}x_2+w_{22}x_2^2 ∣y ∣=w 0 1 ​+w 1 1 ​x 1 ​+w 2 1 ​x 1 2 ​+w 0 2 ​+w 1 2 ​x 2 ​+w 2 2 ​x 2 2 ​

可以看出计算量其实是很大的。

使用最小二乘法作为损失函数,并选择优化算法:正规方程或梯度下降。
正规方程:w = ( x T x ) − 1 x T y \bold{w}=(\bold{x}^T\bold{x})^{-1}\bold{x}^T\bold{y}w =(x T x )−1 x T y
如果( x T x ) (\bold{x}^T\bold{x})(x T x )不可逆,则使用梯度下降求解即可。
可参考:浅谈梯度下降与模拟退火算法

代码

多元线性回归与一元线性回归其实只是x \bold x x的维度不同,也就是说通过设置x \bold x x的维度,调用线性模型 LinearRegression即可进行求解,即对数据进行预处理,需要几次方即升到几维,如下2种方法。

  1. 使用 hstack()hstack()叠加
    如果维数低,我们可以手动添加即可。
import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print("水平方向叠加:", np.hstack((a, b)))
print("垂直方向叠加:", np.vstack((a, b)))

回归-多项式回归算法
  1. 使用 PolynomialFeatures()对特征预处理
    如果维度多,可以用该函数计算生成x \bold x x。
    包括参数:
    degree:默认2,多项式特征的次数;
    interaction_only:默认default=False,若为True,则不含自己和自己相结合的特征项;
    include_bias:默认True,若为True,则包含一列为1的偏差项;
    order:默认’C’,若为’F’则计算更快,但是后续的拟合慢。
    包括属性:
    powers_:n维幂运算数组,根据degree的值而确定行,根据属性个数而确定列。
    n_input_features_:输入特征的总数,即幂运算矩阵的列;
    n_output_features_:输出特征的总数,即幂运算矩阵的行。
import numpy as np
from sklearn.preprocessing import PolynomialFeatures

x = np.arange(6).reshape(3, 2)
print(x)
poly = PolynomialFeatures(degree=2)
poly.fit(x)
print(poly.powers_)
print("输入特征:", poly.n_input_features_)
print("输出特征:", poly.n_output_features_)
x = poly.transform(x)
print(x)

(插播反爬信息 )博主CSDN地址:https://wzlodq.blog.csdn.net/

回归-多项式回归算法

回归-多项式回归算法
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

X = np.linspace(-5, 5, 100)
Y = 2 * X ** 2 + 3 * X + 5 + np.random.randn(100) * 5
x = X.reshape(-1, 1)

x1 = np.hstack([x, x ** 2])

poly = PolynomialFeatures()
poly.fit(x)
x2 = poly.transform(x)

model1 = LinearRegression()
model1.fit(x1, Y)
y_pred1 = model1.predict(x1)
plt.figure(figsize=(8, 4))
plt.subplot(1, 2, 1)
plt.scatter(X, Y)
plt.plot(x, y_pred1, color='red')
plt.title("使用hstack()")

model2 = LinearRegression()
model2.fit(x2, Y)
y_pred2 = model2.predict(x2)
plt.subplot(1, 2, 2)
plt.scatter(X, Y)
plt.plot(x, y_pred2, color='gold')
plt.title("使用PolynomialFeatures()")

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()

过拟合

正如前面所说的一样,多项式的幂次并不是越高越好,过高可能出现过拟合情况,导致泛化能力低,过低可能出现欠拟合情况,导致预测结果差,如下图所示。

回归-多项式回归算法
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

np.random.seed(20221005)
X = np.linspace(-np.pi, np.pi, 100)
Y = np.sin(X) + np.random.randn(100) * 0.4
x = X.reshape(-1, 1)
plt.scatter(x, Y, color="lightblue")

for idx, degree in enumerate([1, 3, 30, 100]):
    print(degree)
    poly = PolynomialFeatures(degree=degree)
    poly.fit(x)
    x1 = poly.transform(x)
    model = LinearRegression()
    model.fit(x1, Y)
    y_pred = model.predict(x1)
    plt.plot(x, y_pred, label=("%d次方" % degree))

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.legend()
plt.show()

可见并不是幂次越高越好,一般遵循”奥卡姆剃刀”定律,也就是简单平滑的曲线即可。当然了,也有很多方法度量和避免欠拟合与过拟合。

原创不易,请勿转载(本不富裕的访问量雪上加霜 )
博主首页:https://wzlodq.blog.csdn.net/
来都来了,不评论两句吗👀
如果文章对你有帮助,记得一键三连❤

Original: https://blog.csdn.net/qq_45034708/article/details/127169782
Author: 吾仄lo咚锵
Title: 回归-多项式回归算法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/628758/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球