当前位置: 首页 > news >正文

多项式朴素贝叶斯

多项式朴素贝叶斯(二分类)

题意

实现一个Multinomial Naive Bayes二分类器。

  • train:二维列表,每行最后一列为标签y \in \{0,1\},其余列为非负整数词频
  • test:二维列表,仅包含词频特征,维度与训练集一致

1. 条件概率(拉普拉斯平滑)

采用拉普拉斯平滑,取k=1k=1k=1

P(w∣c)=nc,w+1∑w′(nc,w′+1) P(w \mid c)=\frac{n_{c,w}+1}{\sum_{w'}(n_{c,w'}+1)}P(wc)=w(nc,w+1)nc,w+1

其中,nc,wn_{c,w}nc,w表示所有标签为ccc的训练样本中,词www的总词频。


2. 先验概率

πc=NcN \pi_c=\frac{N_c}{N}πc=NNc

其中,NcN_cNc为类别ccc的样本数,NNN为总样本数。


3. 对数后验

对样本xxx,计算:

log⁡P(c∣x)=log⁡πc+∑wxwlog⁡P(w∣c) \log P(c \mid x)=\log \pi_c+\sum_w x_w \log P(w \mid c)logP(cx)=logπc+wxwlogP(wc)

其中,xwx_wxw表示样本xxx中词www的词频。

使用对数有两个好处:

  • 避免多个小概率连乘导致下溢
  • 将乘法转为加法,计算更稳定

4. 预测规则

log⁡P(1∣x)≥log⁡P(0∣x)⇒y^=1 \log P(1 \mid x)\ge \log P(0 \mid x)\Rightarrow \hat{y}=1logP(1x)logP(0x)y^=1

否则输出:

y^=0 \hat{y}=0y^=0


5. 流程总结

  1. 读取traintest
  2. 统计每个类别下各词总频次
  3. 计算平滑后的P(w∣c)P(w \mid c)P(wc)
  4. 计算先验概率πc\pi_cπc
  5. 对每个测试样本计算两类对数后验
  6. 比较大小并输出预测结果

6. 代码实现

importsysimportnumpyasnpimportjson np.random.seed(42)data=json.loads(sys.stdin.read())train_data=np.array(data["train"])# NOTE dtype / astype()test_data=np.array(data["test"])train_x=train_data[:,:-1]train_y=train_data[:,-1].astype(int)test_x=test_data n=len(train_x)v=len(train_x[0])m=len(test_x)res=[]# 先验概率class_count=np.array([(train_y==0).sum(),(train_y==1).sum()])class_prob=class_count/n# 条件概率word_count_0=train_x[train_y==0].sum(axis=0)word_count_1=train_x[train_y==1].sum(axis=0)word_count=np.stack([word_count_0,word_count_1],axis=0)den=word_count.sum(axis=1,keepdims=True)+v condition_prob=(word_count+1)/den log_condition_prob=np.log(condition_prob)log_class_prob=np.log(class_prob)# 预测score0=log_class_prob[0]+(test_x*log_condition_prob[0]).sum(axis=1)score1=log_class_prob[1]+(test_x*log_condition_prob[1]).sum(axis=1)res=(score1>=score0).astype(int).tolist()print(json.dumps(res,separators=(",",":")))# NOTE separators 把空格换成逗号
http://www.jsqmd.com/news/546754/

相关文章:

  • 「理性认知」和「本能恐惧」在打架
  • AT89C52单片机驱动共阴数码管实现方法
  • Ark-Pets的模型资源管理革新:从下载困境到智能分发的实践之路
  • STM32智能水产养殖监控系统设计与实现
  • RTX4090D显存优化:OpenClaw+Qwen3-32B-Chat批量处理千页PDF
  • ssm+java2026年毕设私教预约系统【源码+论文】
  • 终极AI角色扮演指南:5分钟搭建你的专属虚拟伙伴
  • MySQL核心知识点整合(数据库操作+数据引擎+B+树索引+数据类型)
  • TMSpeech终极指南:5分钟掌握Windows离线语音识别与实时字幕生成
  • 抖音视频高效批量处理与智能管理工具实战指南
  • 【深度学习 | 论文精读】从“子空间拆解”到“社交图谱”:多模态情感分析:MISA
  • 容器化部署wvp-GB28181-pro视频监控平台:从环境准备到实战优化
  • AI证书 vs 项目经验:2026年AI求职竞争力深度分析
  • LyricsX:macOS上终极高效的桌面歌词悬浮工具完整指南
  • 融合视差补偿与3D特征提取的光场图像无参考质量评估
  • [具身智能-121]:视觉数据与点云数据对比
  • AViShaMQTT:ESP32/ESP8266轻量级MQTT封装库详解
  • 17步拆解AIAgent全流程:一张图看懂从提问到反馈的智能闭环!
  • Dark Reader:告别屏幕强光困扰的高效深色模式解决方案
  • 鸿蒙(HarmonyOS)ArkTS 实战:animateTo属性动画骨架屏流光动画
  • WiFi热图绘制工具:用Python为你的无线网络做一次“CT扫描“ [特殊字符][特殊字符]
  • Java 语言版本演进与特性概要
  • Qwen3-32B-Chat多模态扩展:OpenClaw实现图文混合内容生成
  • 终极Unity到Godot资源迁移工具:3步实现跨引擎资源完美导入
  • 从CentOS 7迁移到Ubuntu 22.04 LTS,我整理了一份保姆级系统初始化脚本(含内核调优、换源、时区设置)
  • 菜鸟计划在欧洲开设多个专业品类仓,欧洲大棋局该咋看?
  • 省市区县四级联动数据获取指南:基于高德API的geoJSON数据自动更新方案
  • 若依框架前后端联调避坑指南:从端口冲突到数据库字段错误的完整解决方案
  • 终极Pine Script学习指南:从零到精通的完整路径
  • 轻量Windows系统构建指南:Tiny11Builder技术解析与实践