python代码实现多项式回归

核心思路:将非线性数据通过参数替换的方法转换到线性数据,然后再使用线性回归的方法进行拟合。

对于函数y=ax平方+bx+c为例:

方法1:手写代码实现

(1)导包

# 第一部分:导包
from sklearn.linear_model import LinearRegression
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

(2)获取数据集

# 第二部分:获取数据集并绘制散点图
x = np.random.uniform(-4, 2, size=(100))
y = 2 * x**2 + 4 * x + 3 + np.random.randn(100)
x = x.reshape(-1, 1)  # 确保 x 是二维数组
# 绘制散点图
plt.scatter(x, y)

(3)多项式回归

# 第三部分:多项式回归
X_new = np.hstack((x, x**2))  # 合并 x 和 x^2 成为矩阵
linear_regression_new = LinearRegression()  # 线性回归模型
linear_regression_new.fit(X_new, y)  # 训练模型,训练的时候内部用的就是有两个特征值的非线性公式

(4)预测结果

# 第四部分:预测结果
y_predict_new = linear_regression_new.predict(X_new)
# 绘制预测结果的回归曲线
plt.scatter(x, y,color='blue')
plt.plot(np.sort(x, axis=0), y_predict_new[np.argsort(x, axis=0)], color='red')  # 排序绘制曲线
'''
x 的形状是 (n, 1),表示 x 是一个二维数组(n 行 1 列)。
axis=0 表示沿着第 0 轴,也就是沿着行的方向排序。
因为 x 是一列数据,axis=0 确保对每一列(在这里就是 x 的唯一一列)中的值按行排序,这样可以将 x 从小到大排列。
'''
plt.show()

print("截距c=", linear_regression_new.intercept_)
print("两个系数a,b=",linear_regression_new.coef_ )

(5)pycharm代码完整实现

# 第一部分:导包
from sklearn.linear_model import LinearRegression
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 第二部分:获取数据集并绘制散点图
x = np.random.uniform(-4, 2, size=(100))
y = 2 * x**2 + 4 * x + 3 + np.random.randn(100)
x = x.reshape(-1, 1)  # 确保 x 是二维数组
# 绘制散点图
plt.scatter(x, y)

# 第三部分:多项式回归
X_new = np.hstack((x, x**2))  # 合并 x 和 x^2 成为矩阵
linear_regression_new = LinearRegression()  # 线性回归模型
linear_regression_new.fit(X_new, y)  # 训练模型,训练的时候内部用的就是有两个特征值的非线性公式

# 第四部分:预测结果
y_predict_new = linear_regression_new.predict(X_new)
# 绘制预测结果的回归曲线
plt.scatter(x, y,color='blue')
plt.plot(np.sort(x, axis=0), y_predict_new[np.argsort(x, axis=0)], color='red')  # 排序绘制曲线
'''
x 的形状是 (n, 1),表示 x 是一个二维数组(n 行 1 列)。
axis=0 表示沿着第 0 轴,也就是沿着行的方向排序。
因为 x 是一列数据,axis=0 确保对每一列(在这里就是 x 的唯一一列)中的值按行排序,这样可以将 x 从小到大排列。
'''
plt.show()

print("截距c=", linear_regression_new.intercept_)
print("两个系数a,b=",linear_regression_new.coef_ )

方法2:使用库函数实现

更改部分:“第三部分:多项式回归”,代码如下:

# 第三部分:多项式回归
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2)#代表最高为二次幂
X_new = poly.fit_transform(x)#得到的第一列为序号,第二列为X,第三列为X的平方
linear_regression_new = LinearRegression()  # 线性回归模型
linear_regression_new.fit(X_new, y)  # 训练模型,训练的时候内部用的就是有两个特征值的非线性公式

完整代码如下:

# 第一部分:导包
from sklearn.linear_model import LinearRegression
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 第二部分:获取数据集并绘制散点图
x = np.random.uniform(-4, 2, size=(100))
y = 2 * x**2 + 4 * x + 3 + np.random.randn(100)
x = x.reshape(-1, 1)  # 确保 x 是二维数组
# 绘制散点图
plt.scatter(x, y)

# 第三部分:多项式回归
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2)#代表最高为二次幂
X_new = poly.fit_transform(x)#得到的第一列为序号,第二列为X,第三列为X的平方
linear_regression_new = LinearRegression()  # 线性回归模型
linear_regression_new.fit(X_new, y)  # 训练模型,训练的时候内部用的就是有两个特征值的非线性公式
# 第四部分:预测结果

y_predict_new = linear_regression_new.predict(X_new)
# 绘制预测结果的回归曲
plt.scatter(x, y,color='blue')
plt.plot(np.sort(x, axis=0), y_predict_new[np.argsort(x, axis=0)], color='red')  # 排序绘制曲线
'''
x 的形状是 (n, 1),表示 x 是一个二维数组(n 行 1 列)。
axis=0 表示沿着第 0 轴,也就是沿着行的方向排序。
因为 x 是一列数据,axis=0 确保对每一列(在这里就是 x 的唯一一列)中的值按行排序,这样可以将 x 从小到大排列。
'''
plt.show()

print("截距c=", linear_regression_new.intercept_)
print("两个系数a,b=",linear_regression_new.coef_ )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还不秃顶的计科生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值