どのようにしてPythonで最適線を計算し、それをmatplotlibの散布図にプロットしますか?
次のように、通常の最小二乗回帰を使用して、線形の最適な直線を計算しました。
from sklearn import linear_model
clf = linear_model.LinearRegression()
x = [[t.x1,t.x2,t.x3,t.x4,t.x5] for t in self.trainingTexts]
y = [t.human_rating for t in self.trainingTexts]
clf.fit(x,y)
regress_coefs = clf.coef_
regress_intercept = clf.intercept_
これは多変量です(ケースごとに多くのx値があります)。したがって、Xはリストのリストであり、yは単一のリストです。例えば:
x = [[1,2,3,4,5], [2,2,4,4,5], [2,2,4,4,1]]
y = [1,2,3,4,5]
しかし、高次の多項式関数でこれを行うにはどうすればよいですか。たとえば、線形(xのM乗)だけでなく、二項式(xのM = 2乗)、二次関数(xのM乗)などです。たとえば、以下から最適な曲線を取得するにはどうすればよいですか?
クリストファービショップスの「パターン認識と機械学習」p.7から抜粋:
この質問 への受け入れられた答えは、小さなマルチポリフィットライブラリを提供します。 numpyを使用する必要があり、結果を以下に概説するようにプロットにプラグインできます。
Xとyの点の配列と、必要な適合度(次数)をmultipolyfit
に渡すだけです。これは、numpyのpolyvalを使用してプロットするために使用できる係数を返します。
注:以下のコードは多変量近似を行うように修正されていますが、プロット画像は以前の非多変量回答の一部でした。
_import numpy
import matplotlib.pyplot as plt
import multipolyfit as mpf
data = [[1,1],[4,3],[8,3],[11,4],[10,7],[15,11],[16,12]]
x, y = Zip(*data)
plt.plot(x, y, 'kx')
stacked_x = numpy.array([x,x+1,x-1])
coeffs = mpf(stacked_x, y, deg)
x2 = numpy.arange(min(x)-1, max(x)+1, .01) #use more points for a smoother plot
y2 = numpy.polyval(coeffs, x2) #Evaluates the polynomial for each x2 value
plt.plot(x2, y2, label="deg=3")
_
注:これは以前の回答の一部でしたが、多変量データがない場合でも関係があります。 _coeffs = mpf(...
_の代わりにcoeffs = numpy.polyfit(x,y,3)
を使用します
非多変量データセットの場合、これを行う最も簡単な方法は、おそらくnumpyの polyfit
を使用することです。
numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)
最小二乗多項式フィット。
次数
deg
の多項式p(x) = p[0] * x**deg + ... + p[deg]
をポイント_(x, y)
_に近似します。二乗誤差を最小化する係数pのベクトルを返します。