python多项式回归_Python 多项式回归 - 树懒学堂

本文介绍了如何使用Python进行多项式回归。通过模拟数据集和线性回归模型展示,当增加特征(如原始特征的平方)时,多项式回归能更好地拟合非线性数据。虽然高阶多项式可能导致参数估计困难,但在适当选择阶数下,多项式回归是解决非线性问题的有效方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多项式回归

理论上可以以上的方法拟合任何曲线,但前提条件是要事先对模型的形式进行判断,即知道非线性模型的参数设置。在一般情况下, 通过绘制散点图的形式可以做到这一点。但是在更一般的情况下,如有多个自变量的情况下,无法绘制散点图,同时也很难对模型形式进行预估,这个时候可以使用本小节所介绍的方法。根据数学的相关理论,任何曲线均可以使用多项式进行逼近,这种逼近的分析过程即多项式回归。

多项式回归类似于可线性化的非线性模型,可通过变量代换的方式使用普通最小二乘对参数进行估计。

设有因变量y和自变量x,它们之间的关系为n次多项式的关系,则有如下模型:

则多项式模型就转化为如下的多元线性模型:

这样就可以按照多元线性回归模型进行分析了。对于多元的多项式模型:

同样做变量代换,令

则有

转化之后的模型同样可以按照多元线性回归模型进行分析。

多项式回归当阶数过高时,待估参数过多,在样本量不大的情况下会比较困难,这是多项式回归的一大缺陷。因此,一般的多项式回归模型很少应用到三阶以上。

一、Python代码实现多项式回归

1.模拟多项式回归的数据集

import numpy as np

import matplotlib.pyplot as plt

x = np.random.uniform(-3,3,size=100)

X = x.reshape(-1,1)

# 一元二次方程

y = 0.5*x**2 + x + 2+np.random.normal(0,1,size=100)

plt.scatter(x,y)

2.使用线性回归拟合

很明显,用一根直线来拟合一根有弧度的曲线,效果是不好的

from sklearn.linear_model import LinearRegression

lin_reg = LinearRegression()

lin_reg.fit(X,y)

y_predict = lin_reg.predict(X)

plt.scatter(x,y)

plt.plot(X,y_predict,color='r')

3.添加一个特征

X2 = np.hstack([X,X**2])

lin_reg2 = LinearRegression()

lin_reg2.fit(X2, y)

y_predict2 = lin_reg2.predict(X2)

plt.scatter(x, y)

# 由于x是乱的,所以应该进行排序

plt.plot(np.sort(x), y_predict2[np.argsort(x)], color='r')

plt.show()

多项式回归线的绘制:

从上图可以看出,当添加了一个特征(原来特征的平方)之后,再从x的维度来看,就形成了一条曲线,显然这个曲线对原来数据集的拟合程度是更好的。

多线性回归在=算法上并没有新的地方,完全是使用线性回归的思路,关键在于为原来的样本,添加新的特征。而我们得到新的特征的方式是原有特征的多项式的组合。

采用这样的方式,我们就可以解决一些非线性的问题。

### Python 多项式回归实现代码示例 为了展示如何在Python中实现多项式回归,下面提供了一个完整的例子。此过程涉及几个主要阶段:数据生成、预处理、特征构建、模型拟合以及结果预测和可视化。 #### 数据生成与预处理 首先创建一些模拟的数据集,这些数据遵循二次关系,并加入了一定量的随机噪声。接着转换成适合进一步分析的形式: ```python import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures from sklearn.metrics import mean_squared_error np.random.seed(0) n_samples = 30 X = 6 * np.random.rand(n_samples, 1) - 3 y = 0.5 * X**2 + X + 2 + np.random.randn(n_samples, 1) plt.scatter(X, y, color='blue') plt.title('Generated Data with Noise') plt.show() ``` 这段脚本生成了带有噪音的样本点,并展示了它们之间的分布情况[^3]。 #### 构建多项式特征并训练模型 利用`PolynomialFeatures`类可以轻松地将输入变量扩展至更高次幂,从而允许线性模型捕捉更复杂的模式。对于当前案例中的二阶多项式来说,则执行如下操作: ```python poly_features = PolynomialFeatures(degree=2, include_bias=False) X_poly = poly_features.fit_transform(X) lin_reg = LinearRegression() lin_reg.fit(X_poly, y) print(f"Coefficients: {lin_reg.coef_}") print(f"Intercept: {lin_reg.intercept_}") ``` 上述命令不仅完成了对新特征空间的学习,还输出了所获得的最佳拟合直线对应的斜率(即权重向量)及其截距[^4]。 #### 结果预测及可视化 最后一步是对整个定义域内的所有位置做出估计值,并将其连同原始观测一起画出来查看整体契合度;同时也计算均方误差(MSE),作为衡量标准之一: ```python X_test = np.linspace(-3, 3, 100).reshape(-1, 1) X_test_poly = poly_features.transform(X_test) y_pred = lin_reg.predict(X_test_poly) plt.plot(X_test, y_pred, 'r-', label="Predictions") plt.scatter(X, y, c='b', marker='o', label="Training data") plt.legend(loc="best") plt.xlabel("Input feature (X)") plt.ylabel("Target variable (y)") plt.title("Fitted polynomial regression curve") mse = mean_squared_error(y, lin_reg.predict(X_poly)) print(f"Mean Squared Error on training set is {mse:.2f}") plt.show() ``` 通过这种方式,能够直观看到算法的效果,并且得到了量化评价指标来辅助判断其优劣程度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值