Chinaunix首页 | 论坛 | 博客
  • 博客访问: 489017
  • 博文数量: 25
  • 博客积分: 111
  • 博客等级: 民兵
  • 技术积分: 1279
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-26 20:51
文章分类

全部博文(25)

文章存档

2014年(17)

2013年(8)

分类: 大数据

2014-04-26 14:39:05


上一篇文章提到过两种分类方法,一种是GDA另一种是Logistic分类法。这两种分类法各有各的有适和特点,虽然它们可以实现二分类,但是他们要求输入特征是连续的。朴素Bayes方法是一种处理离散特征的分类方法。这篇博客正,我们先简单的介绍Bayes分类法,然后给出其python实现代码。

我们知道朴素Bayes是基于贝叶斯理论而开发出来的。直白的说就是两个存在关系的事件ABB发生了,A有多大的可能发生,这就是Bayes里理论了,用公式表示,如下:


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

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

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

上面无论实在对数据进行计算时,还是进行预测时都用到了一个假设条件,这个条件是:x的各个特征之间是条件独立,这也就是为什么叫做朴素Bayes方法了。好了,下面给出具体的python代码:

点击(此处)折叠或打开

  1. def Bayes(trainDataset,label):
  2.     numTrainDocs = len(trainDataset);
  3.     numWords = len(trainDataset[0]);
  4.     py = sum(label)/float(numTrainDocs);
  5.     p0Num = ones(numWords); p1Num = ones(numWords);
  6.     p0Denom = 0.0; p1Denom = 0.0;
  7.     for i in range(numTrainDocs):
  8.         if label[i] == 1:
  9.             p1Num += trainDataset[i];
  10.             p1Denom += sum(trainDataset[i]);
  11.         else:
  12.             p0Num += trainDataset[i];
  13.             p0Denom += sum(trainDataset[i]);
  14.     p1 = p1Num/p1Denom;
  15.     p0 = p0Num/p0Denom;
  16.     return p0,p1,py;
  17.     
  18. def prediton(x,y):
  19.     py1=1.0;py0=1.0;
  20.     for i in range(len(x)):
  21.         if x[i]==0 and y[i]==0:
  22.             py0 *= p0*py;
  23.         else
  24.             py1 *= p1*(1-py);
  25.     if(py0<py1)
  26.         return 0;
  27.     else:
  28.         return 1;



阅读(5797) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~