概率
概率表示为一个0到1之间的数字,用来表达一个事件发生的可信程度。
引用一个《模式识别》中的例子来解释利用概率决策的过程。
假设我们现在需要一个分类器来分开两种鱼(鲈鱼和鲑鱼)。使用 w w 来表示当前沿传送带送过来鱼的类别,当时,表示鲈鱼,当 w=w2 w = w 2 时,表示鲑鱼。由于 w w 的状态未知,所以可以用概率描述的状态。
如果假设只有这两种鱼,并且两种鱼的数目已知(鲈鱼有a条,鲑鱼有b条),那么
如果我们对鲈鱼和鲑鱼的外观一无所知,唯一所能利用的信息就是这两个概率。那么我们自然会做出如下的判断:
如果 P(w1)>P(w2) P ( w 1 ) > P ( w 2 ) ,那么就判断为鲈鱼。反之,则认为是鲑鱼。这个判断是符合我们的逻辑的。
那么这个分类器的错误率为 min{P(w1),P(w2)} m i n { P ( w 1 ) , P ( w 2 ) } 。这个分类器的准确率依赖于两种鱼数目的比例。如果两种鱼数目相等,那这个分类器的错误率为0.5。这也是最糟糕的情况。
这个准确率显然不能让人满意,不过这也是当前条件下的最好结果了。
条件概率
条件概率描述了一个背景约束下的概率问题。例如,我想知道明天下雨的概率,那么我可以统计过去一年的下雨天数(比如是60天),那么明天下雨的概率就是 60/365=0.16 60 / 365 = 0.16 。
但是明天并不是随便一天,比如现在是7月,7月雨天比较多,那么我们就可以统计过去10年的7月下雨的天数,利用这个数字计算明天下雨的概率,那么会得到比上面更精确的结论。
重新考虑上面两种鱼的分类问题。假设我们了解到了两种鱼会有不同的光泽,用一个连续随机变量x来表示光泽度,规律如下图:
通过已知的这张图,我们知道了 P(x|wj) P ( x | w j ) 。但是为了生成这个分类器,我们需要知道某个光泽度对应鱼类的概率,即 P(wj|x) P ( w j | x ) 。问题变为了如何通过 P(x|wj) P ( x | w j ) 计算 P(wj|x) P ( w j | x ) 。贝叶斯定理可以解决这个问题。
贝叶斯定理
这个公式中 P(w) P ( w ) 称为先验概率,他是我们还没有了解到光泽度前对鱼分类的假设概率。
P(w|x) P ( w | x ) 称为后验概率,他是我们看到光泽度之后所要计算得概率。
式中还有
P(x)
P
(
x
)
未知,他可以通过下面的公式计算:
如果某个观测值 x x 使得比 P(w2|x) P ( w 2 | x ) 大,那我们很自然的判断为 w1 w 1 ,反之则判断为 w2 w 2 。
为了与之前的误差作比较,计算一下
P(w1)=P(w1)=0.5
P
(
w
1
)
=
P
(
w
1
)
=
0.5
时的错误率。
使用python计算一下这个错误率
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 2000)
Px_w2 = 1/(np.sqrt(2*3.14)*2)*np.exp(-(x-3)*(x-3)/(2*2*2))
Px_w1 = 1/(np.sqrt(2*3.14)*2)*np.exp(-(x-7)*(x-7)/(2*2*2))
Pw1 = 0.5
Pw2 = 0.5
Px = Px_w1*Pw1 + Px_w2*Pw2
Pw1_x = Px_w1*Pw1/Px
Pw2_x = Px_w2*Pw2/Px
y = np.minimum(Pw1_x, Pw2_x)
print('max: ',y.max())
print('ave: ',y.sum()/y.shape[0])
plt.plot(x,y)
# plt.plot(x,Pw2_x)
plt.show()
print("error:", (y*Px*10/2000).sum())
运行结果为:
可以看到错误率为0.158。可见引入条件概率后,分类器的效果获得了极大的提升。这也是因为两个正态分布函数的 μ μ 的差距较大,如果 μ μ 接近的话,那对于降低错误率的效果也会变得较差的,这是因为两个相近的条件概率函数说明了这个特征对于这个分类器的贡献较低。