问题背景
使用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
中,适合的公式可以在代码中提供,并且它们应该能够在那种用例中非常可互换)。
做这件事的好方法是什么,或者我在哪里可以找到如何正确做这件事的信息?
标题>标题>可能的副本: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的解决方案几乎肯定是对相同代码的简单包装。
我相信Salvador Dali在这里的答案会回答你的问题。在scikit-learn中,从数据构造多项式特征,然后在扩展的数据集上运行线性回归就足够了。如果您有兴趣阅读有关它的一些文档,您可以在这里找到更多信息。为了方便起见,我将发布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_)
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())