MATLAB,Python,Scilab,Julia比較 第2章 その60【重回帰分析④】

MATLAB,Python,Scilab,Julia比較 第2章 その60【重回帰分析④】 数値計算
MATLAB,Python,Scilab,Julia比較 第2章 その60【重回帰分析④】

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

はじめに

正規方程式を用いた、重回帰分析について。
今回は、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

正規方程式、各パラメータ、推定対象の多項式再掲

太郎くん
太郎くん

恒例の正規方程式、各パラメータ、推定対象の多項式の再掲。

正規方程式

\(
x=(A^TA)^{-1}A^Tb
\)

重回帰分析に於ける各パラメータ

\(
A=
\begin{bmatrix}
x_1 & y_1 & 1\\
x_2 & y_2 & 1\\
\vdots & \vdots & \vdots\\
x_n & y_n & 1\\
\end{bmatrix},
\vec{x}=
\begin{bmatrix}
\alpha\\
\beta\\
\gamma
\end{bmatrix},
\vec{b}=
\begin{bmatrix}
z_1\\
z_2\\
\vdots\\
z_n
\end{bmatrix}
\)

推定対象の多項式

\(
z=3x-2y+5
\)

フクさん
フクさん

今回は、これをScilabを使用して解く。

Scilabコード

フクさん
フクさん

Scilabコードは以下になる。

n = 100;

x = rand(1, n);
y = rand(1, n);
z = 3*x-2*y+5+rand(1, n)*2-1;

A=[x',y', ones(length(x),1)];
b=z';
X=(A'*A)^-1 *A'*b;
disp(X);

scatter3d(x, y ,z);
xp=linspace(0, 1, 5);
yp=linspace(0, 1, 5);

[xpm,ypm]=meshgrid(xp,yp);
mesh( xp, yp, X(1)*xpm+X(2)*ypm+X(3));

処理結果

フクさん
フクさん

そして処理結果。

正規方程式で重回帰分析(Scilab)、グラフィック・ウインドウ番号 0
   2.7241341
  -1.9040818
   5.0969239

考察

太郎くん
太郎くん

ScilabもOKそうだね。

太郎くん
太郎くん

MATLABとほぼ一緒みたいだけど、
3D散布図がscatter3じゃなくてscatter3dになってるくらいか。

フクさん
フクさん

ここらへんはScilabのVersionで大きく異なる部分だな。

太郎くん
太郎くん

そうなの?

フクさん
フクさん

v5.5.2ではそもそも3D散布図を表現する手段がない。
v6以降からscatter3というMATLABと同じ関数が登場しているが、
v6.1.1以降では、今回使用したscatter3dを利用することが推奨されている。

太郎くん
太郎くん

なんで、そんなややこしいことに…。

フクさん
フクさん

ここらへんの経緯は調べてみたがよくわらない。
まぁ、どっちにしても注意が必要だな。

まとめ

フクさん
フクさん

まとめだよ。

  • 正規方程式による重回帰分析をScilabで実施。
  • 誤差はあるものの目的の係数の算出はできている。
  • 3Dグラフの散布図はscatter3d。
    • 3D散布図はVersionによっては表現できなかったり関数名が違ったりするので注意が必要。

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

コメント

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