機械学習系のアルゴリズムは, immutableなClojure向きではないような気もしますが, 単純パーセプトロンなら, 大量の配列のupdateの作業がないので, 大丈夫でした.
参考文献は, 以下のブログ中のスライド.
単純パーセプトロンをPythonで組んでみる - 銀座で働くデータサイエンティストのブログ
単純パーセプトロンは, 線形分離可能な分類問題において, 識別関数を求めるアルゴリズムです.
求める分離関数を g(x) = w . x + bとすると, アルゴリズムとしては(参考文献のスライドにもありますが),
R = maxi(||xi||)
repeat
modified? ← false for i = 0 to (サンプルの総数) - 1 do
if (labeli * (w . xi) + b < 0) then
modified? ← true
w ← w + ((学習係数) * labeli) xi
b ← b + (学習係数) * labeli * R
end if
end for
until (not modified? or ループ上限に達する.)
xi : i番目のサンプル(教師データ)を表すベクトル(2次元なら(x, y)など)
labeli : i番目のサンプルのラベル(どちらのクラスタに属するか, -1 or 1)
(学習係数) : 1未満の値
で良いようです.
(2014/11/20 : modified?と終了判定が間違っていたので修正)
ソースコードは以下のようになりました.(incanterを使ってます.)
というわけで, 実行してみると, 以下のようになりました.
modified? ← true
w ← w + ((学習係数) * labeli) xi
b ← b + (学習係数) * labeli * R
end if
end for
until (not modified? or ループ上限に達する.)
xi : i番目のサンプル(教師データ)を表すベクトル(2次元なら(x, y)など)
labeli : i番目のサンプルのラベル(どちらのクラスタに属するか, -1 or 1)
(学習係数) : 1未満の値
で良いようです.
(2014/11/20 : modified?と終了判定が間違っていたので修正)