上一篇文章提到过两种分类方法,一种是GDA另一种是Logistic分类法。这两种分类法各有各的有适和特点,虽然它们可以实现二分类,但是他们要求输入特征是连续的。朴素Bayes方法是一种处理离散特征的分类方法。这篇博客正,我们先简单的介绍Bayes分类法,然后给出其python实现代码。
我们知道朴素Bayes是基于贝叶斯理论而开发出来的。直白的说就是两个存在关系的事件A和B,B发生了,A有多大的可能发生,这就是Bayes里理论了,用公式表示,如下:

我们在利用上面的公式,也就是Bayes法,进行分类时主要就是确定p(B|A)和p(A)。因为对于A的每种取值p(B)都是一样的,所以可以把上式缩写成:p(A=i|B)=max{p(B|A=i)*p(A=i)}。下面我们假设i=0或1,则在训练数据时我们的主要任务就是确定下面的三个概率:p(B|A=1)、p(B|A=0)和p(B=1)。我们有了上述三个概率,就可以求得上式中,在B发生的情况下A等于1和0的概率了,哪个概率大就将B分到哪类中。下面我们一文本分类的具体例子进行详细说明。假设我们有训练集,其中每一个元素是X,在这里X是一个向量,向量中的元素表示文本中的word是否出现在字典中,出现为1,否则为0。标签为Y,Y中的元素也为0或1表示二分类,则上面的公式可以写成:

就像上面所说的那样,在对数据进行训练时,主要是求得p(x|y=1)、p(x|y=0)和p(y=1)这三个量,具体的求解方法如下:

一旦我们求解了上面三个值就可以对数据进行分类了,也就是如下公式:

上面无论实在对数据进行计算时,还是进行预测时都用到了一个假设条件,这个条件是:x的各个特征之间是条件独立,这也就是为什么叫做朴素Bayes方法了。好了,下面给出具体的python代码:
点击(此处)折叠或打开
-
def Bayes(trainDataset,label):
-
numTrainDocs = len(trainDataset);
-
numWords = len(trainDataset[0]);
-
py = sum(label)/float(numTrainDocs);
-
p0Num = ones(numWords); p1Num = ones(numWords);
-
p0Denom = 0.0; p1Denom = 0.0;
-
for i in range(numTrainDocs):
-
if label[i] == 1:
-
p1Num += trainDataset[i];
-
p1Denom += sum(trainDataset[i]);
-
else:
-
p0Num += trainDataset[i];
-
p0Denom += sum(trainDataset[i]);
-
p1 = p1Num/p1Denom;
-
p0 = p0Num/p0Denom;
-
return p0,p1,py;
-
-
def prediton(x,y):
-
py1=1.0;py0=1.0;
-
for i in range(len(x)):
-
if x[i]==0 and y[i]==0:
-
py0 *= p0*py;
-
else
-
py1 *= p1*(1-py);
-
if(py0<py1)
-
return 0;
-
else:
- return 1;