在一般的分类问题中,通常的套路都是提取特征,将特征输入分类器训练,得到最终的模型。但是在具体操作时,一开始提出的特征和输入分类器训练的特征是不一样的。比如假设有N张 100×100 100×100的图像,分别提取它们的HoG特征 x∈Rp×q x∈Rp×q, p p为特征的维数, q q为这幅图像中HoG特征的个数。
如果把直接把这样的一万个 x x直接投入分类器训练,效果不一定好,因为不一定每个像素点的信息都是有价值的,里面可能有很多是冗余的信息。而且特征维度太高会导致最终的训练时间过长。
所以通常会对raw features做一些预处理。最常用的就是词袋模型(bag of words)。
上图中k-means+featuresc encoding这一步就是典型的词袋模型。K-means是最常用的聚类方法之一,我们的例子中,有N幅图像,每幅图像有 x∈Rp×q x∈Rp×q的特征,那么所有数据的特征矩阵为 X∈Rp×Nq X∈Rp×Nq。也就是说现在一共存在 Nq Nq个数据点,它们分布在一个 p p维的空间中,通过聚类后可以找到 M M个聚类中心。然后对于每一幅图像而言,分别计算它的 q q个 p p维特征属于哪一个聚类中心(距离最近),最终统计 M M个聚类中心分别拥有多少特征,得到一个 M M维的向量。这个向量就是最终的特征。
k-means的缺点在于,它是一个hard聚类的方法,比如有一个点任何一个聚类中心都不属于,但是词袋模型仍然可能会把它强行划分到一个聚类中心去。对于一个点,它属不属于某个聚类中心的可能性是个属于 (0,1) (0,1)的整数值。
相反,高斯混合模型(Gaussian Mixture Model) 就是一种soft聚类的方法,它建立在一个重要的假设上,即任意形状的概率分布都可以用多个高斯分布函数去近似。顾名思义,高斯混合模型是由很多个高斯分布组成的模型,每一个高斯分布都是一个component。每一个component Nk∼(μk,σk),k=1,2,…K Nk∼(μk,σk),k=1,2,…K对应的是一个聚类中心,这个聚类中心的坐标可以看作 (μk,σk) (μk,σk),对于一个点 xi xi它属于第 k k个聚类中心的可能性 pik pki是一个属于 0,1 0,1的概率值,也就是说在高斯混合模型中,一个点可以看作是由多个component联合生成的, pik pki也是数据 xi xi由第 k k个component生成的概率。
所以当给定N张图像的训练集合 x1,x2,…,xN x1,x2,…,xN,那么自然而然的想到可以尝试利用多个高斯分布函数的线性组合拟合 x x的分布。 那么假设有 k k个高斯分布,每个分布称为一个component,则
其中 p(x|k)~N(μk,σk) p(x|k)~N(μk,σk),设 p(k)=πk p(k)=πk表示的是第 k k个高斯分布的被选中的概率,也就是权重。现在的任务就是找到 (μk,σk,πk)k=1,…,K (μk,σk,πk)k=1,…,K,令已知的 x1,x2,…,xN x1,x2,…,xN 分布存在的可能性最大,也就是i似然函数最大。
故有
对上式分别对于 μ,Σ,ϕ μ,Σ,ϕ求偏导并置于0,就可以求出最优的参数。但是上式中又有加和,我们没法直接用求导解方程的办法直接求得最大值。
所以一般解高斯混合模型都用的是EM算法。
EM算法分为两步:
在E-step中,估计数据由每个component生成的概率。
假设 μ,Σ,ϕ μ,Σ,ϕ已知,对于每个数据 xi xi 来说,它由第 k k个component 生成的概率为 pik=πkN(xi|μk,σk)∑Kk=1πkN(xi|μk,σk) pki=πkN(xi|μk,σk)∑k=1KπkN(xi|μk,σk)
在M-step中,估计每个component的参数 μk,Σk,πkk=1,…K μk,Σk,πkk=1,…K。
利用上一步得到的 pik pki,它是对于每个数据 xi xi 来说,它由第 k k个component生成的概率,也可以当做第 k k个component在生成这个数据上所做的贡献,或者说,我们可以看作 xi这个值其中有pikxi xi这个值其中有pkixi 这部分是由 第 k k个component所生成的。现在考虑所有的数据,可以看做第 k k个component生成了 p1kx1,…,pNkxN pk1x1,…,pkNxN 这些点。由于每个component 都是一个标准的 Gaussian 分布,可以很容易的根据期望、方差的定义求出它们:
重复迭代前面两步,直到似然函数的值收敛为止。
from: http://bucktoothsir.github.io/blog/2014/12/04/11-thblog/