web-dev-qa-db-ja.com

scikit-learnを使用して多項式曲線をデータに適合させる方法は?

問題のコンテキスト

Pythonでscikit-learnを使用して、2次多項式曲線をデータセットに適合させようとしています。これにより、モデルは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では、フィッティングの式をコード内で提供でき、そのような種類の機能とかなり互換性があるはずです。使用事例)。

質問:

これを行うための良い方法は何ですか、またはこれを適切に行う方法に関する情報はどこにありますか?

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ソリューションは、ほぼ確実に同じコードの単なるラッパーになります。

10
AGML

サルバドール・ダリの答え ここ があなたの質問に答えると思います。 scikit-learnでは、データから多項式の特徴を構築し、その拡張されたデータセットに対して線形回帰を実行するだけで十分です。それに関するいくつかのドキュメントを読むことに興味がある場合は、詳細情報を見つけることができます ここ 。便宜上、サルバドールダリが提供したサンプルコードを投稿します。

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_)
6
NBartley

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
pwellner