多项式朴素贝叶斯
多项式朴素贝叶斯二分类题意实现一个Multinomial Naive Bayes二分类器。train二维列表每行最后一列为标签y \in \{0,1\}其余列为非负整数词频test二维列表仅包含词频特征维度与训练集一致1. 条件概率拉普拉斯平滑采用拉普拉斯平滑取k1k1k1P(w∣c)nc,w1∑w′(nc,w′1) P(w \mid c)\frac{n_{c,w}1}{\sum_{w}(n_{c,w}1)}P(w∣c)∑w′(nc,w′1)nc,w1其中nc,wn_{c,w}nc,w表示所有标签为ccc的训练样本中词www的总词频。2. 先验概率πcNcN \pi_c\frac{N_c}{N}πcNNc其中NcN_cNc为类别ccc的样本数NNN为总样本数。3. 对数后验对样本xxx计算logP(c∣x)logπc∑wxwlogP(w∣c) \log P(c \mid x)\log \pi_c\sum_w x_w \log P(w \mid c)logP(c∣x)logπcw∑xwlogP(w∣c)其中xwx_wxw表示样本xxx中词www的词频。使用对数有两个好处避免多个小概率连乘导致下溢将乘法转为加法计算更稳定4. 预测规则logP(1∣x)≥logP(0∣x)⇒y^1 \log P(1 \mid x)\ge \log P(0 \mid x)\Rightarrow \hat{y}1logP(1∣x)≥logP(0∣x)⇒y^1否则输出y^0 \hat{y}0y^05. 流程总结读取train和test统计每个类别下各词总频次计算平滑后的P(w∣c)P(w \mid c)P(w∣c)计算先验概率πc\pi_cπc对每个测试样本计算两类对数后验比较大小并输出预测结果6. 代码实现importsysimportnumpyasnpimportjson np.random.seed(42)datajson.loads(sys.stdin.read())train_datanp.array(data[train])# NOTE dtype / astype()test_datanp.array(data[test])train_xtrain_data[:,:-1]train_ytrain_data[:,-1].astype(int)test_xtest_data nlen(train_x)vlen(train_x[0])mlen(test_x)res[]# 先验概率class_countnp.array([(train_y0).sum(),(train_y1).sum()])class_probclass_count/n# 条件概率word_count_0train_x[train_y0].sum(axis0)word_count_1train_x[train_y1].sum(axis0)word_countnp.stack([word_count_0,word_count_1],axis0)denword_count.sum(axis1,keepdimsTrue)v condition_prob(word_count1)/den log_condition_probnp.log(condition_prob)log_class_probnp.log(class_prob)# 预测score0log_class_prob[0](test_x*log_condition_prob[0]).sum(axis1)score1log_class_prob[1](test_x*log_condition_prob[1]).sum(axis1)res(score1score0).astype(int).tolist()print(json.dumps(res,separators(,,:)))# NOTE separators 把空格换成逗号
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2456267.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!