|
3.8.2 曲線のフィット
与えられたデータセットに最も適した式を求めたいことがある.Mathematicaでこれを行う方法のひとつはFitを使うことである.

基礎的な線形フィット
素数の最初の20個の表である.
In[1]:= fp = Table[Prime[x], {x, 20}]
Out[1]= 
データをプロットする.
In[2]:= gp = ListPlot[ fp ]

Out[2]= 
素数データを1次曲線でフィットさせる.最適なフィットは関数 1と xの線形合成で得られる.
In[3]:= Fit[fp, {1, x}, x]
Out[3]= 
フィットをプロットする.
In[4]:= Plot[%, {x, 0, 20}]

Out[4]= 
もとのデータのグラフに重ね描きする.
In[5]:= Show[%, gp]

Out[5]= 
次に2次曲線でフィットさせる.
In[6]:= Fit[fp, {1, x, x^2}, x]
Out[6]= 
求まった2次曲線をプロットする.
In[7]:= Plot[%, {x, 0, 20}]

Out[7]= 
もとのデータに重ね合わせると,2次曲線の方が1次曲線よりよくフィットしていることが分かる.
In[8]:= Show[%, gp]

Out[8]= 

データ指定法
Fitは , , ... 形式のデータが与えられると連続する が連続する整数点1, 2, ... における関数の値に当たると仮定する.Fitには関数の任意の点における値に相当するデータを与えることもできる.次元は1次元でも多次元でもよい.

多変量フィット
, , の値の表を作成する. Fitで取り込めるように Flattenをデータに作用させ,平坦化しておく.
In[9]:= Flatten[ Table[ {x, y, 1 + 5x - x y}, {x, 0, 1, 0.4}, {y, 0, 1, 0.4} ], 1]
Out[9]= 
2変数の関数のフィットである.
In[10]:= Fit[ % , {1, x, y, x y}, {x, y} ]
Out[10]= 
Fitは関数のリストを取り,明確で効果的な手順でこれらの関数のどのような線形結合がデータの最高の最小二乗フィットを与えるかを求める.しかし,指定の関数の線形結合だけからなるのではない「非線形フィット」を求めたいこともあるだろう.その場合はFindFitを使うとよい.FindFitはいかなる形の関数でも取り,データに最適のフィットを与えるパラメータの値を求める.

データの一般的なフィットを求める
これは素数のリストを項の単純な線形結合にフィットする.
In[11]:= FindFit[fp, a + b x + c Exp[x], {a, b, c}, x]
Out[11]= 
結果はFitによるものと同じである.
In[12]:= Fit[fp, {1, x, Exp[x]}, x]
Out[12]= 
これはFitでは扱えない非線形形式をフィットする.
In[13]:= FindFit[fp, a x Log[b + c x], {a, b, c}, x]
Out[13]= 
デフォルトにより,FitとFindFitは両方とも「最小二乗」フィットを生み出す.これは を最小化すると定義することができる.ここで はオリジナルの各データ点とフィットした値の差分を与える残差である.これとは別のノルムに基づいたフィットを考えることもできる.オプションNormFunction -> uを設定するとFindFitはu[r]を最小にするフィットを求めようとする.ここでrは残差のリストである.デフォルトはNormFunction -> Normで最小二乗フィットに対応している.
ここでは というノルムを使っている.これはフィットとデータ間の最大距離を最小にする.結果は最小二乗とは多少異なる.
In[14]:= FindFit[fp, a x Log[b + c x], {a, b, c}, x, NormFunction -> (Norm[#, Infinity] &)]
Out[14]= 
FindFitは最適なフィットを与えるパラメータの値を求めるという形を取る.検索を始める点を指定しなければならないこともある.この指定は a,  , b,  , ... の形式でパラメータを与えることで行う.FindFitには検索方法をコントロールするためのたくさんのオプションがある.

FindFitのオプション
|