跟我一起学scikit-learn20:朴素贝叶斯算法

朴素贝叶斯(Naive Bayers)算法是一种基于概率统计的分类方法。它在条件独立假设的基础上,使用贝叶斯定理构建算法,在文本处理领域有广泛的应用。

1.朴素贝叶斯算法原理

朴素贝叶斯算法,需要从贝叶斯定理说起,它是一个条件概率公式。

1.贝叶斯定理

先来看一个案例。某警察使用一个假冒伪劣的呼吸测试仪来测试司机是否醉驾。假设这个仪器有5%的概率会把一个正常的司机判断为醉驾,但对真正醉驾的司机其测试结果是100%准确的。从过往的统计得知,大概有0.1%的司机为醉驾。假设该警察随机拦下一个司机,让他做呼吸测试,仪器测试结果为醉驾。仅凭这一结果判断,这位司机真的是醉驾的概率有多高?

90%?50%?真实的结果是不到2%。如果我们没有通过其他方法(如闻司机身上的酒味),仅凭这个仪器的测试结果来判断,其实准确性是非常低的。

假设我们的样本里有1000人,根据过往的统计数据,这1000位司机里有0.1%的概率为真正醉驾,即有1位是真正醉驾的司机,999位是正常的。这1000位司机均拿这个劣质呼吸测试仪来测试,则有多少人会被判断为醉驾?对这位真正醉驾的司机,他无法蒙混过关,而对999位正常的司机,有5%的概率会被误判,所以总共有1+999*5%=51个司机会被仪器判断为醉驾。由此可知,所有被判断为醉驾的司机里,真正醉驾的概率是1/(1+51)=1.96%。

实际上,贝叶斯定理是计算这类条件概率问题的绝佳方法。我们记P(A|B)表示观察到的事件B发生时事件A发生的概率,则贝叶斯定理的数学表达式为:
P ( A ∣ B ) = P ( A ) P ( B ∣ A ) P ( B ) P(A|B)=\frac{P(A)P(B|A)}{P(B)} P(AB)=P(B)P(A)P(BA)

回到醉驾的例子,我们记事件A为司机真正醉驾,事件B为仪器显示司机醉驾。则例子里要求解的问题即为P(A|B),即观察到仪器显示司机醉驾(事件B发生)时,司机真正醉驾(事件A发生)的概率是多少。P(A)表示司机真正醉驾的概率,这是先验概率,这里是0.1%。P(B|A)表示当司机真正醉驾时(事件A发生),仪器显示司机醉驾(事件B发生)的概率是多少,这里是100%。P(B)表示仪器显示司机醉驾的概率,包含两部分数据,针对真正醉驾的司机(0.1%),仪器能100%检测出来,因为这部分的数值为0.1% x 100%;针对正常的司机(1-0.1%),仪器显示醉驾的概率为(1-0.1%) x 5%。代入贝叶斯定理公式得:
P ( A ∣ B ) = 0.1 % × 100 % ÷ [ 0.1 % × 100 % + ( 1 − 0.1 % ) × 5 % ] = 1.96 % P(A|B)=0.1\% \times 100\% \div [0.1\% \times 100\% + (1-0.1\%) \times 5\%]=1.96\% P(AB)=0.1%×100%÷[0.1%×100%+(10.1%)×5%]=1.96%

2.朴素贝叶斯分类法

假设有一个已经标记的数据集 [ x ( i ) , y ( i ) ] [x^{(i)},y^{(i)}] [x(i),y(i)],其中 y ( i ) ∈ [ C 1 , C 2 , . . . , C b ] y^{(i)} \in [C_1,C_2,...,C_b] y(i)[C1,C2,...,Cb],即数据集总共有b个类别; x ( i ) ∈ [ x 1 , x 2 , . . . , x n ] x^{(i)} \in [x_1,x_2,...,x_n] x(i)[x1,x2,...,xn],即总共有n个输入特征。针对一个新的样本x,我们需要预测y的值,即对x进行分类。这是个典型的机器学习里的分类问题。

对我们要求解的问题,使用统计学的语言可以描述为:当观察到输入样本是x时,其所属于的类别 y = C k y=C_k y=Ck的概率,使用条件概率公式表示为:
P ( C k ∣ x ) P(C_k|x) P(Ckx)

其中, C k ∈ [ C 1 , C 2 , . . . , C b ] C_k \in [C_1,C_2,...,C_b] Ck[C1,C2,...,Cb],我们只需要分别求出所有b个类别的概率,然后取概率最大的那个 C k C_k Ck即是x所属的类别。直接求解上述公式比较困难,可以应用贝叶斯定理进行一次变换:
P ( C k ∣ x ) = P ( C k ) P ( x ∣ C k ) P ( x ) P(C_k|x)=\frac{P(C_k)P(x|C_k)}{P(x)} P(Ckx)=P(x)P(Ck)P(xCk)

对于一个确定的数据集, C k C_k Ck P ( x ) P(x) P(x)都是固定的值。因此:
P ( C k ∣ x ) ∝ P ( C k ) P ( x ∣ C k ) P(C_k|x) \propto P(C_k)P(x|C_k) P(Ckx)P(Ck)P(xCk)

其中, ∝ \propto 表示成正比的意思。因此,我们只需要求解,针对不同的 C k ∈ [ C 1 , C 2 , . . . , C b ] C_k \in [C_1,C_2,...,C_b] Ck[C1,C2,...,Cb]的情况下, P ( C k ) P ( x ∣ C k ) P(C_k)P(x|C_k) P(Ck)P(xCk)的最大值即可知道,x属于哪个类别。根据联合概率公式,可得:
P ( C k ) P ( x ∣ C k ) = P ( C k , x ) P(C_k)P(x|C_k)=P(C_k,x) P(Ck)P(xCk)=P(Ck,x)

因为x是n维向量,即 x = [ x 1 , x 2 , . . . , x n ] x=[x_1,x_2,...,x_n] x=[x1,x2,...,xn],可得
P ( C k ) P ( x ∣ C k ) = P ( C k , x ) = P ( C k , x 1 , x 2 , . . . , x n ) P(C_k)P(x|C_k)=P(C_k,x)=P(C_k,x_1,x_2,...,x_n) P(Ck)P(xCk)=P(Ck,x)=P(Ck,x1,x2,...,xn)

根据链式法则及条件概率的定义,可进一步推导公式:
P ( C k , x 1 , x 2 , . . . , x n ) = P ( x 1 , x 2 , . . . , x n , C k ) P(C_k,x_1,x_2,...,x_n)=P(x_1,x_2,...,x_n,C_k) P(Ck,x1,x2,...,xn)=P(x1,x2,.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值