MATLAB、Python、Scilab、Julia比較ページはこちら
https://www.simulationroom999.com/blog/comparison-of-matlab-python-scilab/
はじめに
の、
MATLAB,Python,Scilab,Julia比較 第4章 その18【決定境界直線の安定化⑤】
を書き直したもの。
形式ニューロンの決定境界直線がギリギリのところにある問題の対策としてカスタムヘヴィサイド(造語)を使用したプログラムを作成。
今回はPython(NumPy)。
【再掲】カスタムヘヴィサイド(造語)
まずは、カスタムヘヴィサイド関数の再掲。
\(
\begin{cases}
y=0&(x\le -2.5) \\
y=1&(2.5\le x) \\
y=2x+0.5&(-2.5\lt x \lt 2.5)
\end{cases}
\)
今回はこれを活性化関数とした形式ニューロンをPython(NumPy)で実現する。
Pythonコード
Pythonコードは以下。
import numpy as np
import matplotlib.pyplot as plt
def custom_heaviside(x):
return (x < -0.25) * 0 + (np.logical_and(x >= -0.25, x <= 0.25)) * (2 * x + 0.5) + (x > 0.25) * 1
# データセットの入力
X = np.array([[0, 0], [0, 1.0], [1.0, 0], [1.0, 1.0]])
# データセットの出力
Y = np.array([0, 0, 0, 1])
# パラメータの初期値
W = np.zeros((2, 1)) # 重み
b = 0 # バイアス
num_epochs = 10000 # 学習のエポック数
learning_rate = 0.1 # 学習率
min_loss = float('inf')
learning_range = 4
n = len(Y)
# 重みの総当たり計算
for w1 in np.arange(-learning_range, learning_range + learning_rate, learning_rate):
for w2 in np.arange(-learning_range, learning_range + learning_rate, learning_rate):
for b in np.arange(-learning_range, learning_range + learning_rate, learning_rate):
# フォワードプロパゲーション
Z = np.dot(X, np.array([[w1], [w2]])) + b # 重みとバイアスを使用して予測値を計算
A = custom_heaviside(Z) # ヘヴィサイド活性化関数を適用
# 損失の計算
loss = (1/n) * np.sum((A - Y.reshape(-1,1))**2) # 平均二乗誤差
# 最小損失の更新
if loss < min_loss:
min_loss = loss
best_w1 = w1
best_w2 = w2
best_b = b
# ログの表示
print(f'loss: {min_loss}')
print(f'weight: w1 = {best_w1}, w2 = {best_w2}')
print(f'bias: b = {best_b}')
# 最小コストの重みを更新
W = np.array([[best_w1], [best_w2]])
b = best_b
# 学習結果の表示
print('learning completed')
print(f'weight: w1 = {W[0]}, w2 = {W[1]}')
print(f'bias: b = {b}')
# 出力結果確認
print(f'X={X}')
result = custom_heaviside(np.dot(X, W) + b)
print(f'hatY={result}')
# 分類境界線のプロット
x1 = np.linspace(-0.5, 1.5, 100) # x1の値の範囲
x2 = -(W[0] * x1 + b) / W[1] # x2の計算
plt.figure()
plt.scatter(X[Y == 0, 0], X[Y == 0, 1], c='r', label='Class 0', marker='o')
plt.scatter(X[Y == 1, 0], X[Y == 1, 1], c='b', label='Class 1', marker='o')
plt.plot(x1, x2, 'k', linewidth=2)
plt.xlim([-0.5, 1.5])
plt.ylim([-0.5, 1.5])
plt.title('Decision Boundary')
plt.legend()
plt.grid()
plt.show()
処理結果
処理結果は以下。
weight: w1 = [0.6], w2 = [0.6]
bias: b = -0.8999999999999972
X=[[0. 0.]
[0. 1.]
[1. 0.]
[1. 1.]]
hatY=[[0.]
[0.]
[0.]
[1.]]
考察
PythonもOK。
バイアスが少しMATLABと違うが、
毎度おなじみの表示上の誤差。
演算誤差の入り方が異なる面もあるかもしれないが、
このレベルは表示上の誤差だと思う。
まとめ
- 形式ニューロンの活性化関数をカスタムヘヴィサイド(造語)関数にしたものをPython(NumPy)で作成。
- おおよそMATLABと同じ結果に。
- 毎度おなじみの表示上の誤差は出る。
MATLAB、Python、Scilab、Julia比較ページはこちら
Pythonで動かして学ぶ!あたらしい線形代数の教科書
Amazon.co.jp
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
Amazon.co.jp
ゼロからはじめるPID制御
https://amzn.to/3SvzuyR
恋する統計学[回帰分析入門(多変量解析1)] 恋する統計学[記述統計入門]
Amazon.co.jp
OpenCVによる画像処理入門
https://amzn.to/498ZUgK
Pythonによる制御工学入門
Amazon.co.jp
理工系のための数学入門 ―微分方程式・ラプラス変換・フーリエ解析
https://amzn.to/3UAunQK
コメント