手撕代码

  • 计算步骤:
  • 数据的读取
  • 取好坏瓜:
  • 求先验:
  • 特征提取:
  • 求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

这是老师给的代码,下一篇文章介绍本人自己的写的代码,欢迎阅读

朴素贝叶斯+拉普拉斯平滑代码实现相关推荐

  1. 斯坦福CS229机器学习笔记-Lecture5 - 生成学习算法+高斯判别GDA+朴素贝叶斯+拉普拉斯平滑

    作者:teeyohuang 邮箱:teeyohuang@163.com 本文系原创,供交流学习使用,转载请注明出处,谢谢 声明:此系列博文根据斯坦福CS229课程,吴恩达主讲 所写,为本人自学笔记,写 ...

  2. 朴素贝叶斯 拉普拉斯平滑(Laplace Smoothing)

    转自:https://blog.csdn.net/qq_25073545/article/details/78621019 拉普拉斯平滑(Laplace Smoothing)又被称为加 1 平滑,是比 ...

  3. multinormalNB多项式朴素贝叶斯原理及代码

    https://blog.csdn.net/u011239443/article/details/76176743 multinormalNB多项式朴素贝叶斯原理及代码 https://www.cnb ...

  4. 朴素贝叶斯.Laplace平滑.多项式事件模型

    <Andrew Ng 机器学习笔记>这一系列文章文章是我再观看Andrew Ng的Stanford公开课之后自己整理的一些笔记,除了整理出课件中的主要知识点,另外还有一些自己对课件内容的理 ...

  5. 机器学习之朴素贝叶斯模型及代码示例

    一.朴素贝叶斯的推导 朴素贝叶斯学习(naive Bayes)是一种有监督的学习,训练时不仅要提供训练样本的特征向量X,而且还需提供训练样本的实际标记Y,是一种基于贝叶斯定理和特征条件独立假设的分类方 ...

  6. 朴素贝叶斯 分类算法——代码简洁

    借助sklearn机器学习工具库 代码十分简洁易懂,直接上代码,内有详细解释和步骤. 这里提供伯努利朴素贝叶斯和高斯朴素贝叶斯两种算法代码. 直接复制,带入数据,进行调用,即可出结果. 01.伯努利朴 ...

  7. 学习笔记(01):机器学习之朴素贝叶斯理论与代码实践-朴素贝叶斯公式推导

    立即学习:https://edu.csdn.net/course/play/24013/270221?utm_source=blogtoedu P(yi|x)为后验概率 p(x1|y)p(x2|y). ...

  8. 基于朴素贝叶斯实现文本分类

    基于朴素贝叶斯实现文本分类 数据集介绍 数据集为网上公开的新闻数据,其中数据集包含10个类别. 模型选择 贝叶斯分类 贝叶斯公式 朴素贝叶斯 拉普拉斯平滑引入 某个属性的条件概率为0,则会导致整体概率 ...

  9. 朴素贝叶斯法分类器的Python3 实现

    本篇文章是我在读了李航的<统计学习方法>后手写的算法实现之一 原理请参考统计学习方法第四章朴素贝叶斯法-李航 代码如下: # - * - coding: utf - 8 -*- # # 作 ...

  10. 机器学习实战——第四章(分类):朴素贝叶斯

    前言 首先感谢博主:Jack-Cui 主页:http://blog.csdn.net/c406495762 朴素贝叶斯博文地址: https://blog.csdn.net/c406495762/ar ...

最新文章

  1. php不用密码登录,使用散列密码登录PHP
  2. Cloud for Customer的主页加载逻辑
  3. Linux必知必会的基本命令和部署项目流程
  4. Windows10+Ubuntu 18.04.2+ROS 安装笔记(SSD单硬盘)下
  5. 支撑全网70%世界杯流量 盘点世界杯直播背后的阿里云黑科技
  6. phpunit+selenium环境搭建
  7. 多线程的那点儿事(之windows锁)
  8. [转]MySQL实现over partition by(分组后对组内数据排序)
  9. 离线环境安装dotnet framework nuget包
  10. [翻译] RAReorderableLayout
  11. 音乐自动播放html代码大全,网页HTML音乐播放器代码大全
  12. azw3怎么在Mac电脑上打开?
  13. MATLAB struct函数(结构体数组)
  14. 苹果cms V8/V10定时任务百度主动URL推送设置教程 配合宝塔定时计划任务
  15. 史上最简单的Git入门教程
  16. Elasticsearch 跨机房灾备方案实战(一) —— 消息队列实现双写
  17. coursera python_如何最高效且自由地收看Coursera
  18. DDR和MIG使用小结
  19. php获取蓝凑云文件列表,【PHP】利用蓝奏网盘做个人小文件网盘和获取真实下载地址...
  20. /lib和/usr/lib的区别、/lib64与/usr/lib64的区别

热门文章

  1. Springboot毕设项目公共机房的值班管理系统wyz7b(java+VUE+Mybatis+Maven+Mysql)
  2. 常用电子面单接口API及对接攻略(快递鸟、菜鸟、顺丰)
  3. 重启服务器iis网站400,重启IIS服务的几种方法小结
  4. 重启iis最快速的方法
  5. Python学习笔记17:玩转千图成像
  6. java聊天室课程报告_java课程设计报告(java聊天室).doc
  7. 四大名著地图上线,邀您一起来体验!
  8. web开发规范 - 图片规范
  9. java 动态生成表格_js中动态生成表格
  10. cad编辑节点快捷键是什么_CAD所有快捷键