1

私は単純な 2D 単層パーセプトロンを実装しようとしましたが、最終的にこの解決策になりました。

perceptron <- function(featureVec, classVec, wStart=matrix(c(0,0,0)), eta=1, limit = 50) {

  plot(x=featureVec[,1],y=featureVec[,2])

  # Extending dimensions
  dimension <- dim(featureVec)[1]
  featureVec <- cbind(featureVec,rep(1,dimension))

  # Inverting 2. class
  index <- classVec == -1
  featureVec[index,] <- apply(matrix(featureVec[index]),1,prod,-1)

  wTemp <- wStart
  y <- featureVec %*% wTemp

  iteration = 0
  while (T) {
    y <- featureVec %*% wTemp
    delta <- as.matrix(featureVec[y <= 0,])

    for(i in 1:nrow(delta)) {
      wTemp <- wTemp + eta*delta[i,]
    }
    result <- featureVec %*% wTemp
    if (sum(result <= 0) == 0) {
      break
    }
    if (iteration >= limit) {
      stop("Maximum count of interations reached!")
    }
    iteration = iteration + 1
  }  
  if(wTemp[2] != 0) {
    abline(-wTemp[3]/wTemp[2],-wTemp[1]/wTemp[2])
  } else if(wTemp[2] == 0) {
    abline(v=wTemp[1])
  } else if(wTemp[1] == 0) {
    abline(h=wTemp[2])
  }

  return(wTemp)
}

特徴ベクトルは行単位で機能し、クラス ベクトルは列単位で 1 と -1 の値を必要とします。

ほとんどのテストでは正しく動作しますが、(0,0) (0,1)クラスのようなサンプルがある場合(1,-1)、結果が得られません。これは、2 つの点が直線 (座標軸に対して水平) 上にある私の例のいくつかで発生します。異なる開始ベクトルを選択しようとすると、正しく動作することがあります (ここでは決定論的な動作はないと思います)。それは正しい動作ですか、それとも私の実装は間違っていますか?

助けてくれてありがとう、マイナー。

編集:最初の投稿のいくつかの変更。

悪いデータセット:

featureTest <- matrix(c(0,0,0,1),byrow=T,nrow=2)
classTest <- matrix(c(1,-1),nrow=2)
perceptron(featureTest,classTest)


featureTest <- matrix(c(0,1,0,2),byrow=T,nrow=2)
classTest <- matrix(c(1,-1),nrow=2)
perceptron(featureTest,classTest)

良いデータセット:

featureTest <- matrix(c(0,0,0,2),byrow=T,nrow=2)
classTest <- matrix(c(1,-1),nrow=2)
perceptron(featureTest,classTest)
4

0 に答える 0