bayes公式与机器学习 - 再从零开始理解

从本科时候(大约9年前)刚接触Bayes公式,只知道P(A|B)×P(B) = P(AB) = P(B|A)×P(A)

到硕士期间,机器学习课上对P(B|A)P(A)冠以“先验概率”,而不知“先验”二字到底从何而来。

再到工作了几年之后重回校园,重新拾起对求知的热情,重新用向小白讲述Bayes公式的态度,让自己对它有最朴素的理解。尽量让像我一样刚入门的小白同学们,能用生活中最朴素的例子找到bayes公式中,“先验”二字的由来。

要理解bayes公式,需从全概率公式讲起:

\[
P(A_i|B)=\frac {P(B|A_i)P(A_i)}{\displaystyle\sum_{j=1}^nP(B|A_j)\times P(A_j)}
\]
其中的全概率公式:
\[
\displaystyle\sum_{j=1}^nP(B|A_j)\times P(A_j) = P(B)
\]

这里,可理解:
\(A_j \rightarrow Class_j\) (这是你样本可能从属的类别)
$B \rightarrow Events \space or \space Data $ (这是你看到的样本的表象)

2.进一步理解

2.1 设有一幅扑克牌(这是一种等概率的情况)

摸到一张J,想知道它属于♥️这一类的概率。
这里,A是现象,是观察到的属性。♥️,♣️,♦️,♠️是对所有除了大王小王外的扑克牌的四个类别。
任务就是要根据现象J,对这张牌进行归类,求这张牌属于♥️这一类的概率。

\[
P(A|B) \text{就是看到J的情况下,属于} \heartsuit \text{的概率}
\]
这是我们要求的量。
\[
P(A|B)=\frac {P(B|A)P(A)}{P(B)}
\]
\(P(B|A)\) - 在已知♥️的牌中,有几个J,显然,1/13

\(P(A)\) - 在整副牌中,红桃出现的概率:13/54

\(P(B)\) - 在整副牌中,J出现的概率:4/54
这里这个P(B)可以是如下公式计算的:
\[
\displaystyle\sum_{j=1}^nP(B|A_j)\times P(A_j) = P(B)
\]
即,\(A_j\)代表的是♥️,♣️,♦️,♠️中的某一个类别。例如,j=1, 我们认为是♥️,则,P(B|A1) = 1/13
P(A1) = 13/54
此时,
\[
P(B|A_1) \times P(A_1) = \frac1{13} \times \frac {13}{54} = \frac{1}{54}
\]
当 j = 1,2,3,4 时,由于这里每个
$
P(B|A_j)
$
都是相等的,所以
\[
P(B) = 4 \times \frac{1}{54} = \frac{4}{54}
\]
所以,上面的P(A|B) 就能算出来了。因为P(B|A) ,P(A) ,P(B)都知道了。

==以上是一个等概率的问题。更一般地,我们要用Bayes公式解决不等概率、根据观察对对象进行分类的问题。==

2.2 设有三棵橘子树(这是更一般的场景)

有甲乙丙三颗橘子树,到了秋收的季节,老农对他们进行采摘。
第一年:

  • 甲橘子树出来的果子多数都偏红,口感好。
  • 乙橘子树出来的果子多数都普通,口感一般。
  • 丙橘子树出来的果子多数都偏黄,口感不好。

果农从此知道P(A), P(A|B), P(B)

第二年:
       新来的果农和老农一起工作,他们拿起一个橘子,要判断这个果子出自甲乙丙三棵果树里的哪一棵。

找一个案例编程实现

  1. 用Bayes公式完成分类任务的例子

todo.. (网上的例子很多了,就不知道何时来todo了,呵呵)

bayes公式 - 再从零开始理解的更多相关文章

  1. 用bayes公式进行机器学习的经典案例

    用bayes公式进行机器学习的经典案例 从本科时候(大约9年前)刚接触Bayes公式,只知道P(A|B)×P(B) = P(AB) = P(B|A)×P(A) 到硕士期间,机器学习课上对P(B|A)P ...

  2. 从零开始理解JAVA事件处理机制(2)

    第一节中的示例过于简单<从零开始理解JAVA事件处理机制(1)>,简单到让大家觉得这样的代码简直毫无用处.但是没办法,我们要继续写这毫无用处的代码,然后引出下一阶段真正有益的代码. 一:事 ...

  3. 最大似然判别法和Bayes公式判别法

    最大似然判别法 Bayes公式判别法

  4. 从零开始理解JAVA事件处理机制(3)

    我们连续写了两小节的教师-学生的例子,必然觉得无聊死了,这样的例子我们就是玩上100遍,还是不知道该怎么写真实的代码.那从本节开始,我们开始往真实代码上面去靠拢. 事件最容易理解的例子是鼠标事件:我们 ...

  5. 从零开始理解JAVA事件处理机制(1)

    “事件”这个词已经被滥用了.正因为“事件”的被滥用,很多人在用到事件的时候不求甚解,依样画葫芦,导致学习工作了很多年,还是不清楚什么是事件处理器.什么是事件持有者.所以,如果你对于Event这个词还是 ...

  6. 再深刻理解下web3.js中estimateGas如何计算智能合约消耗的gas量

    我们可使用web3.js框架的estimateGas函数获得一个以太坊智能合约的Gas估计值 ,通过执行一个消息调用或交易,该消息调用或交易直接在节点的VM中执行,并未在区块链中确认,函数会返回估算使 ...

  7. 从零开始一起学习SLAM | 不推公式,如何真正理解对极约束?

    自从小白向师兄学习了李群李代数和相机成像模型的基本原理后,感觉书上的内容没那么难了,公式推导也能推得动了,感觉进步神速,不过最近小白在学习对极几何,貌似又遇到了麻烦... 小白:师兄,对极几何这块你觉 ...

  8. 【十大算法实现之naive bayes】朴素贝叶斯算法之文本分类算法的理解与实现

    关于bayes的基础知识,请参考: 基于朴素贝叶斯分类器的文本聚类算法 (上) http://www.cnblogs.com/phinecos/archive/2008/10/21/1315948.h ...

  9. 【转】你真的理解Python中MRO算法吗?

    你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...

随机推荐

  1. 阅读《7 Series FPGAs GTX/GTH Transceivers User Guide》

    阅读<7 Series FPGAs GTX/GTH Transceivers User Guide> 1.GTX在XC7K325T芯片内的排列 2.参考时钟的配置 在GTXE2_COMMO ...

  2. 系统服务和普通FORMS程序共存一体的实现

    要求:一个EXE,如何将它做成这样的效果:1.双击它时,像一个FORMS程序那样正常显示窗体运行.2.注册成系统服务,每次都可以从service.msc中启动它. 也就是说,没注册之前,它可以当作普通 ...

  3. 在Android中创建一个下拉菜单

    添加四个控件 TToolbar Alignment: alTop TSpeedButton Alignment: alRight StyleLookUp: detailstoolbutton Marg ...

  4. ucos-iii串口用信号量及环形队列中断发送,用内建消息队列中断接收

    串口发送部分代码: //通过信号量的方法发送数据 void usart1SendData(CPU_INT08U ch) { OS_ERR err; CPU_INT08U isTheFirstCh; O ...

  5. Flask--异常处理

    异常处理: abort(404)-捕获HTTP抛出的统一状态码 @app.errorhandler-捕获全局异常错误码,捕获异常错误 @app.route("/demo4") de ...

  6. ALGO-125_蓝桥杯_算法训练_王、后传说(DFS)

    问题描述 地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横.坚.斜线位置. 看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地.各皇后都有自己的势力范围,但也总能找到相安无事的办 ...

  7. LeetCode——5.Longest Palindromic Substring

    一.题目链接:https://leetcode.com/problems/longest-palindromic-substring/ 二.题目大意: 给定一个字符串,找出它最长的回文子串.例如,字符 ...

  8. mysql查询优化之三:查询优化器提示(hint)

    目录: <MySQL中的两种临时表>--强制使用临时表 SQL_BUFFER_RESULT <MySQL 多表关联更新及删除> <mysql查询优化之三:查询优化器提示( ...

  9. Linux下自制回收站

    Linux下自制回收站 相信熟悉linux系统的人都知道rm的厉害,也大都听说过有rm造成的生产事故,本文将详细介绍如何在linux环境下制作回收站以避免数据误删除,如何恢复回收站中的数据,如何查看回 ...

  10. [UE4]多线程开关,开启的解决方案

    像这样直接获取值就会被警告. 解决方法:定义一个变量speed,然后在“Blueprint Update Animation”事件中赋值给这个变量. 这样就不会被警告了. 另外一种解决方法:就是关掉多 ...