如何使用 scikit-learn 将多项式曲线拟合到数据中?

Posted

技术标签:

【中文标题】如何使用 scikit-learn 将多项式曲线拟合到数据中?【英文标题】:How to fit a polynomial curve to data using scikit-learn? 【发布时间】:2015-12-16 02:06:26 【问题描述】:

问题背景

scikit-learn 与Python 结合使用,我试图将二次多项式曲线拟合到一组数据中,这样模型将采用y = a2x^2 + a1x + a0 的形式,而an 系数将由模型提供.

问题

我不知道如何使用该软件包拟合多项式曲线,而且似乎很少有关于如何做到这一点的清晰参考(我已经寻找了一段时间)。我见过this question on doing something similar with NumPy,也见过this question which does a more complicated fit than I require。

好的解决方案是什么样的

希望,一个好的解决方案会像这样(示例改编自我正在使用的线性拟合代码):

x = my_x_data.reshape(len(profile), 1)
y = my_y_data.reshape(len(profile), 1)
regression = linear_model.LinearRegression(degree=2) # or PolynomialRegression(degree=2) or QuadraticRegression()
regression.fit(x, y)

我想scikit-learn 会有这样的设施,因为它很常见(例如,在R 中,可以在代码中提供拟合公式,并且它们应该可以互换那种用例)。

问题:

有什么好的方法可以做到这一点,或者我在哪里可以找到有关如何正确做到这一点的信息?

【问题讨论】:

【参考方案1】:

可能重复:https://stats.stackexchange.com/questions/58739/polynomial-regression-using-scikit-learn。

出于某种原因,使用 scikit-learn 完成这项工作是否至关重要?使用 numpy 可以非常轻松地执行您想要的操作:

z = np.poly1d(np.polyfit(x,y,2))

之后z(x) 返回x 处的拟合值。

scikit-learn 解决方案几乎可以肯定是对相同代码的简单封装。

【讨论】:

【参考方案2】:

我相信 Salvador Dali here 的回答会回答您的问题。在 scikit-learn 中,从您的数据构建多项式特征就足够了,然后在该扩展数据集上运行线性回归。如果您有兴趣阅读有关它的一些文档,可以找到更多信息here。为方便起见,我将发布 Salvador Dali 提供的示例代码:

from sklearn.preprocessing import PolynomialFeatures
from sklearn import linear_model

X = [[0.44, 0.68], [0.99, 0.23]]
vector = [109.85, 155.72]
predict= [0.49, 0.18]

poly = PolynomialFeatures(degree=2)
X_ = poly.fit_transform(X)
predict_ = poly.fit_transform(predict)

clf = linear_model.LinearRegression()
clf.fit(X_, vector)
print clf.predict(predict_)

【讨论】:

什么是“向量”? vector 是目标向量。 (方程组 Xw = b 中的 b)。【参考方案3】:

AGML 的答案可以封装在一个与 scikit-learn 兼容的类中,如下所示:

class PolyEstimator:
    def __init__(self, degree=2):
        self.degree = degree

    def fit(self, x, y):
        self.z = np.poly1d(np.polyfit(x.flatten().tolist(), y, self.degree))

    def predict(self, x):
        return self.z(x.flatten().tolist())

【讨论】:

以上是关于如何使用 scikit-learn 将多项式曲线拟合到数据中?的主要内容,如果未能解决你的问题,请参考以下文章

线性回归 scikit-learn LinearRegression最小二乘法梯度下降SDG多项式回归学习曲线岭回归Lasso回归

如何利用matlab将数值拟合成函数

迭代拟合多项式曲线

scikit-learn:将数据拟合成块与一次拟合

我可以对 sklearn 进行对数回归吗?

如何使用 scikit-learn 进行高斯/多项式回归?