2017-01-05 4 views
2

SciPyのドキュメントを読んで、Pythonで遊んで、私が話すことを実装できるかどうか確認しています。しかし、私は下のコードで何が起こっているのか分からないようです。SciPy(Python)の最小化関数はどのサイズの引数を受け入れますか?

https://docs.scipy.org/doc/scipy-0.18.1/reference/tutorial/optimize.html

>>> def rosen(x): 
...  """The Rosenbrock function""" 
...  return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0) 

>>> x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2]) 

>>> res = minimize(rosen, x0, method='nelder-mead', 
...    options={'xtol': 1e-8, 'disp': True}) 
Optimization terminated successfully. 
     Current function value: 0.000000 
     Iterations: 339 
     Function evaluations: 571 

>>> print(res.x) 
[ 1. 1. 1. 1. 1.] 

から、この場合のRosenbrock関数が第二変数の最初の変数およびサイズ-4アレイのサイズ-4配列を取っていると思われます。これは、x [1:]がx [: - 1]と同様に使用されるためです。

これで最終的に5つの結果の配列が得られますか?確かに、最小化関数は、(x [1:]とx [: - 1]からそれぞれ取られた)1対の値で4回だけ実行されますか?

また、2つの異なる配列に2つの変数の値を格納する方が理にかなっていませんか?

申し訳ありませんが、私はかなり明白な何かを失っていると前もって感謝します。

V

+0

"最初の変数"と "2番目の変数"とはどういう意味ですか? 'rosen'には1つの引数しか渡されません。その議論は、それ自身のビジネスです。 – BrenBarn

答えて

2

rosenは、sumほぼ任意の長さxを受け取り、単一の値を返すように書かれています。 x[1:]-x[:-1]のような表現は、連続する用語の違いだけを取ります。

minimizeは、それ自身がx0、1次元配列、ここでは5要素をとります。 rosenの合計が最小になるまで、すべての要素が変化します。つまり、ベクトル、つまり1次元配列を最小化します。 x0(2,)から別の長さを持つように見えます。

0

scipyのダウンロードによって実装ローゼンバーグ機能は

formula

頻繁に使用する機能はありませんが、generalized Rosenberg function

anotherように、むしろそうです。

高次元用。したがってx[1:]x[:-1]は2つの次元(x、y)にインデックスを作成せず、上記の関数を便利な方法で実装します。 hpauljの答えに

注:それは必ずしもが出力されます単一の値、1が1を一度に複数の入力ベクトルのためにそれを評価するために

from scipy.optimize import rosen 
points = np.array([[1, 1, 1, 1], [1, 2, 3, 4]]).T 
rosen(points) 

--> array([ 0., 2705.]) 

を行うことができよう。

関連する問題