唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

Rで単純パーセプトロンを実装

研究室の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