Naive Bayes trên các biến liên tục


8

Xin cho phép tôi hỏi một câu hỏi cơ bản. Tôi hiểu các cơ chế của Naive Bayes cho các biến rời rạc và có thể làm lại các phép tính "bằng tay". (mã của HouseVotes84 theo cách bên dưới).

Tuy nhiên - Tôi đang vật lộn để xem cơ chế hoạt động như thế nào đối với các biến liên tục (ví dụ mã theo bên dưới). Làm thế nào để gói tính toán xác suất có điều kiện [, 1][, 2]trong bảng dưới đây? Vì bất kỳ giá trị X riêng lẻ nào là duy nhất, nó có tạo ra một phạm vi xung quanh mỗi điểm và tính tần số tương đối trong các phạm vi này (ví dụ: nếu điểm là +0.311, nó có đánh giá tỷ lệ của các điểm màu xanh và màu cam không, ví dụ như phạm vi 0,1 và +0,5?) Đây có thể là câu hỏi cơ bản - xin lỗi nếu vậy.

Bàn

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)

Câu trả lời:


5

Từ gói R (e1071) và hàm naiveBayes mà bạn đang sử dụng:

Trình phân loại Bayes ngây thơ tiêu chuẩn (ít nhất là việc thực hiện này) giả định tính độc lập của các biến dự đoán và phân phối Gaussian (được đưa ra lớp mục tiêu) của các yếu tố dự báo số liệu. Đối với các thuộc tính có giá trị bị thiếu, các mục trong bảng tương ứng được bỏ qua để dự đoán.

Đó là tiêu chuẩn khá cho các biến liên tục trong Bayes ngây thơ rằng phân phối bình thường được xem xét cho các biến này và độ lệch trung bình và độ lệch chuẩn có thể được tính toán và sau đó sử dụng một số xác suất tính toán của bảng z tiêu chuẩn có thể được ước tính cho từng biến liên tục của bạn để thực hiện phân loại Bayes ngây thơ. Tôi nghĩ rằng có thể thay đổi giả định phân phối trong gói này, nhưng rõ ràng là tôi đã sai.

Có một gói R khác (klaR) nơi bạn có thể thay đổi hạt nhân mật độ. (chức năng là NaiveBayes). Từ gói:

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

sử dụng hạt nhân

nếu TRUE một ước tính mật độ hạt nhân (mật độ) được sử dụng để ước tính từ chối. Nếu FALSE một mật độ bình thường được ước tính.

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

0

Tôi đã làm việc trên một dự án cách đây không lâu mà tôi cần để tính toán một trình phân loại vịnh ngây thơ (từ đầu). Tôi đã bắt đầu ở R, nhưng một khi tôi đã xử lý xong, tôi chuyển mã sang Python. Đây là mã của tôi mà tôi đã bắt đầu. Đừng hy vọng nó sẽ được đánh bóng. Đối với hầu hết các phần, tôi đã làm theo ví dụ của Wikipedia ( https://en.wikipedia.org/wiki/Naive_Bayes_ classifier #Examples ).

Các bước rất đơn giản:

  1. tính toán xác suất tiên nghiệm là tỷ lệ của các lớp

  2. Đối với dữ liệu liên tục của bạn, giả sử phân phối bình thường và tính độ lệch trung bình và độ lệch chuẩn.

  3. Để phân loại các quan sát, lấy đầu vào mới x, tính toán dnorm(x, mu, sigma)nơi mu và sigma đến từ bước 2.

  4. Tổng hợp nhật ký (apriori) + log (dnorm (...)).

Tại thời điểm này, log(dnorm(...))nên chứa hai giá trị log (trong ví dụ của tôi). Xác suất họ thuộc về lớp 0 và xác suất họ thuộc về lớp 1. Đây là điểm mà Eric Peterson đưa ra trong đoạn thứ hai của mình.

  1. Tính xác suất sau

Tôi cũng so sánh kết quả của mình với thư viện R e1071. Kết quả xác suất của tôi không phù hợp với họ cho trường hợp đơn giản này , mặc dù phân loại có. Trong predict.naiveBayeschức năng của họ , họ có một cái gì đó giống như log(apriori) + apply(log(sapply(...compute dnorm code here...)), 1, sum)trả về log(apriori) + log(1) = log(apriori)lỗi, do đó việc phân loại của họ chỉ dựa trên xác suất tiên nghiệm (thực ra, họ sử dụng số lượng không phải là xác suất).

Dù sao, tôi hy vọng điều này sẽ giúp bạn (và bất kỳ ai khác) nhìn thấy những gì dưới mui xe vì nó cũng không rõ ràng với tôi.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.