連続変数の単純ベイズ


8

基本的な質問をさせてください。離散変数に対する単純ベイズのメカニズムを理解しており、計算を「手動」でやり直すことができます。(HouseVotes84のコードは以下の通りです)。

ただし-連続変数のメカニズムがどのように機能するかを確認するのに苦労しています(以下のコード例)。パッケージはどのように条件付き確率[, 1]を計算し[, 2]ますか、以下の表を参照してください 個々のX値は一意であるため、各ポイントの周囲に範囲を作成し、これらの範囲内の相対頻度を計算しますか(たとえば、ポイントが+0.311の場合、0.1および+0.5?)これは基本的な質問かもしれません-もしそうなら謝罪します。

テーブル

A-priori probabilities:
Y
  blue orange 
   0.5    0.5 

Conditional probabilities:
        values
Y              [,1]      [,2]
  blue   0.08703793 0.9238799
  orange 1.33486433 0.9988389

コード

blue=rep("blue",50); orange=rep("orange",50); colour=c(blue,orange); values1=rnorm(50,0,1); values2=rnorm(50,1,1); values=c(values1,values2)
df=data.frame(colour,values)

(model <- naiveBayes(colour ~ ., data = df))
(predict(model, df[1:10,]))
(predict(model, df[1:10,], type = "raw"))
(pred <- predict(model, df))
table(pred, df$colour)

## Categorical data only:
library(e1071)
data(HouseVotes84, package = "mlbench")
HouseVotes84=HouseVotes84[,1:3]
(model <- naiveBayes(Class ~ ., data = HouseVotes84))
(predict(model, HouseVotes84[1:10,]))
(predict(model, HouseVotes84[1:10,], type = "raw"))
(pred <- predict(model, HouseVotes84))
table(pred, HouseVotes84$Class)

回答:


5

Rパッケージ(e1071)および使用している関数naiveBayesから:

標準的な単純ベイズ分類器(少なくともこの実装)は、予測子変数の独立性と、メトリック予測子のガウス分布(ターゲットクラスを指定)を前提としています欠損値のある属性の場合、対応するテーブルエントリは予測のために省略されます。

ナイーブベイズの連続変数の標準では、これらの変数の正規分布が考慮され、平均と標準偏差を計算できます。次に、いくつかの標準Zテーブル計算を使用して、各連続変数の確率を推定して、単純ベイズ分類器。このパッケージの分布の仮定を変更することは可能だと思いましたが、どうやら私は間違っています。

密度カーネルを変更できる別のRパッケージ(klaR)があります。(関数はNaiveBayesです)。パッケージから:

NaiveBayes(x, grouping, prior, usekernel = FALSE, fL = 0, ...)

カーネル

TRUEの場合、密度推定にカーネル密度推定(密度)が使用されます。FALSEの場合、通常の密度が推定されます。

density(x, bw = "nrd0", adjust = 1,
        kernel = c("gaussian", "epanechnikov", "rectangular",
                   "triangular", "biweight",
                   "cosine", "optcosine")

0

私は、ナイーブベイズ分類器を(ゼロから)計算する必要がある、それほど前のプロジェクトに取り組んでいました。私はRで始めましたが、プロセスがダウンしたら、コードをPythonに移動しました。これが私が始めた私のコードです。洗練されているとは思わないでください。ほとんどの場合、私はWikipediaの例(https://en.wikipedia.org/wiki/Naive_Bayes_classifier#Examples)に従いました。

手順は簡単です:

  1. クラスの比率である事前確率を計算する

  2. 連続データについては、正規分布を仮定し、平均と標準偏差を計算します。

  3. 観測値を分類するには、新しい入力を取得し、手順2でmuとsigmaがどこから来るかをx計算しdnorm(x, mu, sigma)ます。

  4. log(apriori)+ log(dnorm(...))を合計します。

この時点で、log(dnorm(...))(私の例では)2つのログ値が含まれているはずです。それらがクラス0に属する確率とクラス1に属する確率。これが、Eric Petersonの2番目の段落で述べた点です。

  1. 事後確率を計算する

また、結果をRライブラリe1071と比較しました。この単純なケースでは、分類結果は一致しますが、確率結果は一致しません。それらのpredict.naiveBayes関数では、エラーlog(apriori) + apply(log(sapply(...compute dnorm code here...)), 1, sum)を返すようなものがlog(apriori) + log(1) = log(apriori)あるため、分類は事前確率にのみ基づいています(実際には、確率ではなくカウントを使用します)。

とにかく、これは私にもはっきりしていなかったので、これがあなた(そして他の誰も)が内部で何が起こっているのかを理解するのに役立つことを願っています。

n=30 ## samples
set.seed(123)
x = c(rnorm(n/2, 10, 2), rnorm(n/2, 0, 2))
y = as.factor(c(rep(0, 20), rep(1, 10)))
y


#library(e1071)
#nb = naiveBayes(x, y, laplace = 0)
#nb

#nb_predictions = predict(nb, x[1], type='raw')
#nb_predictions



library(dplyr)

nbc <- function(x, y){
  df <- as.data.frame(cbind(x,y))
  a_priori <- table(y) #/length(y)

  cond_probs <- df %>% group_by(y) %>% summarise(means = mean(x), var = sd(x))

  print("A Priori Probabilities")
  print(a_priori/sum(a_priori))

  print("conditional probabilities \n")
  print(cond_probs)

  return(list(apriori = a_priori, tables = cond_probs))
}



predict_nbc <- function(model, new_x){
  apriori = as.matrix(model$apriori)
  a = log(apriori/sum(apriori))
  msd = as.matrix(model$tables)[,c(2,3)] ## creates 3 columsn; first is junk
  probs = sapply(new_x, function(v) dnorm(x = v, mean = msd[,1], sd = msd[,2]))
  b = log(probs)
  #L = a + b ## works for 1 new obs
  L = apply(X = b, MARGIN = 2, FUN = function(v) a + v)

  results <- apply(X = L, MARGIN = 2, function(x){
                   sapply(x, function(lp){ 1/sum(exp(x - lp)) }) ## numerically stable
  })
  return(results)
}



fit = nbc(x,y)

fit ## my naive bayes classifier model

myres = predict_nbc(fit, new_x = x[1:4])
myres
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.