我在[-1,1] ^ 2时间间隔中生成了100个随机x-y坐标的矩阵:

n <- 100
datam <- matrix(c(rep(1,n), 2*runif(n)-1, 2*runif(n)-1), n)
# leading 1 column needed for computation
# second column has x coordinates, third column has y coordinates


并根据给定的目标函数f(向量)将其分为-1和1两类。
我计算了一个假设函数g,现在想直观地看到它与
目标函数f。

f <- c(1.0, 0.5320523, 0.6918301)   # the given target function
ylist <- sign(datam %*% f)    # classify into -1 and 1

# perceptron algorithm to find g:
perceptron = function(datam, ylist) {
  w <- c(1,0,0)             # starting vector
  made.mistake = TRUE
  while (made.mistake) {
  made.mistake=FALSE
  for (i in 1:n) {
  if (ylist[i] != sign(t(w) %*% datam[i,])) {
    w <- w + ylist[i]*datam[i,]
    made.mistake=TRUE
  }
 }
}
return(w=w)
}

g <- perceptron(datam, ylist)


我现在想在图中比较f与g。

我可以在mathematica中很容易地做到这一点。这里显示的是带有目标函数f的数据集,该函数将+1和-1部分中的数据分开:



该数学图显示了比较中的f和g(不同的数据集和f)



这是对应的mathematica代码

ContourPlot[g.{1, x1, x2} == 0, {x1, -1, 1}, {x2, -1, 1}]


我如何在R中做类似的事情(ggplot会很好)?

最佳答案

您的示例仍然不可复制。查看我的代码,您将看到f和g相同。此外,似乎您正在为没有的数据点外推行(问题的第二部分)。您是否有任何证据表明歧视应该是线性的?

#Data generation
n <- 10000
datam <- matrix(c(rep(1,n), 2*runif(n)-1, 2*runif(n)-1), n)
# leading 1 column needed for computation
# second column has x coordinates, third column has y coordinates
datam.df<-data.frame(datam)
datam.df$X1<-NULL
f <- c(1.0, 0.5320523, 0.6918301)   # the given target function
f.col <- ifelse(sign(datam %*% f)==1,"darkred", "darkblue")
f.fun<-sign(datam %*% f)

# perceptron algorithm to find g:
perceptron = function(datam, ylist) {
  w <- c(1,0,0)             # starting vector
  made.mistake = TRUE
  while (made.mistake) {
  made.mistake=FALSE
  for (i in 1:n) {
  if (ylist[i] != sign(t(w) %*% datam[i,])) {
    w <- w + ylist[i]*datam[i,]
    made.mistake=TRUE
  }
 }
}
return(w=w)
}


g <- perceptron(datam, f.fun)
g.fun<-sign(datam %*% g)


绘制整体数据

plot(datam.df$X2, datam.df$X3, col=f.col, pch=".", cex=2)




我将为g和f函数生成单独的图,因为在您的示例中某些东西不起作用,并且f和g是相同的。整理完所有内容后,您可以将它们全部放在一个图中。您还可以查看并选择是否要阴影化。如果没有证据表明分类是线性的,则使用chull()标记您拥有的数据可能更明智。

对于f函数

plot(datam.df$X2, datam.df$X3, col=f.col, pch=".", xlim=c(-1,-0.5), ylim=c(-1,-.5), cex=3, main="f function")
datam.df.f<-datam.df[f.fun==1,]
ch.f<-chull(datam.df.f$X2, datam.df.f$X3 )
ch.f <- rbind(x = datam.df.f[ch.f, ], datam.df.f[ch.f[1], ])
polygon(ch.f, lwd=3, col=rgb(0,0,180,alpha=50, maxColorValue=255))




对于g函数

    g.col <- ifelse(sign(datam %*% g)==1,"darkred", "darkblue")
    plot(datam.df$X2, datam.df$X3, col=g.col, pch=".", xlim=c(-1,-0.5), ylim=c(-1,-.5), cex=3, main="g function")
    datam.df.g<-datam.df[g.fun==1,]
    ch.g<-chull(datam.df.g$X2, datam.df.g$X3 )
    ch.g <- rbind(x = datam.df.g[ch.g, ], datam.df.g[ch.g[1], ])
    polygon(ch.g, col=rgb(0,0,180,alpha=50, maxColorValue=255), lty=3, lwd=3)




ch.f和ch.g对象是围绕您的点的“包”的坐标。您可以提取点来描述您的线。

ch.f
lm.f<-lm(c(ch.f$X3[ ch.f$X2> -0.99 & ch.f$X2< -0.65 & ch.f$X3<0 ])~c(ch.f$X2[ ch.f$X2>-0.99 & ch.f$X2< -0.65 & ch.f$X3<0]))
curve(lm.f$coefficients[1]+x*lm.f$coefficients[2], from=-1., to=-0.59, lwd=5, add=T)
lm.g<-lm(c(ch.g$X3[ ch.g$X2> -0.99 & ch.g$X2< -0.65 & ch.g$X3<0 ])~c(ch.g$X2[ ch.g$X2>-0.99 & ch.g$X2< -0.65 & ch.g$X3<0]))
curve(lm.g$coefficients[1]+x*lm.g$coefficients[2], from=-1., to=-0.59, lwd=5, add=T, lty=3)


你得到



不幸的是,由于f和g函数在您的示例中相同,因此您无法在上图中看到不同的行

关于r - 在R中绘制区域,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20825895/

10-12 18:59