数学の具体的な計算にMaximaを使って、数学もMaximaも同時に学んでしまいましょう。
今回はMaximaを使って統計学における最小二乗法をみてみたいと思います。
最小二乗法とは、複数のデータの組を適当な関数でフィッティングする方法のことです。
本記事では簡単のために1次関数によるフィッティングを例にとりたいと思います。
平均・分散・標準偏差
2つのデータからなる 組のデータ ()があるとき、
それぞれの成分の平均値は
で定義されます。例えば10組のデータ
に対しては:
kill(all)$ N:10$ xy:[[1,3],[2,2],[2,3],[3,4],[4,3],[4,5],[6,4],[6,6],[7,6],[8,8]]$ Avr_x:sum(xy[i][1],i,1,N)/N; Avr_y:sum(xy[i][2],i,1,N)/N;
より
と求まります。ファイルから読み込んだデータに本記事の解析を適用しているのが
以下の記事になります。本記事の続編として、あわせて読んでみてください:
分散は
で定義されます。データ例に対しては
Var_x:sum((xy[i][1]-Avr_x)^2,i,1,N)/N; Var_y:sum((xy[i][2]-Avr_y)^2,i,1,N)/N;
より
と計算されます。
標準偏差は分散の二乗根で定義されます:
データ例に対しては
sigma_x:sqrt(Var_x); sigma_y:sqrt(Var_y);
より
と求まります。
共分散・相関係数
共分散は
で定義されます。データ例に対しては
Cov:sum((xy[i][1]-Avr_x)*(xy[i][2]-Avr_y),i,1,N)/N;
より
と計算されます。
相関係数は
で定義されます。データ例に対しては
rho:Cov/(sigma_x*sigma_y); bfloat(rho);
より
と求まります。相関係数は1に近いほど確率変数は線形な関係になります。
フィッティング
フィッティングして得られる1次関数は
によって与えられます。なぜこのような係数になるかについては下で説明しています。
データ例に対しては
A:Cov/sigma_x^2; B:Avr_y-Cov*Avr_x/sigma_x^2;
より次の1次関数を得ます:
データ点と1次関数を
A:Cov/sigma_x^2; B:Avr_y-Cov*Avr_x/sigma_x^2; plot2d([ [discrete, xy], A*x+B], [x, 0,10], [style, points, lines],[color, red, blue], [point_type, asterisk],[legend, "data", "fitting"])$
によってプロットしたのが以下の図です:
最小二乗法(統計の言葉で)
さて、上で求めた1次関数は、1次関数とデータ点とのずれ
の二乗和
を最小化することによって求められたものです。
すなわち、最小化するための必要条件
を について解いて求められたものが上で与えた1次関数です。
実際、これらの条件から得られる に対する2元連立1次方程式
を例えば
solve([0=c+ax*ay-a*(vx+ax^2)-b*ax, 0=ay-a*ax-b],[a,b]);
によって解くことで
が得られます。これがフィッティングの式に使われていた係数です。
最小二乗法(行列の言葉で)
さて、ずれの二乗和を行列で表してみましょう:
ここで行列
を導入すると、ずれの二乗和が
と表せます。ここで一般に行列 に対して はその転置行列を表すものとします。
ずれの二乗和 を最小化する必要条件として、
の各成分についての偏微分係数がゼロになることを課すことにより
を得ます。これは以下のようにして示されます。まず
です。ここで
を使いました。ただし添字についてはアインシュタインの規約に従うものとします。
を について微分すると
です。さらに
より
したがって条件式
を得ます。
もし行列 が正則であればこの条件式を について解くことができます:
これによって の値を求めることができるというわけです。
データ例からこれらの行列を計算してみると
M:matrix([xy[1][1],1],[xy[2][1],1],[xy[3][1],1],[xy[4][1],1],[xy[5][1],1],[xy[6][1],1], [xy[7][1],1],[xy[8][1],1],[xy[9][1],1],[xy[10][1],1])$ Y:matrix([xy[1][2]],[xy[2][2]],[xy[3][2]],[xy[4][2]],[xy[5][2]],[xy[6][2]], [xy[7][2]],[xy[8][2]],[xy[9][2]],[xy[10][2]])$ invert(transpose(M).M).transpose(M).Y;
より
を得ます。これはもちろん、統計の言葉で表した場合に求めた結果と一致します。
Maximaでの行列の取り扱いについては過去の記事
を参考にしてみてください。