モデルのパラメーターを推定するためにpython のscipy.optimize
ライブラリを使用しようとしましたが、これまでのところ成功していません。scipy.optimize.leastsq
levenberg-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 アルゴリズムを使用してモデルに適合する他のライブラリを提案できますか?