numseq = ['0012000', '0112000', '0212000', '0312000', '1012000', '1112000', '1212000', '1312000', '2012000', '2112000', '2212000', '2312000', '3012000', '3112000', '3212000', '3312000', '0002000', '0022000', '0032000', '1002000', '1022000', '1032000', '2002000', '2022000', '2032000', '3002000', '3022000', '3032000', '0010000', '0011000', '0013000', '1010000', '1011000', '1013000', '2010000', '2011000', '2013000', '3010000', '3011000', '3013000', '0012100', '0012200', '0012300', '1012100', '1012200', '1012300', '2012100', '2012200', '2012300', '3012100']
prob = [-0.66474525640568083, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.78361598908750163, -0.66474525640568083, -0.66474525640568083, -0.66474525640568083, -0.66474525640568083, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.66474525640568083, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.66474525640568083, -0.66474525640568083, -0.66474525640568083, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.66474525640568083, -0.66474525640568083, -0.66474525640568083, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.66474525640568083, -0.66474525640568083, -0.66474525640568083, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212]
numseq
とprob
は、それぞれ長さが 50 のリストです。それらは収集された実験データです。numseq
X 軸の値にprob
対応し、Y 軸の値に対応します。
最小化したい機能は次のとおりです。
def residue(allparams, xdata, ydata):
chi2 = 0.0
for i in range(0,len(xdata)):
x = xdata[i]
y = 0
for j in range(len(x)):
y = y-allparams[int(x[j])][j]
chi2 = chi2 + (ydata[i]-y)**2
return chi2
そう:
allparams
最適化するすべてのパラメーターを含む 4 × 7 行列です。xdata
は X 軸の値、つまりnumseq
ydata
単なる数字のリストです。prob
chi2
は、実験値とモデル値の差の 2 乗です。これは最小限に抑える必要があります。
パラメーターの初期推定値は次のように与えられます。
x0 = [[-0.6, -0.6, -0.6, -0.6, -0.6, -0.6, -0.6], [-0.6, -0.6, -0.6, -0.6, -0.6, -0.6, -0.6], [-0.6, -0.6, -0.6, -0.6, -0.6, -0.6, -0.6], [-0.6, -0.6, -0.6, -0.6, -0.6, -0.6, -0.6]]
fmin
では、この関数を呼び出すにはどうすればよいでしょうか。私は試した
fmin(residue, x0, args=(numseq, prob))
しかし、私はエラーが発生し続けます:
Traceback (most recent call last):
File "<pyshell#362>", line 1, in <module>
fmin(residue, x0, args=(numseq, prob))
File "C:\Python31\lib\site-packages\scipy\optimize\optimize.py", line 258, in fmin
fsim[0] = func(x0)
File "C:\Python31\lib\site-packages\scipy\optimize\optimize.py", line 177, in function_wrapper
return function(x, *args)
File "<pyshell#361>", line 7, in residue
y = y-allparams[int(x[j])][j]
IndexError: invalid index to scalar variable.
これはなぜですか?fmin
2D 配列を最初の推測として受け入れることができないためですか? 次に、1D 配列のパラメーターで動作するようにコード全体を変更する必要がありますか?
この問題を説明できなくても、少なくともfmin
モジュールがどのように機能するかを正確に教えていただけますか? fmin
つまり、 N 次元配列の最適化を実装する方法の構文は? とは何か説明していただけますargs()
か?私は最適化が初めてで、それを実装する方法がわかりません:(