公式复习
理论可参考 : 朴素贝叶斯(一)
公式:
(P(x)为常数,可忽略不考虑)
平滑:
Nyk是类别为yk的样本个数,n是特征的维数,Nyk,xi是类别为yk的样本中,特征的值是xi的样本个数,α是平滑值。
分词公式整理
在对NBCorpus词分类时,带入上面的公式可得:
某词属于某类别的概率 = (该类别该词的个数 + 1/ 该类别词的总数 + 所有类别所有不重复单词总数) ×(该类别样本个数 / 所有类别总样本个数) /(所有类别该词个数 / 所有类别所有词个数)
- 所有类别该词个数 / 所有类别所有词个数 就是上面公式的P(x) ,它的值与类别无关,值相同,所有把它去掉,公式变成:
_ ** (该类别该词的个数 + 1/ 该类别词的总数 + 所有类别所有不重复单词总数) ×(该类别样本个数 / 所有类别总样本个数) ** _ - (该类别样本个数 / 所有类别总样本个数) 就是上面公式的P(yk),即先验概率。没有使用平滑。
- (该类别该词的个数 + 1/ 该类别词的总数 + 所有类别所有不重复单词总数) 就是上面公式的P(x|yk),就是可能性。使用了平滑,分子加的1,分母加的所有类别所有不重复单词总数 都是平滑值。
如果按照上面的公式,就和上面的例子一样,对于测试的样本里的每个属性计算出属于每个类别的概率,对于每个类别每个属性的概率相乘。但是,小数越乘越小,最终可能会导致数据会丢失成0,无法比较。解决办法是对公式加ln操作,把乘法变成加法,且不破坏单调性。
分词简单例子
上面的词量比较少,没有进行ln操作。但是如果词量太大,举例最后的计算转变成
数据及代码
数据下载地址:http://download.csdn.net/download/u010668907/10263175
。。。。无语了,想上传全部的NBCorpus库,csdn一直说已经存在,整体的库后续再说吧,上面的链接里的是做下面算法计算的那部分,够用了。
下面的代码里加了ln操作,否则计算之后每个类别都是0,无法比较
1 | # -*- coding:utf-8 -*- |
最终的输出结果就是 :AFRICA