コンピュータはオー・ヘンリーとエドガー・アラン・ポーの文章を見分けられるか?(機械学習/パーセプトロン)

サイボウズ・ラボの中谷です。

以前は nakatani @ cybozu labs でブログを書いていましたが、この "Cybozu Development Inside Out" で書かせていただくことになりました。
よろしくお願いします。
そして初回の記事は、なんと前回の続きです(ごめんなさい)。

前回記事「Perceptron を手で計算して理解してみる」では、オンライン機械学習の手法の一つ、パーセプトロンを紙と鉛筆で計算してみましたので、今回はそれを実装してみましょうというお話です。
ソースは github においています。

http://github.com/shuyo/iir/tree/master

Perceptron

実装は簡単。手で計算した後なら、空で実装できてしまいます。
学習対象は前回と同じ AND 演算とし、データもコード内に記述しちゃいましょう。

traindata = [ # AND [[0, 0], -1], [[1, 0], -1], [[0, 1], -1], [[1, 1], +1], ]

degree = traindata[0][0].size + 1
w = Array.new(degree, 0)

20.times do |c|
# shuffle
traindata = traindata.sort_by{rand}

# training
n_errors = 0
traindata.each do |x, t|
px = [1] + x # phai(x)
s = 0 # sigma w^T phai(x_n)
px.each_with_index do |x_i, i|
s += w[i] * x_i
end
if s * t <= 0 # error
puts [c+1, w, px, s, t].inspect
n_errors += 1
px.each_with_index do |x_i, i|
w[i] += t * x_i
end
end
end

if n_errors == 0
puts "convergence: #{c}"
break
end
end

puts "w= #{w.inspect}"

これで省略なし、ちゃんと動作するコード全体です。
やっぱり簡単すぎて、本当にこれで学習できるの……? な気分になります。

実行結果。

$ ./percep_test.rb [1, [0, 0, 0], [1, 0, 0], 0, -1] [1, [-1, 0, 0], [1, 1, 1], -1, 1] [1, [0, 1, 1], [1, 0, 1], 1, -1] [2, [-1, 1, 0], [1, 1, 1], 0, 1] [2, [0, 2, 1], [1, 1, 0], 2, -1] [2, [-1, 1, 1], [1, 0, 1], 0, -1] [3, [-2, 1, 0], [1, 1, 1], -1, 1] [4, [-1, 2, 1], [1, 1, 0], 1, -1] [4, [-2, 1, 1], [1, 1, 1],

2009/05/29 18:18



コメント

コメントを見る (0)

コメントを投稿

* コメントは記事の投稿者が承認するまで表示されません。