手写朴素贝叶斯NB算法,对文章进行分类

  上篇文章写了对数据的整理和分词,接下来对整理好的数据进行训练,运用的算法先从最简单的NB算法开始,首先说下NB算法的原理。NB算法的公式P(yi|X)= P(X|yi)*P(yi)/P(X),X表示待测的一篇文章,yi表示分类标签,P(yi|X)表示这篇文章属于哪类的概率, P(X|yi)表示为指定类别下产生这篇文章的概率,P(yi)每个类别的先验概率,P(X)这篇文章存在的概率为1。根据极大似然估计,P(X|yi) =ΠP(xi|yi),xi为文章中包含的单词,P(xi|yi)表示为指定类别下文章中每个单词的概率。下面手写一个NB程序。

第一步,准备数据。读取整理好的文章数据,安装4:1的比例分词训练集和测试集。建立一个字典,内容为:单词和ID,用于查找每个单词背后的代号。读取文章数据,得到分类的标签和单词代号,并将这些信息写入训练集和测试集。

第二步,导入训练集数据,统计每类文章的数据classFreq[classid],用于计算先验概率P(yi)。统计每类文章中单词的个数ClassFeaDic[classid][wid],用于后续计算条件概率P(xi|yi)。并且统计训练中出现的单词,写入wordid_file中。

第三步,计算模型和保存模型。1)统计训练集中文章总数,求得每类的先验概率(ClassProb[classid] = (float)(ClassFreq[classid]) / (float)(sum))。统计每类文章的单词的个数,考虑到平滑性后,newsum = (float)(sum + 1),得到每类文章的单词总数,求得每个单词的条件概率(ClassFeaProb[classid][wid] = (float)(ClassFeaDic[classid][wid] + DefaultFreq) / newsum)。根据单词总数,求得测试集单词不存在训练集时的默认概率(ClassDefaultProb[classid] = (float)(DefaultFreq) / newsum)。对这些结果概率进行保存,输出到train.model文件中。

第四步,对测试集进行预测。读取测试集中的每类的标签和单词,将分类标签放入TrueLabelList列表中,对单词集content进行计算。读取每个单词,如果单词在词集中,scoreDic[classid] += math.log(ClassFeaProb[classid][wid]),如果不在scoreDic[classid] += math.log(ClassDefaultProb[classid])。注意公式本来是P(X|yi) =ΠP(xi|yi),为了防止溢出和容易计算,将乘法变成log加法。求出最大的类概率值,对应的类就是预测标签,写入PredLabelList列表中。

第五步,评估模型。将正确的标签列表和预测的标签列表进行比较,得到预测准确率。

第六步,自己从网上找一篇新闻去测试。我自己从新浪新闻上随便找一个一篇新闻,属于娱乐方面的,将新闻进行整理,去掉空格和标点符号等,只留下文本单词。根据之前保存的word和id对应关系,求得新闻单词的ID,在word和id对应关系中不存在的单词直接pass掉,然后使用cal_Pre函数进行预测,得到预测标签。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值