14

scipy libのleastsqメソッドは、いくつかのデータに曲線を適合させます。そして、この方法は、このデータではY値がX引数に依存することを意味します。そして、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()

これは、望ましくない誤った結果を返し、一部の入力データでは実際に近くさえありません。たぶん、それを使用するいくつかの特別な方法があります、私は何を間違えますか?

4

3 に答える 3

8

scipy.odr直交距離回帰を実装します。docstringおよびドキュメントの基本的な使用方法の説明を参照してください。

于 2012-02-21T17:06:29.637 に答える
8

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

最初のステップ:通常の最小二乗法を使用して初期推定値を見つけます。

2番目のステップ:Beta0パラメーターとしてODRのこれらの初期推測を置き換えます。

そしてそれは許容できる速度で非常にうまく機能します。

ありがとう皆さん、あなたのアドバイスは私を正しい解決策に導きました

于 2012-02-24T05:37:16.367 に答える
0

pで記述された関数を反転できる場合は、mFuncにx-pinverted(y)を含めることができます。おそらく、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よりも低い場合、どのような値を返しますか?常に解決策があるとは限りません。

于 2012-02-21T12:00:09.533 に答える