MATLAB,Python,Scilab,Julia比較 第4章 その13【形式ニューロン⑪】

MATLAB,Python,Scilab,Julia比較 第4章 その13【形式ニューロン⑪】 数値計算
MATLAB,Python,Scilab,Julia比較 第4章 その13【形式ニューロン⑪】

バックナンバーはこちら。
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

【再掲】処理フロー

太郎くん
太郎くん

まずは処理フローを再掲。

  • 入力データセットの定義
  • 出力データセットの定義
  • パラメータ変数の定義(重み、バイアス)
  • 学習率定義
  • 重みとバイアスの総当たり計算(ループ)
    • 重みとバイアスを使用して予測値を算出
    • 損失の計算
    • 損失の更新
    • 最も損失が小さいパラメータの記憶
  • 学習結果の表示
  • 出力結果の確認
フクさん
フクさん

これをJuliaで実現する。

Juliaコード

フクさん
フクさん

Juliaコードは以下。

function heaviside(x)
    return x >= 0 ? 1 : 0
end

using PyPlot

function NeuronalBruteForceLearningHeaviside()
	# データセットの入力
	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, best_w2, best_b = 0, 0, 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 = heaviside.(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
	    # ログの表示
	    println("loss: $min_loss")
	    println("weight: w1 = $best_w1, w2 = $best_w2")
	    println("bias: b = $best_b")
	end

	# 最小コストの重みを更新
	W = [best_w1; best_w2]
	b = best_b

	# 学習結果の表示
	println("learning completed")
	println("weight: w1 = $(W[1]), w2 = $(W[2])")
	println("bias: b = $b")

	# 出力結果確認
	println("X=$(X)")
	result = heaviside.(X * [W[1]; W[2]] .+ b)
	println("hatY=$(result)")

	# 決定境界線のプロット
	x1 = range(-0.5, 1.5, length=100) # x1の値の範囲
	x2 = -(W[1] * x1 .+ b) / W[2] # x2の計算

	scatter(X[Y .== 0, 1], X[Y .== 0, 2], color="r", marker="o", label="Class 0")
	scatter(X[Y .== 1, 1], X[Y .== 1, 2], color="b", marker="o", label="Class 1")
	plot(x1, x2, color="k", linewidth=2)
	xlim([-0.5, 1.5])
	ylim([-0.5, 1.5])

	# グラフの装飾
	title("Decision Boundary")
	xlabel("x1")
	ylabel("x2")
	legend(["Class 0", "Class 1", "Decision Boundary"])
	grid(true)
	show()
end


NeuronalBruteForceLearningHeaviside()

処理結果

フクさん
フクさん

処理結果は以下。

形式ニューロンによる分類(Julia)、Class0、Class1、Decision Boundary
weight: w1 = 0.1, w2 = 0.1
bias: b = -0.2
X=[0 0; 0 1; 1 0; 1 1]
hatY=[0, 0, 0, 1]

考察

太郎くん
太郎くん

これも同じ結果だ。

太郎くん
太郎くん

そして、ほぼMATLABのコピペだな・・・。

フクさん
フクさん

そうした方が楽だしね。

太郎くん
太郎くん

先に理屈を固めてるから、
コードレベルでは差が少なくなると思えば良い事ではあるんだけど・・・。

まとめ

フクさん
フクさん

まとめだよ。

  • 形式ニューロンをJuliaで実現。
  • ANDの真理値表と同じ結果が得らえれた。
  • コードレベルでMATLABと近似。

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

コメント

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