首页 > 编程语言 >[机器学习] sklearn朴素贝叶斯算法

[机器学习] sklearn朴素贝叶斯算法

时间:2022-12-18 23:45:23浏览次数:70  
标签:脚掌 sklearn 贝叶斯 算法 身高 朴素 times

朴素贝叶斯算法是来利用统计学中的条件概率来进行分类的一种算法。贝叶斯定理和特征条件独立假设就是朴素贝叶斯的两个重要理论基础。

贝叶斯定理

贝叶斯定理如下:

因此上述的公式可以变为

朴素贝叶斯计算

P(B)计算公式如下,由公式可知P(B)为标准化常量,因此P(B)在朴素贝叶斯概率计算中可以省略。因为朴素贝叶斯算法是分类算法,通过比较各个情况发生下的概率的大小,来确定最后的分类,去掉P(B)不影响最后结果。

\[P(B)=\sum_{i=1}^{n}P(x|D_{i})P(D_{i}) \]

又因为朴素贝叶斯算法对条件概率分布作出了独立性的假设。即\(x_{1},x_{2},...,x_{n}\)相互独立则

\[P(x|D_{j})=P(x_{1},x_{2},...,x_{n}|D_{j})=\prod_{i=1}^{n}P(x_{i}|D_{j}) \]

因此朴素贝叶斯算法的分类函数\(f(x)\)可以表示为

\[f(x)=P(D_{j}|x)=argmax P(D_{j})\prod_{i=1}^{n}P(x_{i}|D_{j}) \]

关于朴素贝叶斯分类,根据\(P(x_{i}|y_{k}),P(y_{k})\)的不同计算方法,sklearn库中主要以下三种计算模型:

  • 高斯朴素贝叶斯,主要基于高斯概率密度公式用于分类拟合
  • 多项式朴素贝叶斯,主要用于高维度向量分类
  • 伯努利朴素贝叶斯,主要针对布尔型类型进行分类

高斯朴素贝叶斯计算

当特征X是连续变量的时候,通常假定所有特征取值符合正态分布。用高斯朴素贝叶斯计算概率,即:

\[P(x_{i}|D_{j})=\frac{1}{\sqrt{2\pi\sigma_{ {j,k}}^{2}}}e^{-\frac{(x_{i}-\mu_{ {j,k}})^{2}}{2 \sigma_{ {j,k}}^{2}}} \]

例如下表为一组人类身体特征统计表:

性别 身高(英尺) 体重(磅) 脚掌(英寸)
6 180 12
5.92 190 11
5.58 170 12
5.92 165 10
5 100 6
5.5 150 8
5.42 130 7
5.75 150 9

已知某人身高6英尺,体重130磅,脚掌8英寸,请问该人是男是女。根据前面的朴素贝叶斯分类公式,有:

\[f(x)=P(性别) \times P(身高,体重,脚掌|性别) = P(性别) \times P(身高|性别) \times P(体重|性别) \times P(脚掌|性别) \]

由于身高、体重、脚掌都是连续变量,不能采用离散变量的方法计算概率。而且由于样本太少,所以也无法分成区间计算。这时,可以假设男性和女性的身高、体重、脚掌都是正态分布,通过样本计算出均值和方差,也就是得到正态分布的密度函数。有了密度函数,就可以把值代入,算出某一点的密度函数的值。比如,男性的身高是均值5.855、方差0.035的正态分布。所以,男性的身高为6英尺的概率的相对值等于1.5789(大于1并没有关系,因为这里是密度函数的值,只用来反映各个值的相对可能性)。

例如

\[ P(男) \times P(身高=6|男) \times P(体重=130|男) \times P(脚掌=8|男) = 0.5 \times 1.57888 \times 5.99 \times e^{-6} \times 0.001311 = 6.1984 \times e^{-9}\]

\[P(女) \times P(身高=6|女) \times P(体重=130|女) \times P(脚掌=8|女) = 5.3778 \times e^{-4} \]

可以看到,女性的概率比男性要高出将近10000倍,所以判断该人为女性。sklearn中对应的函数为GaussianNB(),代码如下

import numpy as np
from sklearn.naive_bayes import GaussianNB
 
X = np.array([[6 , 5.92, 5.58, 5.92, 5, 5.5, 5.42, 5.75],
            [180, 190, 170, 165, 100, 150, 130, 150],
            [12, 11, 12, 10, 6, 8, 7, 9]])
X = X.T
y = np.array([-1, -1, -1, -1, 1, 1, 1, 1]) #-1表示男,1表示女
 
clf = GaussianNB().fit(X, y)
 
#预测
p = [[6, 130, 8]]
print(clf.predict_proba(p)) #输出各个标签的概率值,取最大的概率值为输出标签
print(clf.predict(p)) #结果为1

函数其他参数改动可参考官网文档:sklearn.naive_bayes.GaussianNB。接下来介绍其他几种模型结构。

多项式模型

\[P(D_{j})=\frac{N_{D_{j}}+\alpha}{N+k\alpha} \]

\(N\)是总样本个数,\(k\)是类别D中总的类别个数(j=[1, k]),\(N_{D_{j}} \)为\(D_{j}\)的样本个数,α为平滑值,α=[0,1]

\[P(x_{i}|D_{j})=\frac{N_{D_{j},x_{i}}+\alpha}{N_{D_{j}}+(n_{x_{i}})\alpha} \]

\(n_{x_{i}}\)是特征x的维数,\(N_{D_{j},x_{i}}\)是类别\(N_{D_{j}}\)的样本中,第\(i\)维特征的值为\(x_{i}\)的样本个数。sklearn中对应的函数为MultinomialNB,类似于GaussianNB()。代码如下

clf = MultinomialNB().fit(X, y)

函数其他参数改动可参考官网文档:sklearn.naive_bayes.MultinomialNB

伯努利模型

伯努利模型基于以下公式:

  • 当\(x_{i}=1, P(x_{i}|D_{j})=P(x_{i}=1|D_{j})\)
  • 当\(x_{i}=0, P(x_{i}|D_{j})=1-P(x_{i}=1|D_{j})\)

其中\(x_{i}\)只能为0或者-1

sklearn中对应的函数为BernoulliNB,类似于GaussianNB()。代码如下

from sklearn.naive_bayes import BernoulliNB
import numpy as np
 
X = np.random.randint(2, size=(6, 100))
Y = np.array([1, 2, 3, 4, 4, 5])
 
clf = BernoulliNB().fit(X, Y)
p = [X[2]]
print(clf.predict(p)) #[3]

函数其他参数改动可参考官网文档:sklearn.naive_bayes.BernoulliNB

想要了解更多知识见朴素贝叶斯理论推导与三种常见模型

标签:脚掌,sklearn,贝叶斯,算法,身高,朴素,times
From: https://www.cnblogs.com/luohenyueji/p/16991284.html

相关文章

  • [机器学习] sklearn聚类
    聚类(Clustering)简单来说就是一种分组方法,将一类事物中具有相似性的个体分为一类,将另一部分比较相近的个体分为另一类。例如人和猿都是灵长目动物,但是根据染色体数目不同可......
  • 【JVM】三色标记算法
    本文已收录至Github,推荐阅读......
  • java算法视频深度讲解
    1.java冒泡排序算法  ​​点击打开链接​​2.java选择排序算法  ​​点击打开链接​​......
  • 贝叶斯
    一、概述1.1数学公式     二、利用贝叶斯进行文本分析2.1文本向量化对数据进行预处理,进行分词,并把文本向量化是贝叶斯算法的关键也是难点。分词可以参考......
  • 二分图与染色算法
    二分图的概念二分图就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。    染色法概......
  • C#二分查找算法实例分析
    原文链接:https://www.jb51.net/article/65006.htminternalclassProgram{staticvoidMain(string[]args){Programprogram=newProgram();......
  • 数据结构算法 之 二分查找法(LC)
    原文链接:https://blog.csdn.net/Luckyzhoufangbing/article/details/110389523(一)定义二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。二分法查找的思......
  • Hash 算法详细介绍与实现 (二)
    前言书接上回,昨天写了第一部分,《​​Hash算法详细介绍与实现(一)​​》详细介绍了Hash表和Hash算法的相关概念以及算法的基本原理。同时简单介绍几种hash算法的实现:直接......
  • Hash 算法详细介绍与实现 (二)
    前言书接上回,昨天写了第一部分,《​​Hash算法详细介绍与实现(一)​​》详细介绍了Hash表和Hash算法的相关概念以及算法的基本原理。同时简单介绍几种hash算法的实现:直接......
  • 【算法实践】手把手带你快速实现插入排序
    前言每学习一个新东西总要首先知道他是什么,能做什么,怎么做,类似于哲学中的三大问题:我是谁,从哪里来,要到哪里去。或许我们一直徘徊在哲学的迷思中,也许一直想不明白,但是在思考的......