4

scipy.optimize.leastsq を使用してステップ関数を適合させようとしています。次の例を検討してください。

import numpy as np
from scipy.optimize import leastsq

def fitfunc(p, x):
    y = np.zeros(x.shape)
    y[x < p[0]] = p[1]
    y[p[0] < x] = p[2]
    return y

errfunc = lambda p, x, y: fitfunc(p, x) - y # Distance to the target function

x = np.arange(1000)
y = np.random.random(1000)

y[x < 250.] -= 10

p0 = [500.,0.,0.]
p1, success = leastsq(errfunc, p0, args=(x, y))

print p1

パラメータは、ステップの位置と両側のレベルです。奇妙なのは、scipy を実行すると、最初の無料のパラメーターが変化しないことです。

[  5.00000000e+02  -4.49410173e+00   4.88624449e-01]

最初のパラメーターが 250 に設定され、2 番目のパラメーターが -10 に設定されたときに最適になる場合。

なぜこれが機能しないのか、どのように機能させるのかについて、誰かが洞察を持っていますか?

私が走れば

print np.sum(errfunc(p1, x, y)**2.)
print np.sum(errfunc([250.,-10.,0.], x, y)**2.)

私は見つけます:

12547.1054663
320.679545235

ここで、最初の数値は、leastsq が見つけたもので、2 番目の数値は、見つけるべき実際の最適関数の値です。

4

5 に答える 5

2

epsfcn =引数をleastsqに追加すると、フィッティングがはるかに優れていることがわかります。

p1, success = leastsq(errfunc, p0, args=(x, y), epsfcn=10.)

結果は

[ 248.00000146   -8.8273455     0.40818216]

私の基本的な理解は、残差の2乗に影響を与えるには、最初の自由パラメーターを隣接する点間の間隔よりも大きく移動する必要があるということです。epsfcnは、勾配を見つけるために使用するステップの大きさなどと関係があります。

于 2009-10-03T20:15:59.243 に答える
1

最小二乗フィッティングは、ステップの近似を考え出す方法ではないと思います。私はそれがあなたに不連続性の満足のいく説明を与えるとは思わない。この問題を攻撃するとき、最小二乗法は私の最初の考えではありません。

代わりにフーリエ級数近似を使用しないのはなぜですか?不連続性では常にギブズ現象に悩まされますが、関数の残りの部分は、あなたとあなたのCPUが余裕があるのと同様に近似することができます。

これを正確に何に使用しますか?いくつかのコンテキストが役立つ場合があります。

于 2009-10-03T20:25:57.650 に答える
1

ステップ関数の近似を提案します。「変化点」での無限の勾配の代わりに、1 x距離(例では1.0)にわたって線形にします。たとえば、関数のxパラメータxpがこの線の中点として定義されている場合、xp-0.5の値は低いy値であり、xp+0.5の値は高いy値と関数の中間値です。間隔[xp-0.5; xp + 0.5]は、これら2点間の線形補間です。

ステップ関数(またはその近似)が低い値から高い値に変化すると想定できる場合、最後の2つのパラメーターの初期推定値は、0.0とではなくそれぞれ最小のy値と最大のy値であると思います。 0.0。


2つの修正があります:

1)np.random.random()は、0.0から1.0の範囲の乱数を返します。したがって、平均は+0.5であり、3番目のパラメーターの値でもあります(0.0ではありません)。そして、2番目のパラメーターは-10.0ではなく-9.5(+0.5-10.0)になります。

したがって

print np.sum(errfunc([250.,-10.,0.], x, y)**2.)

する必要があります

print np.sum(errfunc([250.,-9.5,0.5], x, y)**2.)

2)元のfitfunc()では、xがp [0]と正確に等しい場合、yの1つの値は0.0になります。したがって、その場合はステップ関数ではありません(2つのステップ関数の合計のようなものです)。たとえば、これは最初のパラメータの開始値が500の場合に発生します。

于 2009-10-04T00:43:15.630 に答える
0

おそらく、最適化は極小値にとどまっています。lesssqが実際にどのように機能するかはわかりませんが、初期推定値(0、0、0)を指定すると、そこでもスタックします。

初期推定値の勾配を数値で確認でき(非常に小さいイプシロンについては+/-イプシロンで評価し、bei 2 *イプシロンを除算して差を取ります)、sthは0前後になると思います。

于 2009-10-03T19:53:35.067 に答える