python - 如何找到拟合的多项式特征模型的回归曲线方程
问题描述
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
data=pd.DataFrame(
{"input":
[0.001,0.015,0.066,0.151,0.266,0.402,0.45,0.499,0.598,0.646,0.738,0.782,0.86,0.894,0.924,0.95],
"output":[0.5263157894736842,0.5789473684210524,0.6315789473684206,0.6842105263157897,
0.6315789473684206, 0.7894736842105263, 0.8421052631578945, 0.7894736842105263, 0.736842105263158,
0.6842105263157897, 0.736842105263158, 0.736842105263158,0.6842105263157897, 0.6842105263157897,
0.6315789473684206,0.5789473684210524]})
我有包括输入和输出数据的上述数据,我想制作一条适合这些数据的曲线。首先绘制输入和输出值在这里:
我做了这个代码:
X=data.iloc[:,0].to_numpy()
X=X.reshape(-1,1)
y=data.iloc[:,1].to_numpy()
y=y.reshape(-1,1)
poly=PolynomialFeatures(degree=2)
poly.fit(X,y)
X_poly=poly.transform(X)
reg=LinearRegression().fit(X_poly,y)
plt.scatter(X,y,color="blue")
plt.plot(X,reg.predict(X_poly),color="orange",label="Polynomial Linear Regression")
plt.xlabel("Temperature")
plt.ylabel("Pressure")
plt.legend(loc="upper left")
情节是:
但是我没有找到上面的曲线方程(橙色曲线)我怎么能找到?
解决方案
您的情节实际上对应于您运行的代码
poly=PolynomialFeatures(degree=7)
而不是degree=2
。实际上,通过上述更改运行您的代码,我们得到:
现在,您的多项式特征是:
poly.get_feature_names()
# ['1', 'x0', 'x0^2', 'x0^3', 'x0^4', 'x0^5', 'x0^6', 'x0^7']
并且您的线性回归的各自系数是:
reg.coef_
# array([[ 0. , 5.43894411, -68.14277256, 364.28508827,
# -941.70924401, 1254.89358662, -831.27091422, 216.43304954]])
加上拦截:
reg.intercept_
# array([0.51228593])
鉴于上述情况,并设置
coef = reg.coef_[0]
因为这里我们在初始数据中有一个特征,所以你的回归方程是:
y = reg.intercept_ + coef[0] + coef[1]*x + coef[2]*x**2 + coef[3]*x**3 + coef[4]*x**4 + coef[5]*x**5 + coef[6]*x**6 + coef[7]*x**7
x
为了视觉验证,我们可以用一些数据绘制上面的函数[0, 1]
x = np.linspace(0, 1, 15)
y
为and运行上述表达式
plt.plot(x, y)
给出:
使用一些随机生成的数据x
,我们可以验证方程的结果y_eq
确实等于回归模型y_reg
在数值精度范围内产生的结果:
x = np.random.rand(1,10)
y_eq = reg.intercept_ + coef[0] + coef[1]*x + coef[2]*x**2 + coef[3]*x**3 + coef[4]*x**4 + coef[5]*x**5 + coef[6]*x**6 + coef[7]*x**7
y_reg = np.concatenate(reg.predict(poly.transform(x.reshape(-1,1))))
y_eq
# array([[0.72452703, 0.64106819, 0.67394222, 0.71756648, 0.71102853,
# 0.63582055, 0.54243177, 0.71104983, 0.71287962, 0.6311952 ]])
y_reg
# array([0.72452703, 0.64106819, 0.67394222, 0.71756648, 0.71102853,
# 0.63582055, 0.54243177, 0.71104983, 0.71287962, 0.6311952 ])
np.allclose(y_reg, y_eq)
# True
与问题无关,我想您已经知道尝试将如此高阶多项式拟合到如此少的数据点不是一个好主意,您可能应该保持在 2 或 3 的低阶...
推荐阅读
- laravel - Laravel 5.7:获取文件大小取决于每个文件夹的扩展名
- reactjs - useEffect 挂钩中的 Graphql 订阅不会访问最新状态
- roblox - Roblox Lua 脚本:OnActivate 与 OnCreate
- c - Ubuntu 在执行这个内联 asm 时完全冻结
- javascript - 在 OpenLayers 示例中调用 domtoimage.toPng() 时出现“SecurityError: This operation is insecure”
- angular - 使用映射将数据保存在 Firebase 中
- laravel - 在 API 中发送纯密码或加密密码
- javascript - javascript创建的模板元素不起作用
- html - 为什么模态背景与我的弹出模态重叠甚至设置!重要和z-index?如何解决?
- python-3.x - Conda 中的 EnvironmentNotWritableError