2012-02-21 23 views
12

scipy libのleastsqメソッドは、あるデータに曲線をフィットさせます。そしてこの方法は、このデータY値がいくつかのX引数に依存することを意味する。そして、これを実現するために、いくつかの方法がありますscipy最小二乗法による直交回帰フィッティング

Y軸(DY)の曲線とデータ点の間の最小距離を算出し、しかし、私は両方の軸(DY及びDX)で最小限の距離を計算する必要がある場合はどのような計算? 1つの軸の計算を使用するときにここで

はコードのサンプルです:

import numpy as np 
from scipy.optimize import leastsq 

xData = [some data...] 
yData = [some data...] 

def mFunc(p, x, y): 
    return y - (p[0]*x**p[1]) # is takes into account only y axis 

plsq, pcov = leastsq(mFunc, [1,1], args=(xData,yData)) 
print plsq 

私は最近scipy.odrライブラリをしようと試み、それが唯一の線形関数のために適切な結果を返します。 y = a * x^bのような他の関数については、間違った結果を返します。これは私がそれを使用する方法です:

def f(p, x):  
    return p[0]*x**p[1] 

myModel = Model(f) 
myData = Data(xData, yData) 
myOdr = ODR(myData, myModel , beta0=[1,1]) 
myOdr.set_job(fit_type=0) #if set fit_type=2, returns the same as leastsq 
out = myOdr.run() 
out.pprint() 

これは、望ましくない結果を返し、一部の入力データでは実際には近くにもありません。 ある特別な使用方法がありますが、どうすれば間違っていますか?

+1

scipyのダウンロードは「直交距離の回帰」のためのモジュールを持っている適切なソリューションに私を向ける - あなたが何を必要とするということですか? http://docs.scipy.org/doc/scipy/reference/odr.html –

+0

はい、この問題を解決するようですが、試してみると、leastsqメソッドと同じ結果が返されます。私はドキュメントに記載されている例を辿り、必要に応じて動作しません。いくつかの実例がありますか? – Vladimir

+0

私はそれを試してみたところ、結果は似ていましたが、同じではないことがわかりました - 余計な計算がフィットに大きな違いをもたらさなかったということを意味しました。 –

答えて

5

私は解決策を見つけました。 Scipy Odrpackは正常に動作しますが、正しい結果を得るためには良い初期推測が必要です。そこで私はこのプロセスを2つのステップに分けました。

第1ステップ:最小二乗法を用いて最初の推測を求める。

第2ステップ:ODRのこれらの最初の推測をベータ0パラメータとして置き換えます。

そして、それは許容速度で非常にうまく動作します。

は君たちをありがとう、あなたのアドバイスは

+1

これは古い投稿ですが、ここにコードスニペットを投稿する可能性があります。私は暗黙のODRをしようとしていますが、私はscipyでそれを設定する方法がわかりません。 – Barbarossa

+1

@Barbarossa [this code snippet](http://blog.rtwilson.com/orthogonal-distance-regression-in-python/)が好きかもしれません。 – gerrit

+0

@gerrit情報をありがとう。 – Barbarossa

0

pで説明されている関数を反転できる場合は、xピン(y)をmFuncに含めると、sqrt(a^2 + b^2)となるので、擬似コード

return sqrt((y - (p[0]*x**p[1]))^2 + (x - (pinverted(y))^2) 

y=kx+m p=[m,k]  
pinv=[-m/k,1/k] 

return sqrt((y - (p[0]+x*p[1]))^2 + (x - (pinv[0]+y*pinv[1]))^2) 

ため例えば

しかし、あなたが求めることは、いくつかのケースでは問題があります。例えば、多項式(またはあなたのx^j)曲線がy(m)に最小ymを持ち、x、yがymより小さい場合、どのような種類の値を返しますか?常に解決策はありません。

+0

ポイントx、yがymよりも小さい場合、それはそのymまでの距離を返します。 ** sqrt((m-x)^ 2 +(ym-y)^ 2)/ 2 **。なぜこれが問題なのですか? – Vladimir

+0

関数y = f(x)があれば、任意のxに対してyの値があることを意味します。 Botは、入力yに対して常にxの値をとるとは限りません。すべての関数が可逆であるわけではありません。 たとえばy = x^2とx = -2の任意の点 –

+0

ああ、私は今見ます、はい、あなたは正しいです。しかし、ソフトウェアによっては、どのような入力データでも、どのような関数でも最小2乗法(デミング回帰)が成立することがあります。 Pythonでそれを行うにはいくつかの方法が必要です。 – Vladimir

6

scipy.odrは、直交距離回帰を実装します。ドキュメンテーション文字列での基本的な使用のための説明書を参照してください:

https://github.com/scipy/scipy/blob/master/scipy/odr/odrpack.py#L27

+0

ああ、ええ、私はそれを試して、それは最小限のものと同じ方法で動作し、同じ結果を返します – Vladimir

+4

全く同じ結果ですか?私はそうはないと思う。あなたは間違った結果を与える 'scipy.odr'で実行可能な例を表示するためにあなたの投稿を更新できますか? –

関連する問題