下面是我用於R中樸素貝葉斯實現(使用e1071包)的訓練數據集,其中:X,Y,Z是不同的類別,V1,V2,V3, V4,V5是屬性: -關於包e1071中的樸素貝葉斯算法的查詢R
Class V1 V2 V3 V4 V5
X Yes Yes No Yes Yes
X Yes Yes No No Yes
X Yes Yes No No Yes
X Yes Yes No No Yes
X No Yes No No Yes
X No Yes No No Yes
X No Yes No No Yes
X No No No No No
X No No No No No
X No No No No No
X No No No No No
X No No No No No
X No No No No No
X No No No No No
X No No No No No
X No No No No No
Y Yes Yes Yes No Yes
Y No No No No Yes
Y No No No No Yes
Y No No No No No
Y No No No No No
Y No No No No No
Y No No No No No
Z No Yes Yes No Yes
Z No No No No Yes
Z No No No No Yes
Z No No No No No
Z No No No No No
Z No No No No No
Z No No No No No
用於上述數據集的先驗概率是X-> 0.5333333 Y-> 0.2333333 Z-> 0.2333333
和條件概率爲: -
V1
Y No Yes
X 0.7500000 0.2500000
Y 0.8571429 0.1428571
Z 1.0000000 0.0000000
V2
Y No Yes
X 0.5625000 0.4375000
Y 0.8571429 0.1428571
Z 0.8571429 0.1428571
V3
Y No Yes
X 1.0000000 0.0000000
Y 0.8571429 0.1428571
Z 0.8571429 0.1428571
V4
Y No Yes
X 0.9375 0.0625
Y 1.0000 0.0000
Z 1.0000 0.0000
V5
Y No Yes
X 0.5625000 0.4375000
Y 0.5714286 0.4285714
Z 0.5714286 0.4285714
案例1: - 拉普拉斯平滑未使用
我想知道V3屬於哪個類,給定值是。所以,我有我的測試數據: -
V3
Yes
所以,我必須找出每一類即概率(X | V3 =是)的概率,概率(Y | V3 =是),概率(Z | V3 =是),並從三者中取最大值。現在,
概率(X | V3 =是)=概率(X)*概率(V3 = YES | X)/ P(V3)
從上述條件概率,我們知道概率(V3因此,概率(X | V3 =是)應該是0,概率(Y | V3 =是),概率(Z | V3 =是)應該是0.5。
但在R輸出是不同的。從包e1071我已經使用naiveBayes功能。下面是代碼及其相應的輸出: -
#model_nb<-naiveBayes(Class~.,data = train,laplace=0)
#results<-predict(model_nb,test,type = "raw")
#print(results)
# X Y Z
#[1,] 0.5714286 0.2142857 0.2142857
有人可以解釋爲什麼這樣的輸出在R?
案例2: - 拉普拉斯平滑使用
相同的情況案例1 w.r.t.測試數據,只有使用拉普拉斯的差異是1.因此,我必須找出每個類別的概率,即概率(X | V3 =是),概率(Y | V3 =是),概率(Z | V3 =是)並且從三者中取出最大值。
下面是拉普拉斯平滑後的條件概率(K = 1)
V1
Y No Yes
X 0.7222222 0.2777778
Y 0.7777778 0.2222222
Z 0.8888889 0.1111111
V2
Y No Yes
X 0.5555556 0.4444444
Y 0.7777778 0.2222222
Z 0.7777778 0.2222222
V3
Y No Yes
X 0.94444444 0.05555556
Y 0.77777778 0.22222222
Z 0.77777778 0.22222222
V4
Y No Yes
X 0.8888889 0.1111111
Y 0.8888889 0.1111111
Z 0.8888889 0.1111111
V5
Y No Yes
X 0.5555556 0.4444444
Y 0.5555556 0.4444444
Z 0.5555556 0.4444444
從樸素貝葉斯定義,
概率(X | V3 =是)=概率(X)*概率(V3 =是| X)/ P(V3)
概率(Y | V3 =是)=概率(Y)*概率(V3 =是| X)/ P(V3)
概率(Z | V3 =是)=概率(Z)*概率(V3 =是| X)/ P(V3)
計算我後,
概率(X | V3(是)= 0.53 * 0.05555556/P(V3)= 0.029/P(V3)
概率(Y | V3 =是)= 0.23 * 0.22222222/P(V3)= 0。051/P(V3)
概率(Z | V3 =是)= 0.23 * 0.22222222/P(V3)= 0.051/P(V3)
從上述計算,應該有類之間的粘結Y和Z.但是R輸出是不同的。類X顯示爲輸出類。下面是代碼及其對應的輸出: -
#model_nb<-naiveBayes(Class~.,data = train,laplace=1)
#results<-predict(model_nb,test,type = "raw")
#print(results)
# X Y Z
#[1,] 0.5811966 0.2094017 0.2094017
同樣,有人可以解釋爲什麼在R,使得輸出?我的計算在任何地方出錯了嗎?
此外,需要一些解釋當拉普拉斯平滑完成時如何計算P(V3)。
在此先感謝!
是的,它幫助!在我的情況下,我會更感興趣的是僅僅找到這樣的實例P(Class | Attribute =「Yes」)。但由於predict.naiveBayes的內部實現,我將不得不提供屬性的值,即Yes&No來獲得所需結果(在我的情況下爲Yes)。任何解決這個問題的方法? – Kanishka
我已經更新了我的答案,提供了比提供兩個值更實用的解決方案。如果您仍有疑問或問題,請告訴我。乾杯。 – lrnzcig
謝謝。我喜歡把所有的值放在一個data.frame中,並使用索引來訓練/測試一個模型。只是最後一個疑問: - 當測試數據類似於''V3 =是'時 'data.matrix(data.frame(V3 =「是」)) V3 [1,] 1# 1' _當測試數據是類似的_'all_data < - rbind(train,c(NA,NA,NA,「是」,NA,NA))'data.matrix(all_data [-trainIndex,]) 類V1 V2 V3 V4 V5 正在採取 31 NA NA NA 2 NA NA #Here列是2' 爲什麼? – Kanishka