ガウス・ニュートン法
では,問題の特殊構造を使うとよい場合がよくある.剰余関数
r (x)とその導関数であるヤコビ行列
J (x)を計算することで,時間と努力を節約することができる.ガウス・ニュートン法はこれを行う洗練された方法である.ガウス・ニュートン法は,2次形式として完全な2階のヘッセ行列を使う代りに,ステップ
pk が以下の公式
から計算されるように,式(
1)で
Bk = JkTJk を使う.ここで
Jk = J (xk)等となる.これは完全なヘッセ行列
JTJ +
rj
2rjの近似であることに注意のこと.
r=0の点が最小値となったり,
r が最小点近くの線形方程式のように変化したりする場合,剰余がゼロというが,この場合ヘッセ行列の近似はきわめてよく,「
ニュートン法」の2次収束がよく観察される.
目的関数は平方和であるが,極めて一般的である.実際に,
FindFitが
NormFunctionオプションのデフォルト値で用いられるときは,目的関数の形式をしている.ガウス・ニュートン法は,最小2乗の問題の点から見ることもできる.ガウス・ニュートンステップを解くことは線形最小2乗問題を解くことと同じなので,ガウス・ニュートン法を適用することは,実質的に非線形関数に線形の最小2乗フィットを適用することである.このように見てみると,このメソッドが
FindFitが行う非線形フィットのようなものに特に適しているのも理解できる.
いくつかのユーティリティ関数を含むパッケージをロードする. |
制約条件のない問題のパッケージを使って,狭い谷を持つ古典的Rosenbrock関数を設定する.
| Out[2]= |  |
|
Mathematica が,Rosenbrockの例のような明示的に平方和である問題,あるいはベクトルとそのべクトル自身の内積であるような関数に出会うと,自動的にガウス・ニュートン法が使われる.
次は,信頼領域ニュートンRosenbrock関数でガウス・ ニュートン法を使った FindMinimumが取るステップを示している.
| Out[3]= |  |
|
同じ例を「
ニュートン法」で行ったものと比べると,このガウス・ニュートン法の方がステップ数も評価回数も少ないのが分かる.これは,ガウス ・ニュートン法が問題の特殊構造を利用しているからである.最小値で剰余がゼロとなるので,最小値付近の収束率はニュートン法と同じくらいよい.
Levenberg-Marquardt法は「
信頼領域」刻み幅制御を使ったガウス・ニュートン法である(この方法が初めて提唱されたのは,一般的な信頼領域概念が開発される前である).このメソッドは
FindMinimumオプションの
Method→"LevenbergMarquardt"あるいは
Method→"GaussNewton"によって使うことができる.
時に関数を明示的に平方和,あるいはベクトルとそのべクトル自身の内積になるように表現するのが厄介なことがある.そのような場合には
"Residual"メソッドオプションを使って剰余を直接指定することもできる.同様に,剰余の導関数を
"Jacobian"メソッドオプションで指定することができる.
"Residual"メソッドオプションで剰余を指定した場合は,
FindMinimumの第1引数との整合性のチェックは行われない.返された値はオプションで与えられた値に依存する.
剰余の指定を使って,Rosenbrock関数の最小値を求める.
| Out[4]= |  |
|
| | |
| "Residual" | Automatic | f=1/2r.r となるように剰余r を直接指定することを許可する |
| "EvaluationMonitor" | Automatic | 剰余が評価されるたびに評価される式 |
| "Jacobian" | Automatic | 剰余の(行列)導関数の指定を許可する |
| "StepControl" | "TrustRegion" | "TrustRegion"でなければならないが,メソッドオプションを使ってパラメータの制御を変更することを許可する |
Method->"LevenbergMarquardt"のメソッドオプション
Mathematica で自然に平方和の問題を設定するための別の方法に,
FindFitを使うものがある.
ランダムな摂動が加わった関数が生成したデータである. |
| Out[7]= |  |
|
| Out[8]= |  |
|
この例では,
FindFitが内部的に剰余関数とヤコビ行列を形成している.これらはガウス・ニュートン法で平方和,あるいは非線形最小2乗フィットを求めるのに使われる.無論,
FindFitは他のメソッドで使うこともできるが,速く評価できる剰余関数が構築できるので,通常は他のメソッドを使うよりも速い.