Scikit learn:使用linearRegression进行插值不起作用

Posted

技术标签:

【中文标题】Scikit learn:使用linearRegression进行插值不起作用【英文标题】:Scikit learn: Interpolation with linearRegression does not work 【发布时间】:2020-05-09 11:12:36 【问题描述】:

我正在尝试使用 Scikit learn 的 LineaerRegression 类执行插值,但结果似乎错误。这个想法是使用多项式拟合,其度数等于观测数减一。这应该使线性回归估计器产生插值。但是,LinearRegression 不提供插值解决方案。

完整代码:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

# Data
x = np.array([65.44, 65.99, 65.16, 66.24, 66.85, 66.78, 67.52, 65.1 , 62.72,
       63.53, 63.62, 64.23, 64.89, 64.3 , 66.41])
y = np.array([8.5503, 8.5596, 8.4819, 8.505 , 8.5137, 8.5174, 8.5183, 8.5336,
       8.5581, 8.5534, 8.531 , 8.5546, 8.6349, 8.6553, 8.639 ])

# Design matrix with polynomial degree corresponding to the number of points (interpolation)
polyEstimator = PolynomialFeatures(len(x) - 1)
XHat = polyEstimator.fit_transform(x.reshape(-1, 1))

# Regression 
linReg = LinearRegression(fit_intercept=False) #normalize=True, 
linRegFit = linReg.fit(XHat, y)
yPredict = linRegFit.predict(XHat)
plt.figure()
plt.plot(x, yPredict, label='Fit')
plt.plot(x, y, 'x', label='True')
plt.legend()

我尝试过 normalize=True,但也没有给出正确的答案。

【问题讨论】:

【参考方案1】:

您需要以x 的升序进行预测。我通过将您的数据放入 DataFrame 然后按x 排序解决了这个问题。如果您预测到该数据框,则该图是正确的。您需要 Dataframe 结构,因为您不能单独对 x 进行排序。这将使您的 (x,y) 对无效。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
import pandas as pd
# Data
x = np.array([65.44, 65.99, 65.16, 66.24, 66.85, 66.78, 67.52, 65.1 , 62.72,
       63.53, 63.62, 64.23, 64.89, 64.3 , 66.41])
y = np.array([8.5503, 8.5596, 8.4819, 8.505 , 8.5137, 8.5174, 8.5183, 8.5336,
       8.5581, 8.5534, 8.531 , 8.5546, 8.6349, 8.6553, 8.639 ])

df = pd.DataFrame('x': x, 'y': y)
df = df.sort_values(by='x')

# Design matrix with polynomial degree corresponding to the number of points (interpolation)
polyEstimator = PolynomialFeatures(len(x) - 1)
XHat = polyEstimator.fit_transform(np.array(df['x']).reshape(-1, 1))

# Regression
linReg = LinearRegression(fit_intercept=False) #normalize=True,
linRegFit = linReg.fit(XHat, df['y'])
df['yPredict'] = linRegFit.predict(XHat)
plt.figure()
plt.plot(df['x'], df['yPredict'], label='Fit')
plt.plot(df['x'], df['y'], 'x', label='True')
plt.legend()

【讨论】:

非常感谢您回答@E。萨默。我尝试了您的代码,但结果在我的计算机上仍然不正确。情节看起来不同,但仍然不正确。 你是说你的情节看起来和我的不一样,除了 matplotlib 风格? “不正确”是什么意思?您的估计工作正常,您的情节只是因为 x 未排序而导致情节在 x 轴上来回移动。 对不起,我得到了和你一样的情节。估计的线应该穿过所有点,因为多项式次数等于点数减 1,而这不会发生。这与我认为的观察顺序无关。 我不认为你的推理是正确的。仅仅因为您拟合了一个非常灵活的多项式并不意味着您达到了所有数据点。也许这个问题最好在stats.stackexchange.com 我认为当多项式次数等于观测数减 1 时,解决方案应该跨越所有点,参见例如en.wikipedia.org/wiki/Polynomial_interpolation上的“Unisolvence Theorem”部分我会检查你的链接。

以上是关于Scikit learn:使用linearRegression进行插值不起作用的主要内容,如果未能解决你的问题,请参考以下文章

python中高效的在线线性回归算法

scikit-learn:如何使用拟合概率模型?

使用 yml 环境获取 scikit-learn 版本警告

使用 Scikit-learn 计算信息增益

Sklearn 速查

Scikit-learn使用总结