理论:
P(X|Y) = P(X,Y)/P(Y)
P(X,Y) = P(X|Y)P(Y)
P(X,Y) = P(Y|X)P(X)
由此推导出朴素贝叶斯公式:
P(X|Y) = P(Y|X)P(X)/P(Y)
由此推导:
p(yi|X) = P(yi)p(X|yi)/P(X)
Y = 表示类别集合{军事0、财经1、体育2}
yi = 表示第i个类别
X = 一篇文章
xi = 文章中的某一个词.
X={x1,x2,x3...}
分析:
1.P(yi)是先验概率,可以提前算出来的概率,举例
假设有100篇文章(训练集),其中50篇是军事,30篇是财经,20篇体育
P(y=军事) = 50/100
P(y=财经) = 30/100
P(y=体育) =20/100
2.P(X) = 常数,所以接下来计算,公式缩减为
p(yi|X) = P(yi)p(X|yi)
p(X|yi)=p(xj)p(yi)=p(x=词一|y=类别1)p(x=词2|y=类别1)...
举例:
X={军舰、大炮、航母}, y=军事
p(X|y=军事)=p(x=军舰|y=军事)*p(x=大炮|y=军事)*p(x=航母|y=军事)
而p(xj|yi) 的统计2种方法:
第一种:
分子:军事类文章中包含“谷歌”这词的文章个数
分母:军事类文章个数
P(x=谷歌|y=军事) = 分子 / 分母
第二种(实践代码):
分子:军事类文章中包含“谷歌”这个词的个数
分母:军事类文章中所有词的个数
P(x=谷歌|y=军事) = 分子 / 分母
举例:{军事0、财经1、体育2}
p(y=0|X) = 90%
p(y=1|X) = 1%
p(y=2|X) = 9%
实践:朴素贝叶斯
第一步:格式转换,生成训练集和测试集
python DataConvert.py data/ nb_data
1.数据:3607篇文章,各种类别,文件名有标识,分词已经分好的:
直接用词做计算不方便,于是把每一个词变成一个数字,数字和词一一对应,如下:
第一条命令做数据转换,分为(80%)训练集和(20%)测试集,输出:
实现代码 DataConvert.py:
import sys
import os
import random
WordList = []
WordIDDic = {}
TrainingPercent = 0.8
inpath = sys.argv[1]
OutFileName = sys.argv[2]
trainOutFile = file(OutFileName+".train", "w")
testOutFile = file(OutFileName+".test", "w")
def ConvertData():
i = 0
tag = 0
for filename in os.listdir(inpath):
if filename.find("business") != -1:
tag = 1
elif filename.find("auto") != -1:
tag = 2
elif filename.find("sport") != -1:
tag = 3
i +&