juliaで単純パーセプトロンをライブラリを使わずに実装(を多少きれいに)
juliaで単純パーセプトロンを実装した例が僕の日本語ググり力では見つからなかったので、 こちらに多少きれいにまとめておく。
julia初心者過ぎてclassとかの作り方が不明(moduleをどうやら使うらしい)なので、 関数のみ!関数、バンザイ…!only function! no more module!
simple perceptron on julia
#必要なライブラリ(CSVとStatsBaseの干渉には参った…) using CSV using StatsBase import Base: * , > # ステップ関数 function fn_step(x) return 1 * (x > 0) end # 予測 function fn_predict(x,w,b) return fn_step(w' * x +b) end #学習 function fn_fit(x::Array,y::Array,learning_rate = 0.01,w=true,b=true) local dim = size(x)[2] local N = size(y)[1] local epoch_counter = 0 # weigth initialize if w w = ((rand(dim) - ones(dim)/2) * 2) end # bias initialize if b b = (rand(1)[1]-0.5) * 2 end while true epoch_counter += 1 local fin_flag = true local learning_order = sample(1:N,N,replace=false) for i in learning_order delta_w = learning_rate * (y[i] - fn_predict(w,x[i,:],b)) * x[i,:] delta_b = learning_rate * (y[i] - fn_predict(w,x[i,:],b)) w += delta_w b += delta_b fin_flag *= (delta_w == zeros(dim)) * (delta_b == 0) end if fin_flag return w,b,epoch_counter break end end end
以外とシンプル(?)に書けました。
あとは、こんな感じで書けば使えます。
# train_xは二次元の表で横方向にデータ種、縦方向にデータ量 train_x = convert(Array,CSV.read("train_x.csv", header=false, delim=',')) # train_yは1,0ラベルのみの一次元配列 train_y = convert(Array,CSV.read("train_y.csv", header=false, delim=',')) # 学習 # weight,bias,epoch回数を返す w,b,e = fn_fit(train_x,train_y) # 予測 # 予測結果を返す predict = fn_predict(train_x[1,:],x,b)
毎回関数にw,bを乗っけるのはアホやな…。 module使ってちゃんと作りましょう。そのうち。