MATLAB,Python,Scilab,Julia比較 第4章 その71【単純パーセプトロンで分類⑦】

MATLAB,Python,Scilab,Julia比較 第4章 その71【単純パーセプトロンで分類⑦】 数値計算
MATLAB,Python,Scilab,Julia比較 第4章 その71【単純パーセプトロンで分類⑦】

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

はじめに

単純パーセプトロンで分類を行う。
今回はJuliaで実現。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラスト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

単純パーセプトロンで分類のプログラムのフロー【再掲】

太郎くん
太郎くん

単純パーセプトロンで分類するプログラムのフローを再掲。

  • データセットの定義
  • ハイパーパラメータの設定
    • 学習率
    • エポック数
  • パラメータの初期値、
  • シグモイド関数の導関数の定義
  • 順伝播
    • 誤差計測
  • 逆伝播
    • バイアスの逆伝播
    • 重みの逆伝播
  • パラメータの更新
  • 重みの変化の経緯をplot

重みとバイアスへの連鎖律への共通式

\(
\begin{eqnarray}
\displaystyle dZ&=&\frac{\partial E}{\partial A}\frac{\partial A}{\partial Z}=(A-Y)\cdot\sigma(Z)\{1-\sigma(Z)\}\cdot X\\
&=&
\Bigg(
\begin{bmatrix}
a_1\\a_2\\a_3\\a_4
\end{bmatrix}-
\begin{bmatrix}
0\\0\\0\\1
\end{bmatrix}
\Bigg)\circ
\sigma\Bigg(
\begin{bmatrix}
z_1\\z_2\\z_3\\z_4
\end{bmatrix}
\Bigg\{
1-\sigma\Bigg(
\begin{bmatrix}
z_1\\z_2\\z_3\\z_4
\end{bmatrix}
\Bigg)
\Bigg\}
\end{eqnarray}
\)

重みへの連鎖律

\(
\displaystyle\frac{\partial E}{\partial W}=dZ^TX=
\begin{bmatrix}
dz_1\\dz_2\\dz_3\\dz_4
\end{bmatrix}^T
\begin{bmatrix}
0&0\\
0&1\\
1&0\\
1&1\\
\end{bmatrix}
\)

バイアスの連鎖律

\(
\displaystyle\frac{\partial E}{\partial b}=\sum dZ=
\begin{bmatrix}
dz_1\\dz_2\\dz_3\\dz_4
\end{bmatrix}^T
\begin{bmatrix}
1\\1\\1\\1
\end{bmatrix}
\)

フクさん
フクさん

これをJuliaで実現する。

Juliaコード

フクさん
フクさん

Juliaコードは以下。

using PyPlot
using Statistics
using Printf

# データセットの定義
X = [0 0; 0 1; 1 0; 1 1]
Y = [0; 0; 0; 1]

# ハイパーパラメータの設定
learning_rate = 0.5 # 学習率の調整
num_epochs = 200 # エポック数の調整

# パラメータの初期値
W = randn(1, size(X, 2))
b = randn()

sigmoid(x) = 1 / (1 + exp(-x))
sigmoid_derivative(x) = sigmoid(x) * (1 - sigmoid(x))
loss = 0
for epoch = 1:num_epochs
    # 順伝播
    Z = X * W' .+ b
    A = sigmoid.(Z)

    # 誤差計測
    global loss = mean((A .- Y).^2)

    # 逆伝播
    dZ = (A .- Y) .* sigmoid_derivative.(Z)
    dW = dZ' * X
    db = sum(dZ)

    # パラメータの更新
    global W = W .- learning_rate .* dW
    global b = b .- learning_rate .* db
    
    if epoch == num_epochs
        println("W=")
        display(W)
        println("b=")
        display(b)
    end
end

scatter(X[Y .== 0, 1], X[Y .== 0, 2], facecolors="r")
scatter(X[Y .== 1, 1], X[Y .== 1, 2], facecolors="b")
x1 = [minimum(X[:, 1])-1, maximum(X[:, 1])+1]
x2 = -(W[1] .* x1 .+ b) ./ W[2]
plot(x1, x2, "k", linewidth=2)
xlim([-0.5, 1.5])
ylim([-0.5, 1.5])
title(@sprintf("Epoch: %d, Loss: %.4f", num_epochs, loss))
legend(["Class 0", "Class 1", "Decision Boundary"])
grid("on")
show()

処理結果

フクさん
フクさん

処理結果は以下。

単純パーセプトロンで分類(Julia)
W=
1×2 Matrix{Float64}:
 2.47971  2.48426
b=
-3.8525091650988266

まとめ

フクさん
フクさん

まとめだよ。

  • 単純パーセプトロンの分類をJuliaで実施。
    • 想定通り分類可能。
  • おおよそ200エポックあれば分類可能。

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

Pythonで動かして学ぶ!あたらしい線形代数の教科書

Amazon.co.jp

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

Amazon.co.jp

ゼロからはじめるPID制御

https://amzn.to/3SvzuyR

OpenCVによる画像処理入門

https://amzn.to/498ZUgK

恋する統計学[回帰分析入門(多変量解析1)] 恋する統計学[記述統計入門]

Amazon.co.jp

Pythonによる制御工学入門

Amazon.co.jp

理工系のための数学入門 ―微分方程式・ラプラス変換・フーリエ解析

https://amzn.to/3UAunQK

コメント

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