plotLin <- function(M,shade=TRUE,...) {
  if (shade) {
    fit <- lm(class~x+y,M)
    xx <- seq(min(M$x),max(M$x),len=299)
    yy <- seq(min(M$y),max(M$y),len=299)
    f <- function(x,y){predict(fit,newdata=data.frame(x=x,y=y)) > 0.5}
    zz <- outer(xx,yy,f)
    cols <- c(rgb(1,0.5,0.5,alpha=0.05),rgb(0.5,0.5,1,alpha=0.05))
    col <- rep(cols[1],length(zz))
    col[zz] <- cols[2]
    plot(expand.grid(xx,yy),col=col,pch=15,cex=.75,xaxt="n",yaxt="n",xlab="",ylab="",...)
  }
  cols <- c(rgb(1,0,0),rgb(0,0,1))
  col <- rep(cols[1],nrow(M))
  col[M$class==1] <- cols[2]
  if (shade) points(M$x,M$y,col=col,pch=19)
  else plot(M$x,M$y,col=col,pch=19,xaxt="n",yaxt="n",xlab="",ylab="",...)
}
plotKNN <- function(M,k=1,...) {
  xx <- seq(min(M$x),max(M$x),len=299)
  yy <- seq(min(M$y),max(M$y),len=299)
  zz <- as.numeric(knn(M[,1:2],expand.grid(xx,yy),cl=M$class,k=k))-1
  cols <- c(rgb(1,0.5,0.5,alpha=0.05),rgb(0.5,0.5,1,alpha=0.05))
  col <- rep(cols[1],length(zz))
  col[zz==1] <- cols[2]
  plot(expand.grid(xx,yy),col=col,pch=15,cex=.75,xaxt="n",yaxt="n",xlab="",ylab="",...)
  cols <- c(rgb(1,0,0),rgb(0,0,1))
  col <- rep(cols[1],nrow(M))
  col[M$class==1] <- cols[2]
  points(M$x,M$y,col=col,pch=19)
}
genM <- function(scenario,SD=1,n=200,n.p=0) {
  if (scenario==1) {
    M <- data.frame(x=c(rnorm(n/2,1,SD),rnorm(n/2,0,SD)),
                    y=c(rnorm(n/2,0,SD),rnorm(n/2,1,SD)),
                    class=rep(0:1,rep(n/2,2)))
    if (n.p > 0) MM <- data.frame(x=c(rnorm(n.p/2,1,SD),rnorm(n.p/2,0,SD)),
                                  y=c(rnorm(n.p/2,0,SD),rnorm(n.p/2,1,SD)),
                                  class=rep(0:1,rep(n.p/2,2)))
  } else if (scenario==2) {
    SD <- 2*SD
    mx1 <- rnorm(10,1,SD)
    mx2 <- rnorm(10,0,SD)
    my1 <- rnorm(10,0,SD)
    my2 <- rnorm(10,1,SD)
    M <- data.frame(x=c(rnorm(n/2,sample(mx1,n/2,replace=TRUE),SD/sqrt(5)),rnorm(n/2,sample(mx2,n/2,replace=TRUE),SD/sqrt(5))),
                    y=c(rnorm(n/2,sample(my1,n/2,replace=TRUE),SD/sqrt(5)),rnorm(n/2,sample(my2,n/2,replace=TRUE),SD/sqrt(5))),
                    class=rep(0:1,rep(n/2,2)))
    if (n.p > 0) MM <- data.frame(x=c(rnorm(n.p/2,sample(mx1,n.p/2,replace=TRUE),SD/sqrt(5)),rnorm(n.p/2,sample(mx2,n.p/2,replace=TRUE),SD/sqrt(5))),
                                  y=c(rnorm(n.p/2,sample(my1,n.p/2,replace=TRUE),SD/sqrt(5)),rnorm(n.p/2,sample(my2,n.p/2,replace=TRUE),SD/sqrt(5))),
                                  class=rep(0:1,rep(n.p/2,2)))
  }
  val <- if (n.p > 0) list(M=M,MM=MM) else M
  val
}
mc <- function(x1,x2) {
  tab <- table(x1,x2)
  return(1-sum(diag(tab))/sum(tab))
}
