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

时间:2015-09-18 20:08:30

标签: python numpy machine-learning scikit-learn regression

问题背景

在Python中使用scikit-learn,我试图将二次多项式曲线拟合到一组数据中,以便模型的形式为y = a2x^2 + a1x + a0和{{1}系数将由模型提供。

问题

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

多好的解决方案

希望一个好的解决方案可以这样解决(样本改编自我使用的线性拟合代码):

an

我认为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中,拟合的公式可以在代码中提供,并且它们对于那种用例来说应该是可以互换的。)

问题:

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

3 个答案:

答案 0 :(得分:9)

可能重复: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解决方案几乎肯定只是一个围绕相同代码的包装器。

答案 1 :(得分:6)

我相信萨尔瓦多·达利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_)

答案 2 :(得分:0)

AGML的答案可以包装在scikit-learn-compatible类中,如下所示:

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