朴素贝叶斯+拉普拉斯平滑代码实现
手撕代码
- 计算步骤:
- 数据的读取
- 取好坏瓜:
- 求先验:
- 特征提取:
- 求P(*|好瓜):
- 求P(*|坏瓜):
- 预测好坏瓜的函数:
- 验证结果:
- 输出:
计算步骤:
P(好瓜) = P(好瓜)P(色泽|好瓜)P(根蒂|好瓜)P(敲声|好瓜)P(纹理|好瓜)P(脐部|好瓜)P(触感|好瓜)
P(坏瓜) = P(坏瓜)P(色泽|坏瓜)P(根蒂|坏瓜)P(敲声|坏瓜)P(纹理|坏瓜)P(脐部|坏瓜)P(触感|坏瓜)
例:P(色泽|好瓜) = P(好瓜|色泽)*P(色泽)/P(好瓜)
数据的读取
import pandas as pd# melon2 = pd.read_csv('E:\\work\ml\\Python_Project_01\\sklearn_week\\week_10\\melon2.0.csv', index_col='编号')melon2 = pd.DataFrame([["青绿", "蜷缩", "浊响", "清晰", "凹陷", "硬滑", "是"],["乌黑", "蜷缩", "沉闷", "清晰", "凹陷", "硬滑", "是"],["乌黑", "蜷缩", "浊响", "清晰", "凹陷", "硬滑", "是"],["青绿", "蜷缩", "沉闷", "清晰", "凹陷", "硬滑", "是"],["浅白", "蜷缩", "浊响", "清晰", "凹陷", "硬滑", "是"],["青绿", "稍蜷", "浊响", "清晰", "稍凹", "软粘", "是"],["乌黑", "稍蜷", "浊响", "稍糊", "稍凹", "软粘", "是"],["乌黑", "稍蜷", "浊响", "清晰", "稍凹", "硬滑", "是"],["乌黑", "稍蜷", "沉闷", "稍糊", "稍凹", "硬滑", "否"],["青绿", "硬挺", "清脆", "清晰", "平坦", "软粘", "否"],["浅白", "硬挺", "清脆", "模糊", "平坦", "硬滑", "否"],["浅白", "蜷缩", "浊响", "模糊", "平坦", "软粘", "否"],["青绿", "稍蜷", "浊响", "稍糊", "凹陷", "硬滑", "否"],["浅白", "稍蜷", "沉闷", "稍糊", "凹陷", "硬滑", "否"],["乌黑", "稍蜷", "浊响", "清晰", "稍凹", "软粘", "否"],["浅白", "蜷缩", "浊响", "模糊", "平坦", "硬滑", "否"],["青绿", "蜷缩", "沉闷", "稍糊", "稍凹", "硬滑", "否"]],columns=["色泽", "根蒂", "敲声", "纹理", "脐部", "触感", "好瓜"])
取好坏瓜:
m2_bad = melon2[melon2['好瓜'] == '否']
m2_good = melon2[melon2['好瓜'] == '是']
求先验:
# # 好不好的先验
p_good_priori = (len(m2_good) + 1) / (len(melon2) + 2)
p_bad_priori = (len(m2_bad) + 1) / (len(melon2) + 2)
特征提取:
# # 各个特征的好、不好的拉普拉斯平滑:使用列表作为整体,每个特征实现一个字典
# 计数每个特征的值类别数
feature_num = melon2.shape[-1] - 1 # 全局性隐含特征序一致
features_name = [] # 特征的值的集合,这里一致,然后防止好瓜、坏瓜中没有相关的特征值
features_counts = [] # 特征的个数,可以拉普拉斯平滑的分母修正项
for ii in range(feature_num):features_name.append(set(melon2.iloc[:, ii]))features_counts.append(len(set(melon2.iloc[:, ii]))
features_name[{'乌黑', '浅白', '青绿'},{'硬挺', '稍蜷', '蜷缩'},{'沉闷', '浊响', '清脆'},{'模糊', '清晰', '稍糊'},{'凹陷', '平坦', '稍凹'},{'硬滑', '软粘'}]features_counts:[3, 3, 3, 3, 3, 2]
求P(*|好瓜):
# 好瓜部分
ps_feature_good = []
# 先对特征计数
for ii in range(feature_num):ps_feature_good.append(dict(m2_good.iloc[:, ii].value_counts())) # Series本质上就是字典
# 然后用拉普拉斯计算条件概率
for ii in range(feature_num):for ff in features_name[ii]: # 下一行的get防止出空ps_feature_good[ii][ff] = (ps_feature_good[ii].get(ff, 0) + 1) / (len(m2_good) + features_counts[ii])
求P(*|坏瓜):
# 坏瓜部分
ps_feature_bad = []
# 先对特征计数
for ii in range(feature_num):ps_feature_bad.append(dict(m2_bad.iloc[:, ii].value_counts()))
# 然后用拉普拉斯计算条件概率
for ii in range(feature_num):for ff in features_name[ii]:ps_feature_bad[ii][ff] = (ps_feature_bad[ii].get(ff, 0) + 1) / (len(m2_bad) + features_counts[ii])
预测好坏瓜的函数:
# # 预测的函数 好坏分开,连乘比大小
def predict(features):p_good = p_good_priorifor ii in range(feature_num):p_good *= ps_feature_good[ii][features[ii]]p_bad = p_bad_priorifor ii in range(feature_num):p_bad *= ps_feature_bad[ii][features[ii]]return '是' if p_good > p_bad else '否'
验证结果:
# 验证结果
for idx in melon2.index:print(predict(melon2.loc[idx]), melon2.loc[idx][-1],predict(melon2.loc[idx]) == melon2.loc[idx][-1])
输出:
是 是 True
是 是 True
是 是 True
是 是 True
是 是 True
是 是 True
否 是 False
是 是 True
否 否 True
否 否 True
否 否 True
否 否 True
是 否 False
否 否 True
是 否 False
否 否 True
否 否 True
这是老师给的代码,下一篇文章介绍本人自己的写的代码,欢迎阅读
朴素贝叶斯+拉普拉斯平滑代码实现相关推荐
- 斯坦福CS229机器学习笔记-Lecture5 - 生成学习算法+高斯判别GDA+朴素贝叶斯+拉普拉斯平滑
作者:teeyohuang 邮箱:teeyohuang@163.com 本文系原创,供交流学习使用,转载请注明出处,谢谢 声明:此系列博文根据斯坦福CS229课程,吴恩达主讲 所写,为本人自学笔记,写 ...
- 朴素贝叶斯 拉普拉斯平滑(Laplace Smoothing)
转自:https://blog.csdn.net/qq_25073545/article/details/78621019 拉普拉斯平滑(Laplace Smoothing)又被称为加 1 平滑,是比 ...
- multinormalNB多项式朴素贝叶斯原理及代码
https://blog.csdn.net/u011239443/article/details/76176743 multinormalNB多项式朴素贝叶斯原理及代码 https://www.cnb ...
- 朴素贝叶斯.Laplace平滑.多项式事件模型
<Andrew Ng 机器学习笔记>这一系列文章文章是我再观看Andrew Ng的Stanford公开课之后自己整理的一些笔记,除了整理出课件中的主要知识点,另外还有一些自己对课件内容的理 ...
- 机器学习之朴素贝叶斯模型及代码示例
一.朴素贝叶斯的推导 朴素贝叶斯学习(naive Bayes)是一种有监督的学习,训练时不仅要提供训练样本的特征向量X,而且还需提供训练样本的实际标记Y,是一种基于贝叶斯定理和特征条件独立假设的分类方 ...
- 朴素贝叶斯 分类算法——代码简洁
借助sklearn机器学习工具库 代码十分简洁易懂,直接上代码,内有详细解释和步骤. 这里提供伯努利朴素贝叶斯和高斯朴素贝叶斯两种算法代码. 直接复制,带入数据,进行调用,即可出结果. 01.伯努利朴 ...
- 学习笔记(01):机器学习之朴素贝叶斯理论与代码实践-朴素贝叶斯公式推导
立即学习:https://edu.csdn.net/course/play/24013/270221?utm_source=blogtoedu P(yi|x)为后验概率 p(x1|y)p(x2|y). ...
- 基于朴素贝叶斯实现文本分类
基于朴素贝叶斯实现文本分类 数据集介绍 数据集为网上公开的新闻数据,其中数据集包含10个类别. 模型选择 贝叶斯分类 贝叶斯公式 朴素贝叶斯 拉普拉斯平滑引入 某个属性的条件概率为0,则会导致整体概率 ...
- 朴素贝叶斯法分类器的Python3 实现
本篇文章是我在读了李航的<统计学习方法>后手写的算法实现之一 原理请参考统计学习方法第四章朴素贝叶斯法-李航 代码如下: # - * - coding: utf - 8 -*- # # 作 ...
- 机器学习实战——第四章(分类):朴素贝叶斯
前言 首先感谢博主:Jack-Cui 主页:http://blog.csdn.net/c406495762 朴素贝叶斯博文地址: https://blog.csdn.net/c406495762/ar ...
最新文章
- php不用密码登录,使用散列密码登录PHP
- Cloud for Customer的主页加载逻辑
- Linux必知必会的基本命令和部署项目流程
- Windows10+Ubuntu 18.04.2+ROS 安装笔记(SSD单硬盘)下
- 支撑全网70%世界杯流量 盘点世界杯直播背后的阿里云黑科技
- phpunit+selenium环境搭建
- 多线程的那点儿事(之windows锁)
- [转]MySQL实现over partition by(分组后对组内数据排序)
- 离线环境安装dotnet framework nuget包
- [翻译] RAReorderableLayout
- 音乐自动播放html代码大全,网页HTML音乐播放器代码大全
- azw3怎么在Mac电脑上打开?
- MATLAB struct函数(结构体数组)
- 苹果cms V8/V10定时任务百度主动URL推送设置教程 配合宝塔定时计划任务
- 史上最简单的Git入门教程
- Elasticsearch 跨机房灾备方案实战(一) —— 消息队列实现双写
- coursera python_如何最高效且自由地收看Coursera
- DDR和MIG使用小结
- php获取蓝凑云文件列表,【PHP】利用蓝奏网盘做个人小文件网盘和获取真实下载地址...
- /lib和/usr/lib的区别、/lib64与/usr/lib64的区别
热门文章
- Springboot毕设项目公共机房的值班管理系统wyz7b(java+VUE+Mybatis+Maven+Mysql)
- 常用电子面单接口API及对接攻略(快递鸟、菜鸟、顺丰)
- 重启服务器iis网站400,重启IIS服务的几种方法小结
- 重启iis最快速的方法
- Python学习笔记17:玩转千图成像
- java聊天室课程报告_java课程设计报告(java聊天室).doc
- 四大名著地图上线,邀您一起来体验!
- web开发规范 - 图片规范
- java 动态生成表格_js中动态生成表格
- cad编辑节点快捷键是什么_CAD所有快捷键