Hi,
On Jul 23, 2009, at 7:30 PM, Lars Bishop wrote:
Dear experts,
I'm new in R and trying to learn by writing a version of the
Perceptron
Algorithm. How can I tell in the code below to stop the iteration
when the
condition in the "for loop" is not satisfied for all training
examples?
Thanks in advance for your help!
## Generate a linearly separable data set in R2
sample <- as.data.frame(cbind(runif(n=100),runif(n=100)))
sample$Y <- ifelse(sample$V1>sample$V2,1,-1)
## Plot data;
attach(sample)
plot(V1, V2, type="p", pch=Y,main="Sample Data")
##Perceptron algorithm
sample_m <- as.matrix(sample)
w <- c(0,0); b <- 0; k <- 0; nu <- 1e-3
R <- max(sqrt(V1^2+V2^2))
repeat {
for (i in 1:nrow(sample_m)){
if (sample_m[i,3]*(t(w)%*%sample_m[i,1:2] + b) <= 0)
w <- w + nu*sample_m[i,3]*sample_m[i,1:2]
b <- b +nu*sample_m[i,3]*R^2
k <- k+1
cat(k, w, b, "\n") }
}
One thing to realize is that by using a variable named "sample",
you're trampling over the "sample" function ... just don't trip over
that later in your R career :-)
I whipped up two version of your repeat block (I'm using while
instead, though). One uses the inner for loop like you have, the
second one is doing the same thing but w/ no for loops:
set.seed(123)
examples <- as.data.frame(cbind(runif(n=100),runif(n=100)))
examples$Y <- ifelse(examples$V1 > examples$V2, 1, -1)
examples <- as.matrix(examples)
# plot(examples[,1], examples[,2], type="p", pch=examples[,3],
main="Sample Data")
b <- 0; k <- 0; nu <- 1e-3;
R <- max(sqrt(examples[,1]^2 + examples[,2]^2))
w <- matrix(0, nrow=2, ncol=1)
misclassified <- examples[,3] * (examples[,1:2] %*% w) <= 0
while (any(misclassified)) {
for (i in which(misclassified)) {
w <- w + nu * examples[i,3] * examples[i,1:2]
b <- b + nu * examples[i,3]*R^2
k <- k + 1
cat(k, w, b, "\n")
}
misclassified <- examples[,3] * (examples[,1:2] %*% w) <= 0
}
## Here's the while loop w/o for loops
misclassified <- examples[,3] * (examples[,1:2] %*% w) <= 0
while (any(misclassified)) {
w <- w + colSums(nu * examples[misclassified,3] *
examples[misclassified,1:2])
b <- b + sum(nu * examples[misclassified,3] * R^2)
k <- k + 1
cat(k, w, b, "\n")
misclassified <- examples[,3] * (examples[,1:2] %*% w) <= 0
}
HTH,
-steve
--
Steve Lianoglou
Graduate Student: Physiology, Biophysics and Systems Biology
Weill Medical College of Cornell University
Contact Info: http://cbio.mskcc.org/~lianos
______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.