web-dev-qa-db-ja.com

Pythonの多変量(多項式)最適曲線?

どのようにして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から抜粋:

Extracted from Christopher Bishops's "Pattern Recognition and Machine Learning", p.7

19
Zach

この質問 への受け入れられた答えは、小さなマルチポリフィットライブラリを提供します。 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")
_

enter image description here


注:これは以前の回答の一部でしたが、多変量データがない場合でも関係があります。 _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のベクトルを返します。

26
jozzas