模式识别之贝叶斯---朴素贝叶斯(naive bayes)算法及实现
处女文献给我最喜欢的算法了 ⊙▽⊙
---------------------------------------------------我是机智的分割线----------------------------------------------------
[important]
阅读之前你需要了解:1、概率论与数理统计基础
2、基本的模式识别概念
[begin]
贝叶斯决策论是模式分类问题最基础的概念,其中朴素贝叶斯更是由于其简洁成为学习模式分类问题的基础。
朴素贝叶斯的理论基础:源于概率论中的贝叶斯公式:P(wj|x)=p(x|wj)P(wj)p(x),其中wj代表类别j,x代表特征。
我们将P(wj)称为先验概率,p(x|wj)称为条件概率。
目的:对于一系列事物我们已知他们的特征向量X(x1,x2,x3.....),以及他们一定属于类别集W={w1,w2,w3.....}中的某
一类,根据以上知识给出一个确定取值的特征向量X的事物,判断它的类别。
/*如:给定几个学生的特征及类别:
| 身高(cm) | 体重(kg) | 性别 |
| 171 | 56 | 男 |
| 168 | 48 | 女 |
| 175 | 55 | 男 |
| 165 | 50 | 女 |
根据以上知识,现在有一身高为169cm,体重49kg的学生,判断性别。
*/
思路:当前我们的知识只有有限个已知的特征及类别(我们称之为训练集),根据他们来判断给定特征集合的类别(我
们称之为测试集)
step1:假设我们已知学生中的男女比例为2:1,那么当我们遇到一个学生是男生的概率是2/3,女生的概率
是1/3。这是我们唯一可以利用的信息,当新来一个同学时,在观察之前需要我们立即给出判断,那么我们似乎可
以遵循这样的判别规则:若P(w|w=男)>P(w|w=女),则判定为男,否则判定为女。在一次判断中,
这种规则是合理的,但当我们进行多次判断时,会发现会一直得到相同的结果。显然,单一的判断条件并不能给我
们有效的解决问题的方法。
step2:在实际的判断过程中我们并不会只利用单一的信息,我们再引入学生的身高信息,来提高我们判断的
准确性。假定身高x是一个连续的随机变量,其分布取决于性别的状态,表示成p(x|w),这就是条件概率密度函数。
表示类别为w时x的概率密度函数。因此,p(x|ww=男)与p(x|ww=女)的区别就表示了男生与女
生在身高上的区别。
step3:现在,假设我们已经知道了先验概率p(w1),p(w2)/*w1代表男生类别,w2代表女
生类别*/,也知道了条件概率密度p(x|wj)(j=1,2)。那么处于类别wj,并具有特征值x的模式的联合概率
密度我们可以写成以下形式p(wj,x)=P(wj|x)p(x)=p(x|wj)P(wj),整理上式,我们就可以得到贝叶斯公
式P(wj|x)=p(x|wj)P(wj)p(x)。在两类问题中p(x)=∑2j=1p(x|wj)P(wj),
这就是贝叶斯公式在分类问题中的解释。
step4:观察贝叶斯公式我们可以发现 ,通过观测x的值我们可以将先验概率P(wj)转化为后验概率的形式P(wj|x)
即假设特征值x已知的条件下类别属于wj的概率。我们又称p(x|wj)为wj关于x的似然函数,即
在其他条件都相等的情况下,使得p(x|wj)取值较大的wj更有可能是真是类别。
/*重点理解p(x|wj)与p(wj|x)的含义:
p(x|wj)表示已知类别为wj的前提下,特征为X的概率。是分类之前的已知知识,成为条件概率。
p(wj|x)表示已知特征向量为X,求其属于类别wj的概率。是分类的判断条件,成为后验概率。
*/
解决方法:
有了上面的铺垫,我们现在可以尝试解决分类的问题。
step1:要根据输入的对象特征向量X来判断其类别,假设我们已经建立了一个判别函数gi(x)/*表示
特征向量为类别i的可能性*/,那么显然我们可以令gi(x)=p(wi|x)=p(x|wj)P(wj)p(x)
对每一个类别wj我们可以分别计算其g(x)的取值。还可以得出判别规则为:若gi(x)>gj(x),则判为
wi,否则判为wj。
step2:由概率论知识我们还可以将gi(x)简化为gi(x)=p(x|wj)P(wj)的形式/*或者用其对数式表
示gi(x)=lnp(x|wj)+lnP(wj),效果相同*/。然后根据判断条件找出最符合的类别。
到这里就结束了吗?nonononono,上面的理论只能称之为贝叶斯理论,他还不够“朴素”。
step3:概率论中我们有这样的结论:对于p(a,b,c),若a,b,c互相独立,则有p(a,b,c)=p(a)p(b)p(c)。
那么,在我们的gi(x)中我们也假设特征向量X中的每一个xj也互相独立,那么就有gi(x)=P(wj)∏nj=1p(xj|wi)
这便是朴素贝叶斯的表达式。
/*
下面我们可以解决学生的性别判断问题了:
设身高用x1表示,体重用x2表示
那么根据训练集知识,我们可以分别求出p(x1|wj)和p(x2|wj)在所有类别下的概率分布,然后对
于任意给定的特征向量X=(x1,x2),求出max{P(wi)∏nj=1p(xi|wj)}对应的最大类别i,即
就是特征向量X的朴素贝叶斯预测类别。
*/
意义:
"模式识别中的贝叶斯理论由于其权威性、一致性和典雅性而被列为最优美的科学公式之一。"
在模式分类,数据挖掘等领域中,贝叶斯理论占据着重要地位,而朴素贝叶斯理论更是在实践中有着重要应用。作为一个
理论,从统计学的观点出发,讨论出了具有指导意义的方法。其背后的哲学意义也发人深省(感兴趣的同学可以深入探讨)。
不足:
贝叶斯理论比较依赖于先验知识,对于先验知识模糊或缺失的情况还需要其他理论作补充(可以想想为什么)。
朴素贝叶斯理论的条件独立假设在实际中会影响判断结果,尤其是特征之间相关度较高的时候。(有没有解决的方法)。
实现:(第一次写文章,没想到断断续续写了好久,看来还是太年轻=_=,实现后面再补吧)
[end]
收获:梳理了一遍朴素贝叶斯的知识,写文章时顺遍学习了LaTex语法编辑公式。
欢迎交流指正讨论,随意转载,请注明作者及出处。
模式识别之贝叶斯---朴素贝叶斯(naive bayes)算法及实现的更多相关文章
- Microsoft Naive Bayes 算法——三国人物身份划分
Microsoft朴素贝叶斯是SSAS中最简单的算法,通常用作理解数据基本分组的起点.这类处理的一般特征就是分类.这个算法之所以称为“朴素”,是因为所有属性的重要性是一样的,没有谁比谁更高.贝叶斯之名 ...
- (转载)微软数据挖掘算法:Microsoft Naive Bayes 算法(3)
介绍: Microsoft Naive Bayes 算法是一种基于贝叶斯定理的分类算法,可用于探索性和预测性建模. Naïve Bayes 名称中的 Naïve 一词派生自这样一个事实:该算法使用贝叶 ...
- 数据挖掘十大经典算法(9) 朴素贝叶斯分类器 Naive Bayes
贝叶斯分类器 贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类.眼下研究较多的贝叶斯分类器主要有四种, ...
- 十大经典数据挖掘算法(9) 朴素贝叶斯分类器 Naive Bayes
贝叶斯分类器 贝叶斯分类分类原则是一个对象的通过先验概率.贝叶斯后验概率公式后计算,也就是说,该对象属于一类的概率.选择具有最大后验概率的类作为对象的类属.现在更多的研究贝叶斯分类器,有四个,每间:N ...
- 朴素贝叶斯分类法 Naive Bayes ---R
朴素贝叶斯算法 [转载时请注明来源]:http://www.cnblogs.com/runner-ljt/ Ljt 勿忘初心 无畏未来 作为一个初学者,水平有限,欢迎交流指正. 朴素贝叶斯分类法 ...
- 基于Naive Bayes算法的文本分类
理论 什么是朴素贝叶斯算法? 朴素贝叶斯分类器是一种基于贝叶斯定理的弱分类器,所有朴素贝叶斯分类器都假定样本每个特征与其他特征都不相关.举个例子,如果一种水果其具有红,圆,直径大概3英寸等特征,该水果 ...
- Python机器学习算法 — 朴素贝叶斯算法(Naive Bayes)
朴素贝叶斯算法 -- 简介 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法.最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Baye ...
- 【机器学习实战】第4章 朴素贝叶斯(Naive Bayes)
第4章 基于概率论的分类方法:朴素贝叶斯 朴素贝叶斯 概述 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类.本章首先介绍贝叶斯分类算法的基础——贝叶斯定理.最后,我们 ...
- 【sklearn朴素贝叶斯算法】高斯分布/多项式/伯努利贝叶斯算法以及代码实例
朴素贝叶斯 朴素贝叶斯方法是一组基于贝叶斯定理的监督学习算法,其"朴素"假设是:给定类别变量的每一对特征之间条件独立.贝叶斯定理描述了如下关系: 给定类别变量\(y\)以及属性值向 ...
随机推荐
- Android fragment 切换载入数据卡顿问题
接着上一篇项目的进度.上一篇讲了怎样利用fragment来实现下拉菜单.公用菜单,以实现切换主界面数据的功能,这时候遇到的问题是:使用了fragment的切换界面方法.但载入的数据太多.用户从一个界面 ...
- Java调用本地接口:java.lang.UnsatisfiedLinkError
Java调用本地接口:java.lang.UnsatisfiedLinkError 我的问题不在这篇文章描述中, 而是因为jni原来是c实现, 现在切换到cpp了, 需要在对应的cpp文件中加入ext ...
- 改造的unity3d文件打包脚本
ExportAssetBundles.rar // C# Example // Builds an asset bundle from the selected objects in the proj ...
- Mybatis 插入后返回数据库自动增长ID
MySQL和MSSQL返回主键方法 在personMap.xml中 <insert id="addPerson" parameterType="orm.Person ...
- 用 WebSocket 实现一个简单的客服聊天系统
一 需求 一个多商家的电商系统,比如京东商城,不同商家之间的客服是不同的,所面对的用户也是不同的.要实现一个这样的客服聊天系统,那该系统就必须是一个支持多客服.客服一对多用户的聊天系统. 二 思路 使 ...
- 事件总线框架---Otto
我们假设这样一种业务场景,现在在做一款及时聊天应用,我们在聊天页面进行收发信息,同时也要实时更新前一页面的聊天记录,这时我们该如何去实现?说说我以前的实现策略,我使用的是广播接收器BroadCastR ...
- 【Shiro】Apache Shiro架构之权限认证(Authorization)
Shiro系列文章: [Shiro]Apache Shiro架构之身份认证(Authentication) [Shiro]Apache Shiro架构之集成web [Shiro]Apache Shir ...
- 用Web API Client 调用 Web API
安装Web API客户端库 右键单击项目,选择管理 NuGet程序包,选择联机选项,选择全部,在搜索框中输入“Microsoft.AspNet.WebApi.Client”, 搜索结果就是要安装的类库 ...
- join和countDownLatch原理及区别详解
先上结论 原理 join 原理:在当前线程中调用另一个线程线程 thread 的 join() 方法时,会调用该 thread 的 wait() 方法,直到这个 thread 执行完毕(JVM在 ru ...
- C语言之指针基础概念
今天就写一下关于C语言指针的一些感想吧. 很多同学都搞不懂指针,我一开始也云里雾里没看懂指针,而且老师又把指针说得很难的样子.其实主要是把指针”*“的作用给弄混了,不用畏惧,细心点看就可以了. 首先简 ...