微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何找到拟合的多项式特征模型的回归曲线方程

如何解决如何找到拟合的多项式特征模型的回归曲线方程

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.7894736842105263,0.8421052631578945,0.736842105263158,0.5789473684210524]})

我具有上述数据,其中包括输入和输出数据,并且ı希望制作一条适合此数据的曲线。首先在这里绘制输入和输出值:

enter image description here

我编写了以下代码

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")

图是:

enter image description here

但是我找不到上面曲线的方程(橙色曲线),我怎么能找到?

解决方法

请注意,如何制作问题中显示的图。当我运行您的代码时,按预期方式将以下(度= 2)多项式拟合到数据中:

enter image description here

现在,您已经拟合了数据,因此可以看到模型的系数:

print(reg.coef_)
print(reg.intercept_)
# [[ 0.          0.85962436 -0.83796885]]
# [0.5523586]

请注意,用于拟合该模型的数据等效于以下内容:

X_poly = np.concatenate([np.ones((16,1)),X,X**2],axis=1)

因此,单个数据点是按如下方式创建的向量:

temp = 0.5
x = np.array([1,temp,temp**2]).reshape((1,3))

您的多项式模型只是多项式特征的线性模型:

y = A.x + B

y = reg.coef_.dot(x.T) + reg.intercept_
print(y) #  [[0.77267856]]

验证:

print(reg.predict(x))  # array([[0.77267856]])
,

您的图实际上与您运行的代码相对应

poly=PolynomialFeatures(degree=7)

,而不要degree=2。确实,通过上述更改运行代码,我们得到:

enter image description here

现在,您的多项式特征为:

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

运行以上表达式
plt.plot(x,y)

给予:

enter image description here

使用一些随机生成的数据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.63582055,0.6311952 ])

np.allclose(y_reg,y_eq)
# True

这个问题很重要,我想您已经知道,尝试将如此高阶多项式拟合到如此少的数据点并不是一个好主意,您可能应该保持在2或3的低位…… >

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。