1

モデルのパラメーターを推定するためにpython のscipy.optimizeライブラリを使用しようとしましたが、これまでのところ成功していません。scipy.optimize.leastsqlevenberg-marquardt アルゴリズムを使用するものを使用しようとしました。残念ながら、初期パラメーターの推定値を最適に非常に近い値に設定したとしても、モデル関数の最小値を見つけることが常に失敗します。実際には、常に最初に推測されたパラメーターを返します。だから、私は何か間違ったことをしていると思います。私のモデルは単純な円ですが、物事をさらに単純にするために、半径のみが実際のパラメーターであり、データ内の円の中心は既知であり、ハードコーディングされています。データは、中心が 5.5、半径が 4 の円を持つ 10x10 ピクセルの float 画像です。実際、データは、私が当てはめようとしているモデルを使用して生成されています。したがって、完璧なフィット感が存在します。これが私のコードです:

import math
import numpy
import scipy.optimize

# ========================================================================

g_data_width = 10
g_data_height = 10
g_xo = 5.0
g_yo = 5.0

def evaluate_model01(x,y,r):
    x2 = x*x
    y2 = y*y
    r2 = r*r
    v = 0.0
    if(x2 + y2 <= r2):
        v = 20.0
    return v

def model01(params,data_o):
    data_r = numpy.zeros(g_data_height*g_data_width)
    r = params[0]
    for y in range(g_data_height):
        for x in range(g_data_width):
            xnew = x - g_xo
            ynew = y - g_yo
            data_r[y*g_data_width+x] = math.fabs(data_o[y,x]-evaluate_model01(xnew,ynew,r))
    return data_r

# ========================================================================

g_data_o = numpy.array([[ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
                        [ 0,  0,  0,  0,  0, 20,  0,  0,  0,  0],
                        [ 0,  0,  0, 20, 20, 20, 20, 20,  0,  0],
                        [ 0,  0, 20, 20, 20, 20, 20, 20, 20,  0],
                        [ 0,  0, 20, 20, 20, 20, 20, 20, 20,  0],
                        [ 0, 20, 20, 20, 20, 20, 20, 20, 20, 20],
                        [ 0,  0, 20, 20, 20, 20, 20, 20, 20,  0],
                        [ 0,  0, 20, 20, 20, 20, 20, 20, 20,  0],
                        [ 0,  0,  0, 20, 20, 20, 20, 20,  0,  0],
                        [ 0,  0,  0,  0,  0, 20,  0,  0,  0,  0]],dtype=numpy.float32)
g_params = numpy.array([8.0])
print(scipy.optimize.leastsq(model01,g_params,args=(g_data_o),full_output=1))

# ========================================================================

データの依存関係を取り除き、インストール済みの任意のマシンですぐにコードを実行できるようにするために、データをハードコーディングしましたscipy。私がよく理解していないのは、model01関数が返すはずのものです。ドキュメントによると、配列を返すことになっています。何の配列?私のコードでは、各データ ポイントの残差の配列を返す必要があると想定しました。あれは正しいですか?私のデータは画像であるため 2D 配列ですが、残差は残差の平坦化された 2D 配列です。それは大丈夫ですか?誰かが私が間違っていることを正確に教えてもらえますか? 誰かがコードを変更して修正できますか? scipy上で述べたように、コードはインストール済みのマシンですぐに実行できるはずnumpyです。達成したいことが不可能な場合scipy.optimize.leastsq、levenberg-marquardt アルゴリズムを使用してモデルに適合する他のライブラリを提案できますか?

4

1 に答える 1

1

を使用して特定の問題を解決できないことを残念に思いますleastsqleastsqは FORTRAN ライブラリのラップアラウンドであり、とアルゴリズムminipackを呼び出しMINPACKます。重要なのは、最小二乗目的関数のヤコビアンとヘッシアンに基づいていることです。次の理由により、ターゲット関数には滑らかな導関数がありません。lmdiflmder

if(x2 + y2 <= r2):
    v = 20.0

math.fabs(......)

であるため、leastsq常に初期開始パラメータが返されます。

fmin_powellPowell 法や Nelder-Meadなど、勾配/導関数を必要としない方法を使用するようにしてくださいfmin

あなたの中で何が起こっているかについてmodel101()width*height最初にg_data、 と呼ばれるのサイズの 1D 配列を作成しdata_rます。次に、反復処理を行い、要素ごとg_dataに計算し、その値を 1D 配列に入れます。最後に、 を返します。math.fabs(data_o[y,x]-evaluate_model01(xnew,ynew,r))data_rdate_r

あなたの解釈は正しいですmodel101()。2D データの平坦化された 1D 剰余配列を返します。

于 2013-10-01T16:02:23.727 に答える