研究室のPython勉強会で単純パーセプトロンを実装してたので,Rの便利さを布教するためについカッとなって書いてみた.
Rだと内積が使えるから実装が簡単です.
forやwhileをできるだけ避けるように書いてみたのですが,永続付値とどっちがコストが大きいんですかね?
Rを書いてる人が周りにいないので変な書き方をしている可能性は否めない…….
MaxIter <- 1000 Rate <- 0.1 weight <- c(0, 0, 0) trainData <- cbind(read.table("perceptron.txt"), -1) numData <- dim(trainData)[1] Predict <- function(x) { round(x %*% weight, 5) >= 0 } Learn <- function(x){ output <- Predict(x[-1]) teacher <- x[1] result <- output != teacher if(result) { weight <<- weight + Rate * (teacher - output) * x[-1] } result } for(iter in 1:MaxIter) { err <- sum(apply(trainData, 1, Learn)) cat("Iter", iter, ": Error = ", err, " / ", numData, "\n") if(err == 0) { break; } }
perceptron.txt は以下のような感じで,一番左の列が教師(0, 1).
いわゆるOR(論理積)ですね.
0 0 0 1 0 1 1 1 0 1 1 1
出力は以下のようになります.
Iter 1 : Error = 2 / 4 Iter 2 : Error = 2 / 4 Iter 3 : Error = 1 / 4 Iter 4 : Error = 0 / 4