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.

Reply via email to