【发布时间】:2016-06-23 20:14:28
【问题描述】:
下面是我在 R(使用 e1071 包)中用于朴素贝叶斯实现的训练数据集,其中:X、Y、Z 是不同的类,V1、V2、V3、V4、V5 是属性:-
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 属于哪个类,给定值 Yes。所以我有我的测试数据:-
V3
Yes
所以,我必须找出每个类的概率,即概率(X| V3=Yes),概率(Y| V3=Yes),概率(Z| V3=Yes),并从三个中取最大值.现在,
概率(X| V3=Yes)= 概率(X) * 概率(V3=Yes|X)/ P(V3)
从上面提到的条件概率,我们知道Probability(V3=Yes|X)=0 因此,Probability(X| V3=Yes) 应该为 0,Probability(Y| V3=Yes),Probability(Z| V3=Yes) 应该分别为 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:- 使用拉普拉斯平滑
与 Case1 w.r.t 相同的场景。测试数据,使用拉普拉斯的唯一区别是1。所以,我必须再次找出每个类的概率,即概率(X| V3=Yes),概率(Y| V3=Yes),概率(Z| V3=Yes ) 并从三个中取最大值。
以下是拉普拉斯平滑(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=Yes)= 概率(Y) * 概率(V3=Yes|X)/ P(V3)
概率(Z| V3=Yes)= 概率(Z) * 概率(V3=Yes|X)/ P(V3)
经过计算,
概率(X| V3=Yes)= 0.53 * 0.05555556 / P(V3)=0.029/P(V3)
概率(Y| V3=是)= 0.23 * 0.22222222 / P(V3)=0.051/P(V3)
概率(Z| V3=Yes)= 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) 的解释。
提前致谢!
【问题讨论】:
标签: r statistics bayesian naivebayes