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使ってちゃんと作りましょう。そのうち。