本文是李航老师的《统计学习方法》[1]一书的代码复现。

作者:黄海广[2]

备注:代码都可以在github[3]中下载。

我将陆续将代码发布在公众号“机器学习初学者”,敬请关注。

代码目录

  • 第 1 章 统计学习方法概论

  • 第 2 章 感知机

  • 第 3 章 k 近邻法

  • 第 4 章 朴素贝叶斯

  • 第 5 章 决策树

  • 第 6 章 逻辑斯谛回归

  • 第 7 章 支持向量机

  • 第 8 章 提升方法

  • 第 9 章 EM 算法及其推广

  • 第 10 章 隐马尔可夫模型

  • 第 11 章 条件随机场

  • 第 12 章 监督学习方法总结

代码参考:wzyonggege[4],WenDesi[5],火烫火烫的[6]

第 4 章 朴素贝叶斯

1.朴素贝叶斯法是典型的生成学习方法。生成方法由训练数据学习联合概率分布 ,然后求得后验概率分布。具体来说,利用训练数据学习和的估计,得到联合概率分布:

概率估计方法可以是极大似然估计或贝叶斯估计。

2.朴素贝叶斯法的基本假设是条件独立性,

这是一个较强的假设。由于这一假设,模型包含的条件概率的数量大为减少,朴素贝叶斯法的学习与预测大为简化。因而朴素贝叶斯法高效,且易于实现。其缺点是分类的性能不一定很高。

3.朴素贝叶斯法利用贝叶斯定理与学到的联合概率模型进行分类预测。

将输入分到后验概率最大的类。

后验概率最大等价于 0-1 损失函数时的期望风险最小化。

模型:

  • 高斯模型

  • 多项式模型

  • 伯努利模型

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inlinefrom sklearn.datasets import load_iris
from sklearn.model_selection import train_test_splitfrom collections import Counter
import math
# data
def create_data():iris = load_iris()df = pd.DataFrame(iris.data, columns=iris.feature_names)df['label'] = iris.targetdf.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']data = np.array(df.iloc[:100, :])# print(data)return data[:,:-1], data[:,-1]
X, y = create_data()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
X_test[0], y_test[0]
(array([5.1, 3.8, 1.9, 0.4]), 0.0)

参考:https://machinelearningmastery.com/naive-bayes-classifier-scratch-python/

GaussianNB 高斯朴素贝叶斯

特征的可能性被假设为高斯

概率密度函数:

数学期望(mean):

方差:

class NaiveBayes:def __init__(self):self.model = None# 数学期望@staticmethoddef mean(X):return sum(X) / float(len(X))# 标准差(方差)def stdev(self, X):avg = self.mean(X)return math.sqrt(sum([pow(x - avg, 2) for x in X]) / float(len(X)))# 概率密度函数def gaussian_probability(self, x, mean, stdev):exponent = math.exp(-(math.pow(x - mean, 2) /(2 * math.pow(stdev, 2))))return (1 / (math.sqrt(2 * math.pi) * stdev)) * exponent# 处理X_traindef summarize(self, train_data):summaries = [(self.mean(i), self.stdev(i)) for i in zip(*train_data)]return summaries# 分类别求出数学期望和标准差def fit(self, X, y):labels = list(set(y))data = {label: [] for label in labels}for f, label in zip(X, y):data[label].append(f)self.model = {label: self.summarize(value)for label, value in data.items()}return 'gaussianNB train done!'# 计算概率def calculate_probabilities(self, input_data):# summaries:{0.0: [(5.0, 0.37),(3.42, 0.40)], 1.0: [(5.8, 0.449),(2.7, 0.27)]}# input_data:[1.1, 2.2]probabilities = {}for label, value in self.model.items():probabilities[label] = 1for i in range(len(value)):mean, stdev = value[i]probabilities[label] *= self.gaussian_probability(input_data[i], mean, stdev)return probabilities# 类别def predict(self, X_test):# {0.0: 2.9680340789325763e-27, 1.0: 3.5749783019849535e-26}label = sorted(self.calculate_probabilities(X_test).items(),key=lambda x: x[-1])[-1][0]return labeldef score(self, X_test, y_test):right = 0for X, y in zip(X_test, y_test):label = self.predict(X)if label == y:right += 1return right / float(len(X_test))
model = NaiveBayes()
model.fit(X_train, y_train)
'gaussianNB train done!'
print(model.predict([4.4,  3.2,  1.3,  0.2]))
0.0
model.score(X_test, y_test)
1.0

scikit-learn 实例

from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
clf.fit(X_train, y_train)
GaussianNB(priors=None, var_smoothing=1e-09)
clf.score(X_test, y_test)
1.0
clf.predict([[4.4,  3.2,  1.3,  0.2]])
array([0.])

参考资料

[1] 《统计学习方法》: https://baike.baidu.com/item/统计学习方法/10430179
[2] 黄海广: https://github.com/fengdu78
[3] github: https://github.com/fengdu78/lihang-code
[4] wzyonggege: https://github.com/wzyonggege/statistical-learning-method
[5] WenDesi: https://github.com/WenDesi/lihang_book_algorithm
[6] 火烫火烫的: https://blog.csdn.net/tudaodiaozhale

关于本站

“机器学习初学者”公众号由是黄海广博士创建,黄博个人知乎粉丝23000+,github排名全球前100名(33000+)。本公众号致力于人工智能方向的科普性文章,为初学者提供学习路线和基础资料。原创作品有:吴恩达机器学习个人笔记、吴恩达深度学习笔记等。

往期精彩回顾

  • 那些年做的学术公益-你不是一个人在战斗

  • 适合初学者入门人工智能的路线及资料下载

  • 吴恩达机器学习课程笔记及资源(github标星12000+,提供百度云镜像)

  • 吴恩达深度学习笔记及视频等资源(github标星8500+,提供百度云镜像)

  • 《统计学习方法》的python代码实现(github标星7200+)

  • 机器学习的数学精华(在线阅读版)

备注:加入本站微信群或者qq群,请回复“加群

复现经典:《统计学习方法》第 4 章 朴素贝叶斯相关推荐

  1. 统计学习方法第四章朴素贝叶斯法-李航

    第4章 朴素贝叶斯法 朴素贝叶斯 (naive Bayes) 法是基于贝叶斯定理与特征条件独立假设的分类方法.对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布:然后基于此模型 ...

  2. 《统计学习方法》读书笔记——朴素贝叶斯法(公式推导+代码实现)

    传送门 <统计学习方法>读书笔记--机器学习常用评价指标 <统计学习方法>读书笔记--感知机(原理+代码实现) <统计学习方法>读书笔记--K近邻法(原理+代码实现 ...

  3. 机器学习理论《统计学习方法》学习笔记:第四章 朴素贝叶斯法

    机器学习理论<统计学习方法>学习笔记:第四章 朴素贝叶斯法 4 朴素贝叶斯法 4.1 朴素贝叶斯法的学习与分类 4.1.1 基本方法 4.1.2 后验概率最大化的含义 4.2 朴素贝叶斯法 ...

  4. 【机器学习实战】第4章 朴素贝叶斯(Naive Bayes)

    第4章 基于概率论的分类方法:朴素贝叶斯 朴素贝叶斯 概述 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类.本章首先介绍贝叶斯分类算法的基础--贝叶斯定理.最后,我们 ...

  5. (视频+图文)机器学习入门系列-第4章 朴素贝叶斯

    机器学习入门系列,黄海广老师主讲.本站将持续更新,ppt.代码.课后习题见文末. 本系列的目录 01.引言 02.回归 03.逻辑回归 04.朴素贝叶斯 05.机器学习实践 06.机器学习库Sciki ...

  6. 《统计学基础》——第四章(朴素贝叶斯)

    文章目录 1. 朴素贝叶斯法的学习与分类 1.1 基本方法 1.2 后验最大化含义 2. 朴素贝叶斯的参数估计 2.1 公式推导 3. 面试常见问题 3.1 朴素贝叶斯与LR的区别? 3.2 在估计条 ...

  7. 《机器学习实战》学习笔记之第四章朴素贝叶斯进行文档分类

    朴素贝叶斯有两个假设: 1."朴素":特征之间相互独立,单词出现的概率相同,当然这个假设不合理 2."权重相同":每个特征等同重要,这个假设也不太合理 尽管如此 ...

  8. 第四章 朴素贝叶斯-垃圾邮件过滤

    #朴素贝叶斯之垃圾邮件过滤 import os #----------------------1.获取数据集----------------------- import pandas as pd''' ...

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

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

最新文章

  1. 超好用的Swift 4.0 字符截取快速便捷方法
  2. spring:《spring实战》读后感一
  3. linux进程的堆栈空间_代码段(指令,只读)、数据段(静态变量,全局变量)、堆栈段(局部变量)、栈【转】...
  4. C++ Primer 5th笔记(chap 17 标准库特殊设施)正则表达式
  5. html云雾效果,PS中怎么做像这样的云雾效果?(有图)?
  6. 顺序一致性内存模型与JMM的“顺序一致性”
  7. Ubuntu定制live cd
  8. arm汇编和c语言混合编程实验报告,实验三C语言和ARM汇编混合编程指导书.doc
  9. java兵临城下_再谈java事件监听机制
  10. MYQQ复活版 20220801
  11. 学习Java需要掌握哪些知识,初学者必备
  12. 最新大淘客php加淘口令,淘口令转淘口令
  13. 机器学习:AI数据集划分(训练集、验证集、测试集)
  14. 电子琴节奏包制作_MIDI音乐制作基础必备
  15. English trip V2 - 8 Holidays and Birthdays Teacher:Julia Key: at on in
  16. 财报解读:硬件支撑思科增长,云平台何时能突围?
  17. 古代益智游戏汉诺塔java解决
  18. download.js 实现浏览器下载 而不是打开
  19. c语言平时成绩占总分多少,平时成绩占多少啊 大学
  20. [蓝桥杯][历届试题 PREV-50]对局匹配(Java)(动态规划)

热门文章

  1. 团队作业10——复审与事后分析(Beta版本)
  2. 经典排序算法 - 冒泡排序Bubble sort
  3. QTP之对测试用例的自动化过程的分解
  4. [转]RFC 2866 RADIUS Accounting -中文翻译
  5. GraphPad Prism 教程 :标准差与平均值的标准误差有什么区别
  6. 27对象的向上向下转型
  7. 原创:pta做题笔记:注意数组大小大一点!//准考证号,试机座位,考试座位查询
  8. python字符串截取_Python-变量-No3
  9. 机器人学习--全局定位(阿尔伯塔大学张宏教授报告)
  10. html 如何用图片代替单选按钮,HTML中图像代替提交按钮