バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia4-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
【再掲】シグモイド関数
太郎くん
差し替えるシグモイド関数の数式と波形はこんな感じ
\(
\displaystyle\varsigma=\frac{1}{1+e^{-ax}}=\frac{tanh(ax/2)+1}{2}
\)
フクさん
これを活性化関数とした形式ニューロンをScilabで実現する。
Scilabコード
フクさん
Scilabコードは以下
function y = sigmoid(x)
y = 1./(1 + exp(-x));
endfunction
function NeuronalBruteForceCustomLearningHeaviside()
// データセットの入力
X = [0 0; 0 1; 1 0; 1 1];
// データセットの出力
Y = [0; 0; 0; 1];
// パラメータの初期値
W = zeros(2, 1); // 重み
b = 0; // バイアス
num_epochs = 10000; // 学習のエポック数
learning_rate = 0.1; // 学習率
min_loss = %inf;
learning_range = 4;
n = length(Y);
// 重みの総当たり計算
best_w1 = 0;
best_w2 = 0;
best_b = 0;
for w1 = -learning_range:learning_rate:learning_range
for w2 = -learning_range:learning_rate:learning_range
for b = -learning_range:learning_rate:learning_range
// フォワードプロパゲーション
Z = X * [w1; w2] + b; // 重みとバイアスを使用して予測値を計算
A = sigmoid(Z); // シグモイド活性化関数を適用
// 損失の計算
loss = 1/n * sum((A - Y).^2); // 平均二乗誤差
// 最小損失の更新
if loss < min_loss
min_loss = loss;
best_w1 = w1;
best_w2 = w2;
best_b = b;
end
end
end
// ログの表示
printf('loss: %f\n', min_loss);
printf('weight: w1 = %f, w2 = %f\n', best_w1, best_w2);
printf('bias: b = %f\n', best_b);
end
// 最小コストの重みを更新
W = [best_w1; best_w2];
b = best_b;
// 学習結果の表示
printf('learning completed\n');
printf('weight: w1 = %f, w2 = %f\n', W(1), W(2));
printf('bias: b = %f\n', b);
// 出力結果確認
result = sigmoid(X*[W(1);W(2)]+b);
printf('X=');disp(X);
printf('hatY=');disp(result);
// 分類境界線のプロット
x1 = linspace(-0.5, 1.5, 100); // x1の値の範囲
x2 = -(W(1) * x1 + b) / W(2); // x2の計算
clf;
scatter(X(Y == 0, 1), X(Y == 0, 2), 'fill','markerFaceColor','r','markerEdgeColor','r');
scatter(X(Y == 1, 1), X(Y == 1, 2), 'fill','markerFaceColor','b','markerEdgeColor','b');
plot(x1, x2, 'k', 'LineWidth', 2);
p=gca();
p.data_bounds(:,1)=[-0.5;1.5];
p.data_bounds(:,2)=[-0.5;1.5];
title('Decision Boundary');
xlabel('x1');
ylabel('x2');
legend('Class 0', 'Class 1', 'Decision Boundary');
xgrid;
endfunction
NeuronalBruteForceCustomLearningHeaviside()
処理結果
フクさん
処理結果は以下。
weight: w1 = 2.700000, w2 = 2.700000
bias: b = -4.000000
X=
0. 0.
0. 1.
1. 0.
1. 1.
hatY=
0.0179862
0.2141650
0.2141650
0.8021839
まとめ
フクさん
まとめだよ。
- 活性化関数をシグモイド関数にした形式ニューロンをScilabで実現。
- 結果はカスタムヘヴィサイドの時と一緒。
バックナンバーはこちら。
Pythonで動かして学ぶ!あたらしい線形代数の教科書
https://amzn.to/3OE5bVp
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
https://amzn.to/3OBiaax
ゼロからはじめるPID制御
https://amzn.to/3SvzuyR
OpenCVによる画像処理入門
OpenCVによる画像処理入門 改訂第3版 (KS情報科学専門書)
◆◆3言語(C言語、C++、Python)対応で、「画像処理の基本」が身につくと、大好評のテキストの改訂版!◆◆ ・OpenCV4.5に対応し、さらにパワーアップ! ・基本アルゴリズムとサンプルプログラムが豊富で、いますぐできる! ・理論と...
恋する統計学[回帰分析入門(多変量解析1)] 恋する統計学[記述統計入門]
https://amzn.to/3STAe2i
Pythonによる制御工学入門
https://amzn.to/3uskuK5
理工系のための数学入門 ―微分方程式・ラプラス変換・フーリエ解析
https://amzn.to/3UAunQK
コメント