第3回 MATLAB seminar 2021年06月22日
最終更新:2020/06/24
教科書
MATLAB/Scilabで理解する数値計算 の50ページくらいまでの基礎文法をもう一度復習した. とくに, ブーリアンが便利であることを強調した. 例えば, 条件にあう要素をとってきたり, 数えたりできる.
for, if文の練習
簡単な構文で, for, if文を練習した. 標準正規分布からサンプルを $n$ 個取り, 0.5を超えた回数を数えることで, 標準正規分布に従う確率変数が0.5を超える確率を計算した. その値を分布表と比較して, $n$ が増えると精度が高くなることを確認した.
nTry = 1000; % サンプルの個数 count = 0; for I = 1:nTry n = randn(1); % 乱数を発生させる. if n > 0.5 count = count + 1; end end count/nTry % 0.5をこえた割合を計算
正規方程式
前回, 最小自乗法の基礎となる正規方程式を紹介し, 1次, 2次多項式によるフィッティングを行った. $$ \large{ \boldsymbol{p} = (\boldsymbol{X}^{\mathrm{T}}\boldsymbol{X})^{-1}\boldsymbol{X}^{\mathrm{T}}\boldsymbol{y}, } $$ $$ \large{ \boldsymbol{X} = \begin{pmatrix} 1 & x_{1}^{\,} & x_{1}^{2} & \ldots & x_{1}^{d} \\ 1 & x_{2}^{\,} & x_{2}^{2} & \ldots & x_{2}^{d} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & x_{n}^{\,} & x_{n}^{2} & \ldots & x_{n}^{d} \end{pmatrix}. } $$ ここで,
- $\boldsymbol{x}$:説明変数 ( データ )
- $\boldsymbol{y}$:目的変数 ( データ )
- $n$:データの次元 ( 個数, 今回は50個 )
- $d$:フィッティングしたい多項式の次数, $d$ 次多項式
- $p$:$d$ 次多項式の係数. 切片含めると, $p+1$ ベクトルとなる.
今回は, これを函数にした.
つまり, データセット $\boldsymbol{x}$, $\boldsymbol{y}$, 多項式の次数を渡せば, 係数 $p$ を計算してくれる函数を作った.
さらに, フィッティングの結果を図示させる機能を加えた ( doPlot
には, true
かfalse
を入れる ) .
うまく行列を使うことで, コードが短くなることを確認した. 特に, 10行目など.
function [p] = myMle(x, y, deg, doPlot) X = x .^ (0:deg); p = inv(X'*X)*X'*y; % invは使わないほうがいい if doPlot minX = min(x); maxX = max(x); x_fit = linspace(minX-abs(minX/10), maxX+abs(maxX/10), 100)'; y_fit = (x_fit .^ (0:deg)) * p; scatter(x, y); hold on plot(x_fit, y_fit); hold off end end
データ
セミナーで使ったデータはここをクリック.