背景与原理:

朴素贝叶斯算法是机器学习领域最经典的算法之一,仍然是用来解决分类问题的。

那么对于分类问题,我们的模型始终是:用$m$组数据,每条数据形如$(x_{1},...,x_{n},y)$,表示数据共有$n$个特征维度,而$y$表示该数据所属的类别,不妨设有$k$个取值$C_{1},...,C_{k}$

我们想一想,当我们谈论分类问题的时候,我们究竟在谈论什么?

从一个角度来理解,我们实际上是在研究:当给定了$X=x$的条件下,求概率$P(y=C_{i})$,而我们对分类的预测实际上就是使得$P(y=C_{i})$最大的$C_{i}$!

那么我们实际想求出的是$P(y=C_{i}|X=x)$这样的一个条件概率。

我们需要一些数学原理:

贝叶斯公式:$P(X|Y)=\dfrac{P(Y|X)P(X)}{P(Y)}$

这个公式的逻辑是很简单的:$P(X\cap Y)=P(X|Y)P(Y)=P(Y|X)P(X)$,即两个事件同时发生的概率始终等于一个事件在另一个事件发生条件下的概率乘以另一个事件发生的概率。

而基于这个逻辑,我们有:

$P(y=C_{i}|X=x)=\dfrac{P(X=x|y=C_{i})P(y=C_{i})}{P(X=x)}$

而我们再要求$X$的各个特征是彼此独立的,那么我们有:

$P(X=x|y=C_{i})=\prod_{j=1}^{n}P(X_{j}=x_{j}|y=C_{i})$

于是我们有最终的表达式:

$P(y=C_{i}|X=x)=\dfrac{\prod_{j=1}^{n}P(X_{j}=x_{j}|y=C_{i}) P(y=C_{i})}{P(X=x)}$

而我们想要的是:

$argmax_{C_{i}}\dfrac{\prod_{j=1}^{n}P(X_{j}=x_{j}|y=C_{i}) P(y=C_{i})}{P(X=x)}$

可以看到,对不同的$C_{i}$,上式的分母是相同的,那么我们将其省略,就得到了:

$argmax_{C_{i}}P(y=C_{i})\prod_{j=1}^{n}P(X_{j}=x_{j}|y=C_{i}) $

这就是我们真正想求的东西

那么$P(y=C_{i})$是多少呢?它是一个无关条件的先验概率,那么我们可以估计其为数据集中类别为$C_{i}$的数据出现的频率,即出现次数与数据集大小之比。那么我们设数据集中类别为$C_{i}$的数据有$c_{i}$条,那么我们有:

$P(y=C_{i})=\dfrac{c_{i}}{m}$(其中$m$为数据集大小)

但是如果我们数据集选取的很不好,某一个类别虽然我们的先验知识告诉我们有,但数据集中却没有这一个分类,这只能说明这个类别出现概率可能比较小,但并不意味着一定不会出现,所以我们需要给一个补偿项,我们选取一个常数$\lambda$,有:

$P(y=C_{i})=\dfrac{c_{i}+\lambda}{m+k\lambda}$(其中$k$为类别数,相当于对每一类我们都人工添加了$\lambda$个属于这一类的数据)

这样兜兜转转,我们发现不太好求出的实际上是$P(X_{j}=x_{j}|y=C_{i})$

那么怎么求呢?如果$X_{j}$是一个离散的量,那么我们只需再次引入贝叶斯公式:

$P(X_{j}=x_{j}|y=C_{i})=\dfrac{P(X_{j}=x_{j},y=C_{i})}{P(y=C_{i})}$

这样我们只需统计在原数据集中$X_{j}=x_{j}$且$y=C_{i}$的数据集出现的频率近似为概率再除以$y=C_{i}$出现的概率就好了。

当然,和上面的情况一样,我们同样可能会遇到倒霉的情况,即这种数据没有出现在数据集中,那我们当然也不能直接认为这种概率是零,那么和上述处理类似地引入拉普拉斯平滑,选取一个常数$\lambda$(通常为1),此时有:

$P(X_{j}=x_{j}|y=C_{i})=\dfrac{\sum_{p=1}^{m}[X_{j}=x_{j},y=C_{i}]+\lambda}{\sum_{p=1}^{m}[y=C_{i}]+O_{j}\lambda}$

这里的记号$[...]$表示如果中括号里内容为真取值为1,否则取值为0,而$O_{j}$是特征$j$的取值个数

但是...如果特征是连续的呢?

那么我们会认为这样的分布服从正态分布,即这个条件概率为:

$P(X_{j}=x_{j}|y=C_{i})=\dfrac{1}{\sqrt{2\pi \sigma_{i}^{2}}}e^{-\frac{(x_{j}-\mu_{i})^{2}}{2\sigma_{i}^{2}}}$

即我们认为在$y=C_{i}$的条件下,所有的$X_{j}$的分布服从均值为$\mu_{i}$,方差为$\sigma_{i}^{2}$的正态分布,而这个均值与方差可以通过极大似然估计求得。

这样我们就解决了所有的问题。

代码实现:

import numpy as np
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import LinearSVC
import matplotlib.pyplot as plt
import pylab as plt
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split X,y=datasets.make_classification(n_samples=10000,n_features=20,n_informative=2,n_redundant=2)
X_train,X_test,Y_train,Y_test=train_test_split(X,y,test_size=0.25) lr=LogisticRegression()
svc=LinearSVC(C=1.0)
rfc=RandomForestClassifier(n_estimators=100)#森林中树的个数 lr=lr.fit(X_train,Y_train)
score1=lr.score(X_test,Y_test)
print(score1) svc=svc.fit(X_train,Y_train)
score2=svc.score(X_test,Y_test)
print(score2) rfc=rfc.fit(X_train,Y_train)
score3=rfc.score(X_test,Y_test)
print(score3) gnb=GaussianNB()
gnb=gnb.fit(X_train,Y_train)
score4=gnb.score(X_test,Y_test)
print(score4) y_pred=gnb.predict_proba(X_test)
print(y_pred[:10])

这是在上一篇博客基础上对四种分类器的对比,在sklearn中朴素贝叶斯分类器主要有三种:高斯朴素贝叶斯GaussianNB,多项式朴素贝叶斯MultinomialNB和伯努利朴素贝叶斯BernoulliNB,高斯朴素贝叶斯用于处理特征是连续值的情况,而多项式朴素贝叶斯用于处理特征是离散值的情况,而伯努利朴素贝叶斯则用于处理特征只有0/1的情况。

这里我们使用sklearn自带的高斯朴素贝叶斯对与前文类似生成的数据集进行分类并对比分类效果,可以看到由于朴素贝叶斯对特征的分布有严格的要求(独立、正态等),因此分类效果相较别的分类器相对较差,但是朴素贝叶斯的训练效率比较高,而且可解释性也比较好,这是朴素贝叶斯的优点所在。

小结与优化:

朴素贝叶斯由于基础要求太高,导致很多情况下分类效果并不好,那么为了解决这个问题,人们作出了一些优化。比如针对要求各个维度相互独立的要求,一种方法是在朴素贝叶斯基础上增加属性间可能存在的依赖关系,另一种则是重新构建数据集,通过变换等手段将原来相关的属性变为独立的属性。最著名的优化方法是TAN算法,通过发现属性间的依赖关系来降低独立性假设。

python机器学习——朴素贝叶斯算法的更多相关文章

  1. 机器学习---用python实现朴素贝叶斯算法(Machine Learning Naive Bayes Algorithm Application)

    在<机器学习---朴素贝叶斯分类器(Machine Learning Naive Bayes Classifier)>一文中,我们介绍了朴素贝叶斯分类器的原理.现在,让我们来实践一下. 在 ...

  2. Python机器学习笔记:朴素贝叶斯算法

    朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法.对于大多数的分类算法,在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同.比如决策树,KNN,逻辑回归,支持向 ...

  3. Python机器学习算法 — 朴素贝叶斯算法(Naive Bayes)

    朴素贝叶斯算法 -- 简介 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法.最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Baye ...

  4. 机器学习:python中如何使用朴素贝叶斯算法

    这里再重复一下标题为什么是"使用"而不是"实现": 首先,专业人士提供的算法比我们自己写的算法无论是效率还是正确率上都要高. 其次,对于数学不好的人来说,为了实 ...

  5. 朴素贝叶斯算法的python实现

    朴素贝叶斯 算法优缺点 优点:在数据较少的情况下依然有效,可以处理多类别问题 缺点:对输入数据的准备方式敏感 适用数据类型:标称型数据 算法思想: 朴素贝叶斯比如我们想判断一个邮件是不是垃圾邮件,那么 ...

  6. 朴素贝叶斯算法--python实现

    朴素贝叶斯算法要理解一下基础:    [朴素:特征条件独立   贝叶斯:基于贝叶斯定理] 1朴素贝叶斯的概念[联合概率分布.先验概率.条件概率**.全概率公式][条件独立性假设.]   极大似然估计 ...

  7. 朴素贝叶斯算法原理及Spark MLlib实例(Scala/Java/Python)

    朴素贝叶斯 算法介绍: 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,在没有其它可用信息下,我 ...

  8. 朴素贝叶斯算法的python实现方法

    朴素贝叶斯算法的python实现方法 本文实例讲述了朴素贝叶斯算法的python实现方法.分享给大家供大家参考.具体实现方法如下: 朴素贝叶斯算法优缺点 优点:在数据较少的情况下依然有效,可以处理多类 ...

  9. 什么是机器学习的分类算法?【K-近邻算法(KNN)、交叉验证、朴素贝叶斯算法、决策树、随机森林】

    1.K-近邻算法(KNN) 1.1 定义 (KNN,K-NearestNeighbor) 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类 ...

  10. 朴素贝叶斯算法下的情感分析——C#编程实现

    这篇文章做了什么 朴素贝叶斯算法是机器学习中非常重要的分类算法,用途十分广泛,如垃圾邮件处理等.而情感分析(Sentiment Analysis)是自然语言处理(Natural Language Pr ...

随机推荐

  1. vue用echarts不显示

    在html页面中套vue的情况来使用echarts,或者单独vue使用echarts,出现页面不渲染图表,代码渲染有的情况,加个this.$nextTick(()=>{})让他主动渲染一下就可以 ...

  2. Pytorch实战学习(一):用Pytorch实现线性回归

    <PyTorch深度学习实践>完结合集_哔哩哔哩_bilibili P5--用Pytorch实现线性回归 建立模型四大步骤 一.Prepare dataset mini-batch:x.y ...

  3. Java多线程编程技术方案原理

    一 ,多线程相关的一些概念 1,线程和进程: 线程指的是进程中一个单一顺序的控制流, 进程中可以并发多个线程,每条线程并行执行不同的任务,被认为是一个计算资源的集合.进程不能被任务是一个应用,因为有些 ...

  4. vue3.0 dialog无法弹出的问题

    最近用elementui做了点东西,一直感觉挺好的,但是嫖的别人的框架是vue3.0,这次的dialog就弹不出来了. 经过多方查证,发现vue3.0的element为了适配移动端升级为element ...

  5. 技嘉b75m-d3v在nvme固态安装win7并且oem激活的实现过程

    本篇文章主要讲述了实现台式机主板oem激活win7以及旧平台主板使用nvme固态安装win7的过程 事情的起因是我去年在小黄鱼买了台戴尔n4110,今年买了台惠普银河舰队2代,并且把里面128GB的n ...

  6. EBS的配置文件

    默认账套 select fnd_profile.value('GL_SET_OF_BKS_ID') FROM DUAL; >> 2026 这样就能通过2026去获取一些账套上的配置 比如c ...

  7. NSQ(7)-nsq存在的问题

    nsq存在的缺陷 部署的难度 ​ nsq提供了一种消费者端进行服务发现的模型,所以无需告诉消费者去哪寻找对于的主题(Topic)在哪个nsqd实例上. ​ 然而,它并没有提供一种方案去解决一个生产者应 ...

  8. ESXi 基础安全加强(ing...)

    # 查看防火墙规则esxcli network firewall ruleset allowedip list # 允许指定ip使用web服务和客户端访问[root@localhost:~] esxc ...

  9. CSS中的选择( ::selection和user-select)

      CSS中的选择( ::selection和user-select) 在网络上,我们出于不同原因选择内容,也许我们想复制文本并在某处引用它.对于移动端来说,选择内容比较难,我不喜欢在移动端选择内容. ...

  10. Navie UI

    开发文档 一个 Vue 3 组件库, 它比较完整,主题可调,用 TypeScript 写的,快.