2017-03-05 16 views
1

irisデータセットを使用して手作業でRのをNaive Bayes Classifierにするコードを書きました。 3クラス Naive Bayes Rの分類 - ゼロから

  • へのデータは、各クラスの前
  • によってdnorm

  • 乗算を使用して、各クラス
  • 計算確率の平均と分散を計算

    • デバイド:私は次のことをやりました私はそれぞれの結果に対して実際に確率が低いです。の後ろ機能の部分が正しいかどうか疑問に思っていますか?ここに私のコードは次のとおりです。ここで

      set.seed(1) #reproducibility 
      training_rows <- sort(c(sample(1:50, 40), sample(51:100, 40), sample(101:150, 40))) 
      training_x <- as.data.frame(iris[training_rows, 1:4]) 
      training_y <- iris[training_rows, 5] 
      
      iris_nb <- function(x, trainx, trainy){ 
          train <- cbind(trainx, trainy) 
      
          class_virginica <- train[which(train$trainy == 'virginica'),] 
          class_setosa <- train[which(train$trainy == 'setosa'),] 
          class_versicolor <- train[which(train$trainy == 'versicolor'),] 
      
          posterior <- function(x, classtype){ 
      
          p_Sepal.Length <- dnorm(x, mean(classtype[,1]), sd(classtype[,1])) 
          p_Sepal.Width <- dnorm(x, mean(classtype[,2]), sd(classtype[,2])) 
          p_Petal.Length <- dnorm(x, mean(classtype[,3]), sd(classtype[,3])) 
          p_Petal.Width <- dnorm(x, mean(classtype[,4]), sd(classtype[,4])) 
      
          vec <- 0.33* p_Sepal.Length * p_Sepal.Width * p_Petal.Length * p_Petal.Width #for each species 
          return(vec) 
      } 
      
          return(list(virginica = sum(posterior(x, class_virginica)), 
           setosa = sum(posterior(x, class_setosa)), 
           versicolor = sum(posterior(x, class_versicolor)))) 
      } 
      

      が出力されます。

      test_case_1 <- as.matrix(iris[1, 1:4]) 
      iris_nb(test_case_1, training_x, training_y) 
      
      ## $virginica 
      ## [1] 1.167108e-16 
      
      ## $setosa 
      ## [1] 2.136291e-54 
      
      ## $versicolor 
      ## [1] 1.636154e-32 
      

      私は助けに感謝します!

  • 答えて

    0

    2つのコメント:あなたが計算され、後部が、それはprior * likelihood比例だという事実に基づいている

    1)。それはすべてうまくいいですが、Bayes Theoremはposterior = prior * likelihood/marginalということを覚えています。限界は非常に小さいので、あなたの計算からそれを落とすことで、事後確率も非常に小さくなります(あなたがそれによって分割しないので)。

    一般に、これらの確率自体は気にしません。その相対的なサイズは気にします。したがって、virginicaは、他の種よりもこのテストケースで何度も起こりそうです。だからNaive Bayesはvirginicaargmaxを出力します。

    2)確率の積を使って作業しているとき(つまり、あなたの共同の可能性である)、それらは加法的であり数値的な問題を引き起こさないので、代わりにログ確率を使用します一緒に)。

    関連する問題