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

14

问题背景

使用Python的scikit-learn,我正在尝试将二次多项式曲线拟合到一组数据中,使得模型的形式为y = a2x^2 + a1x + a0并且an系数将由模型提供。

问题

我不知道如何使用这个包来拟合多项式曲线,而且似乎没有太多清晰的参考资料可以告诉我如何做到这一点(我已经搜索了一段时间)。我看到了这个关于使用NumPy进行类似操作的问题,还有一个比我需要的更复杂的拟合问题

一个好的解决方案应该是什么样子

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

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中,拟合公式可以在代码中提供,并且它们应该在这种情况下可以相互替换)。

问题:

有什么好方法可以实现这个功能,或者我可以在哪里找到关于如何正确实现此功能的信息?

4个回答

18

9

我相信 Salvador Dali 在 这里 给出的答案会解决您的问题。在 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_)

1
"Vector"是什么意思? - Gianluca John Massimiani
1
向量是目标向量(方程组 Xw = b 中的 b)。 - twink_ml

0

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

0
这是如何在一个整洁的流程中完成的
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures, StandardScaler

model = Pipeline([
    ('scaler', StandardScaler()),
    ('poly', PolynomialFeatures(degree=3)),
    ('linear', LinearRegression())
])

model.fit(x, y)

model.predict([[1], [2]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接