1

私は次の関数に適合しようとしています:Detrended SNR enter image description here私のデータに。 C1、C2、hは、leastsqのメソッドから取得する必要のあるパラメータです。 C1とC2はシンプルですが、私のh(t)は実際にはFunction based on B-Splinesです。私が得たいのは、その関数内の係数hjです(私の場合、35種類のhjがあります)。この関数は、それぞれ異なる重み付けされた異なる基本Bスプラインの合計であり、係数の数はBスプラインのノット数に等しい。私はC1、C2を取得したいとh1..35として、私は次の操作を行います。パラメータを渡すのに最低限の問題Python

funcLine = lambda tpl, eix_x: (tpl[0]*np.sin((4*math.pi*np.sum(bsplines_evaluades * np.transpose([tpl[2],tpl[3],tpl[4],tpl[5],tpl[6],tpl[7],tpl[8],tpl[9],tpl[10],tpl[11],tpl[12],tpl[13],tpl[14],tpl[15],tpl[16],tpl[17],tpl[18],tpl[19],tpl[20],tpl[21],tpl[22],tpl[23],tpl[24],tpl[25],tpl[26],tpl[27],tpl[28],tpl[29],tpl[30],tpl[31],tpl[32],tpl[33],tpl[34],tpl[35],tpl[36],tpl[37]]) , axis=0))*eix_x/lambda1) + tpl[1]*np.cos((4*math.pi*np.sum(bsplines_evaluades * np.transpose([tpl[2],tpl[3],tpl[4],tpl[5],tpl[6],tpl[7],tpl[8],tpl[9],tpl[10],tpl[11],tpl[12],tpl[13],tpl[14],tpl[15],tpl[16],tpl[17],tpl[18],tpl[19],tpl[20],tpl[21],tpl[22],tpl[23],tpl[24],tpl[25],tpl[26],tpl[27],tpl[28],tpl[29],tpl[30],tpl[31],tpl[32],tpl[33],tpl[34],tpl[35],tpl[36],tpl[37]]) , axis=0))*eix_x/lambda1))*np.exp(-4*np.power(k, 2)*lambda_big*np.power(eix_x, 2)) 
func = funcLine 
ErrorFunc = lambda tpl, eix_x, ydata: np.power(func(tpl, eix_x) - ydata,2) 
tplFinal1, success = leastsq(ErrorFunc, [2, -2, 8.2*np.ones(35)], args=(eix_x, ydata)) 

TPL(0)= C1、TPL(1)= C2とTPL(2..35)=私の係数です。 bsplines_evaluadesは行列[35,86000]です。各行は各基本b-スプラインの時間関数です。したがって、各行に個々の係数を重み付けします.86000はeix_xの長さです。 ydata(eix_x)は、近づきたい関数です。 λ1= 0.1903; lambda_big = 2; k = 2 * pi/lambda1。出力は論理ではない初期パラメータと同じです。 誰でも助けてくれますか?私はカーブフィットでも試してみましたが、うまくいきません。 データはhttp://www.filedropper.com/data_5>http://www.filedropper.com/download_button.png width = 127 height = 145 border = 0 />
http://www.filedropperにあります。コム>オンライン・バックアップ・ストレージ

EDIT コードは今ある:

lambda1 = 0.1903 
k = 2 * math.pi/lambda1 
lambda_big = 2 
def funcLine(tpl, eix_x): 
    C1, C2, h = tpl[0], tpl(1), tpl[2:] 
    hsum = np.sum(bsplines_evaluades * h, axis=1) # weight each 
    theta = 4 * np.pi * np.array(hsum) * np.array(eix_x)/lambda1 
    return (C1*np.sin(theta)+C2*np.cos(theta))*np.exp(-4*lambda_big*(k*eix_x)**2) # lambda_big = 2 
if len(eix_x) != 0: 
    ErrorFunc = lambda tpl, eix_x, ydata: funcLine(tpl, eix_x) - ydata 
    param_values = 7.5 * np.ones(37) 
    param_values[0] = 2 
    param_values(1) = -2 
    tplFinal2, success = leastsq(ErrorFunc, param_values, args=(eix_x, ydata)) 

問題は、出力パラメータが初期のものに関しては変更しないということです。データ(X_AXIS、ydataの、bsplines_evaluades): gist.github.com/hect1995/dcd36a4237fe57791d996bd70e7a9fc7のgist.github.com/hect1995/39ae4768ebb32c27f1ddea97e24d96afのgist.github.com/hect1995/bddd02de567f8fcbedc752371b47ff71

答えて

0

それは提供するために、(自分自身だけでなく、私たちに)常に便利です実行可能になるのに十分な完全な読取り可能な例です。 lambdaと非常に長い行のあなたの例は間違いなく読みにくいので、簡単な間違いを逃すのはとても簡単です。 Pythonを使用するポイントの1つは、コードを読みやすくすることです。

適合係数としてスプライン係数を使用することはできますが、変数のnp.ndarrayを正確に1次元にしたいとします。したがって、パラメータ配列は

param_values = 8.2 * np.ones(37) 
param_values[0] = 2 
param_values[1] = -2. 
result_params, success = leastsq(errorFunc, param_values, ....) 

でなければなりません。また、curve_fit()を使用すると問題はありません。それを超えると、多くの助けを借りることは難しい。完全な実行可能プログラム(多くの用語を未定義にしておく)も、出力コードやエラーメッセージもコードを実行することはない。

+0

コメントをいただき、ありがとうございます。次回は、より説明してみます(この記事では、明確にするために編集を行います)。今の問題は、出力パラメータが変更されていないパラメータの初期値に影響しないことです。人々がそれを試すことができるように私が持っているデータ(テーブル)をどのように投稿することができますか? –

+0

あなたのコードはまだラムダを使用し、多くの未定義変数(k、lambda1、lambda_big、bsplines_evaluades)を持っています。それは誰かによって実行することはできません。それでも出力メッセージやエラーメッセージは投稿しませんでした。データを投稿するために、多くの人々がギブスの趣味や他の同様のサービスを使用します。 –

+0

でも、私はあなたのコードを読むことができます:もしbsplines_evaluadesが配列であれば、あなたのフィットは35個のパラメータの個々の値に大きく依存するのではなく、彼らは与えます。すなわち、あなたは実際に 'h'を使用していない、' hsum'のみを使用しています。それは意図的なのでしょうか?フィットの結果は、これらの値のほとんどにあまり敏感ではありません。 –

0

いくつかのものは、ここで間違っている可能性が:私は」 tpl配列を正しく索引付けしているかどうかわかりません(37個のエントリがある場合は、インデックスは0:36)。あなたのerrorFuncはおそらく平方残差ではなく残差を返すべきです。

最後に、私はあなたのh-sumが間違っているかもしれないと思います:あなたは$ N $軸で合計したいが、$ x $軸ではないのですか?あなたは次のようにあなたのコードを整理し、それが助け場合は表示される場合があります

(一部のデータなしで、それは自分自身をテストすることは困難です):

def funcLine(tpl, eix_x): 
    C1, C2, h = tpl[0], tpl[1], tpl[2:] 
    hsum = np.sum(bsplines_evaluades * h, axis=1) 
    theta = 4 * np.pi * hsum * eix_x/lambda1 
    return (C1 * np.sin(theta) + C2 * np.cos(theta)) * np.exp(-4 *lambda_big * 
       (k * eix_x)**2) 

errorFunc = lambda tpl, eix_x, ydata: funcLine(tpl, eix_x) - ydata 
tplFinal2, success = leastsq(errorFunc, [2, -2, 8.2*np.ones(35)], 
          args=(eix_x, ydata)) 
+0

あなたは正しいです0:36。私は私の質問でそれを変更することを忘れました。いったん私はすべての私の基本スプラインを持っていて、それぞれがそれによって乗算された私は、86000の配列を持つために私が注文するたびにすべての基本貢献を追加したい。私はあなたの言うことを試してみますが、それが重くなるにつれてデータを提供するのは難しいでしょうが、私は試してみます –

+0

データ:gist.github.com/hect1995/dcd36a4237fe57791d996bd70e7a9fc7 gist.github.com/hect1995/39ae4768ebb32c27f1ddea97e24d96af gist.github.com/hect1995/bddd02de567f8fcbedc752371b47ff71 –

関連する問題