简 介:下面是我在学习时候的记录并加上自己的理解。本文意在记录自己近期学习过程中的所学所得,如有错误,欢迎大家指正。
关键词:Python、机器学习、贝叶斯分类器
一、贝叶斯网络
我们都学过贝叶斯公式,就是 p ( b ∣ a ) = p ( a ∣ b ) p ( b ) p ( a ) p(b|a)=\frac{p(a|b)p(b)}{p(a)}p(b∣a)=p(a)p(a∣b)p(b),它表明了两个随机变量之间的概率关系,意思是在a条件发生的前提下,b发生的概率为多大。所以我们可以将这个性质利用到我们的建模之中。
我们现在有训练数据和分类标签,那我们进行预测某一样本的类别就是在该样本的特征为x时,对应某一类别的概率为多大,最终预测概率最大的类别就是预测结果。
举个例子,我们现在要判断某个人是不是坏人,那么参考的因素有外貌、性格、行为三个特征,根据贝叶斯公式,我们预测是不是坏人就是利用公式 p ( 坏 人 ∣ 外 貌 、 性 格 、 特 征 ) p(坏人|外貌、性格、特征)p(坏人∣外貌、性格、特征),来进行计算概率。最终的分类器的判别函数为 a r g m a x y p ( y ) p ( x ∣ y ) arg max_yp(y)p(x|y)argmaxyp(y)p(x∣y)。
我们要实现对类别概率的预测就需要知道判别函数中的各个参数值,p ( y ) p(y)p(y) 就是某个类别在数据中出现的概率,p ( x ∣ y ) p(x|y)p(x∣y) 就是在某一分类的前提下,特征为x的概率,对于上面计算条件概率还有个地方需要注意,就是如果我们的特征分量是类别特征可以利用古典概型进行计算概率,如果是连续性那么就需要得知该特征分量的概率分布,和概率密度函数。
计算 p ( x ∣ y ) p(x|y)p(x∣y) 在实际中是很难计算的,因为我们的特征分量很多都是有关联的,要计算对于x的所有属性的联合概率,这是很难计算的,你比如说我们有5个类别,每个类别下的分类数有3个分类,那么我们的数据就会产生 5 3 5^353 种可能的取值,而且这个数往往是大于我们的样本数的,又由于现实中我们的训练集不可能存在所有的样本可能,所以就会导致某些样本的概率为0,这会对结果产生很大的影响,因为某些样本未被录入和出现的概率为0是两个概念,很可能我们是存在该类别的,只是我们在数据采集的过程中没有采集到,这就会对之后计算公式造成误差。
二、朴素贝叶斯分类器
上面我们说到如果我们没有采集到所有的样本组合,那么就会对计算概率有影响,所以有人提出了一种假设,就是假设我们所有的特征分量是相互独立的,没有任何影响。
在概率论中学过,如果两个随机变量独立,那么 p ( A B ) = p ( A ) ∗ p ( B ) p(AB)=p(A)*p(B)p(AB)=p(A)∗p(B) ,那么我们上面的公式 p ( x ∣ y ) p(x|y)p(x∣y) ,就可以转化为 p ( x ∣ y ) = ∏ i = 1 n p ( x i ∣ y ) p(x|y)=\prod_{i=1}^np(x_i|y)p(x∣y)=∏i=1np(xi∣y) ,这样就可以分别计算在每个特征分量下的概率然后进行乘积即可。
这样就大大简化了求解的难度,特征向量为x,类别用c进行表示。
1.分类型特征分量
分类型特征分量就是数据特征为分类型特征,就是有类别的,对于这种的我们可以采用古典概型进行计算,因为类别可数,能够用类别比计算出概率。
p ( y = c i ∣ x ) = p ( y = c i ) p ( x ∣ c i ) p ( x ) p(y=c_i|x)=\frac{p(y=c_i)p(x|c_i)}{p(x)}p(y=ci∣x)=p(x)p(y=ci)p(x∣ci)
上面公式的意思就是某一样本的特征为x时,计算各个该样本数据属于某一分类下的概率。
我们可以进行进一步化简,
p ( y = c i ∣ x ) = p ( y = c i ) ∏ i = 1 n p ( x i ∣ y ) p ( x ) p(y=c_i|x)=\frac{p(y=c_i)\prod_{i=1}^np(x_i|y)}{p(x)}p(y=ci∣x)=p(x)p(y=ci)∏i=1np(xi∣y)
我们的目的就是要求属于某一类别最大概率的类别,对于分母p(x),计算所有分类是相同的,所以只需要使分子最大即可,不用考虑分母,也就是a r g m a x y p ( y = c i ) ∏ i = 1 n p ( x i ∣ y ) argmax_yp(y=c_i)\prod_{i=1}^np(x_i|y)argmaxyp(y=ci)i=1∏np(xi∣y)
对于上述的每个因式解释一下如何计算, p ( y = c i ) p(y=c_i)p(y=ci) ,就是计算该类别在所有样本中的比例,即 p ( y = c i ) = N y = c i N p(y=c_i)=\frac{N_y=ci}{N}p(y=ci)=NNy=ci ,N为总的样本数,N y = c i N_{y=ci}Ny=ci就是某一类别的样本个数。
这里存在一个问题就是?如果某一个类别中某一特征分量中不存在这个特征值,这是我们的 p ( x i ∣ y ) p(x_i|y)p(xi∣y) 就会等于0,具体说一下就是我们的标签类别有很多个类,而且某一特征分量下也有很多类别,那么很有可能造成在某一标签分类的样本中存在该特征类别,有的不存在,那么就会造成概率为0,此时我们的其它特征分量就算再符合这个分类的特征,也会造成最终计算的概率为0,这显然是不合理的。
此时有人提出了解决办法就是”拉普拉斯修正法“,就是分别对分子和分母同时加入限制常数,但是同时不改变概率之和,最终的概率之和仍为1。
p ( x i ∣ y = c i ) = N x i , y = c + 1 N y = c i + k p(x_i|y=c_i)=\frac{N_{x_i,y=c}+1}{N_{y=c_i}+k}p(xi∣y=ci)=Ny=ci+kNxi,y=c+1
此式子中的k就是对应某一特征分量下的全部类别数,这是就算某一分类下的数目为0,也还是会存在概率不为0,同时又可以保证在某一分类下的某一特征分量下的概率和仍然为1。
同时对于标签类别同样也可以采用该方式进行修正,有可能数据采用时,没有把全部的标签样本都采集到
p ( y = c i ) = D c + 1 D + N p(y=c_i)=\frac{D_c+1}{D+N}p(y=ci)=D+NDc+1
2.连续性特征分量
对于连续性特征分量我们是不能够计算出概率的,因为它不像分类型的那种可以用数值之比进行计算。因为对于连续性的变量来说,某一点的概率是为0的,这是不能够用于计算贝叶斯公式的,但是我们可以采用概率密度进行代替。
一般来说,我们假设特征分量都符合一维正态分布,此时我们根据样本数据的就可以计算出每个特征列的均值和方差,这样就可以求出每个特征分量符合的概率密度函数。
f = 1 2 π σ e − ( x − μ ) 2 2 σ 2 f=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu)^2}{2\sigma^2}}f=2πσ1e−2σ2(x−μ)2
那么此时我们的条件概率公式就变为了f ( x = x i ∣ y = c ) = 1 2 π σ e − ( x − μ ) 2 2 σ 2 f(x=x_i|y=c)=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu)^2}{2\sigma^2}}f(x=xi∣y=c)=2πσ1e−2σ2(x−μ)2
所以我们现在的目标就是:
a r g m a x y p ( y = c ) ∏ i n f ( x i ∣ y = c ) argmax_yp(y=c)\prod_i^nf(x_i|y=c)argmaxyp(y=c)i∏nf(xi∣y=c)
由于该参数存在e所以计算概率时较为麻烦,可以采取取对数的方式进行计算某个分类情况下的概率,最终最大的概率的类别就是我们预测的类别。
最终可以化简为
l n p ( y = c ∣ x ) = ∑ i = 1 n c i ( x i − μ i ) 2 + c lnp(y=c|x)=\sum_{i=1}^nc_i(x_i-\mu_i)^2+clnp(y=c∣x)=i=1∑nci(xi−μi)2+c
然后对比每个类别下的对数概率,判断所属的类别。