MATLAB,Python,Scilab,Julia比較 第2章 その26【最小二乗法㉕】

MATLAB,Python,Scilab,Julia比較 第2章 その26【最小二乗法㉕】 数値計算
MATLAB,Python,Scilab,Julia比較 第2章 その26【最小二乗法㉕】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia2-backnumber/

はじめに

平均、分散、共分散を用いた1次関数最小二乗法の係数算出について。
Scilabを使用して算出してみる。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

技術者太郎

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

数式再掲

太郎くん
太郎くん

今回はScilabだね。
恒例の数式再掲。

\(
\begin{eqnarray}
a&=&\frac{\sigma_{xy}}{\sigma_x^2}\\
b&=&\bar{y}-a\bar{x}
\end{eqnarray}
\)

Scilabコード

フクさん
フクさん

Scilabコードは以下になる。

x=[0.51, 0.76, 1.06, 1.41, 1.75, 1.9, 2.01, 2.15, 2.27, 2.4, 2.49, 2.59, 2.67, 2.76, 2.83, 2.89, 2.95, 3.01, 3.05, 3.11, 3.15, 3.19, 3.23, 3.28, 3.31, 3.34, 3.38, 3.4, 3.43, 3.46, 3.49, 3.51];
y=[10, 11, 12, 13, 14, 14.5, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40];
    
// 共分散利用
C=cov(x',y',1);
disp('共分散行列')
disp(C);
disp('分散');
printf('xの分散=%f\n',mtlb_var(x',1));
printf('yの分散=%f\n',mtlb_var(x',1));

// 1次関数最小二乗法
a=C(1,2)/mtlb_var(x',1);
b=mean(y)-a*mean(x);
printf('各係数 %.15f,%.15f\n',a,b);

xp = linspace(0, 4, 400);	// 同定した1次関数のx軸を生成
plot(x, y, '+', xp, a*xp+b, '-' );
p=gca();
p.tight_limits(:)="on"
p.data_bounds(:,2)=[10;41];
p.data_bounds(:,1)=[0;4];

実行結果

フクさん
フクさん

以下が実行結果。

平均分散共分散による1次関数最小二乗法Scilab、グラフィック・ウインドウ番号0
 共分散行列   
 
    0.6615902    6.703916   
    6.703916     80.837646  
 
 分散   
xの分散=0.661590
yの分散=0.661590
各係数 10.133033511230931,-2.161664366928406

考察

太郎くん
太郎くん

基本的にはMATLABと一緒のように見えるけど、
x,yを転置してからcov関数とかに渡してるね。

フクさん
フクさん

scilabの場合、列ベクトルとして渡されることを想定しているようで、
その都合で転置している。
そして、分散取得用の関数にvarianceというのがあるのだが、
これがどうも不偏分散しか返さないようだ。

太郎くん
太郎くん

え゛?どうするの??

フクさん
フクさん

代わりの関数としてmtlb_varというのもを使用している。
MATLABのvar関数をエミュレートする関数みたいだな。

太郎くん
太郎くん

随分妙なことになってるなー。

太郎くん
太郎くん

でも、分散共分散行列の配置はMATLAB、Python(Numpy)と一緒か。

\(
\begin{bmatrix}
xの分散 && xyの共分散\\
yxの共分散 && yの分散
\end{bmatrix}
\)

まとめ

フクさん
フクさん

まとめだよ。

  • 平均分散共分散を使用した一次関数最小二乗法をScilabで記載。
    • covとmtlb_varを使用する。
    • 分散取得用の関数にvarianceは不偏分散しか返さない。
  • covは共分散だけでなく、分散共分散行列が取得される。
    • よって、covだけでも分散は取得可能。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました