聚类算法Kmeans与梯度算法Meanshift
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Kmeans与Meanshift、EM算法的关系
Kmeans算法是一种经典的聚类算法,在模式识别中得到了广泛的应用,基于Kmeans的变种算法也有很多,模糊Kmeans、分层Kmeans等。
Kmeans和应用于混合高斯模型的受限EM算法是一致的。高斯混合模型广泛用于数据挖掘、模式识别、机器学习、统计分析。Kmeans的迭代步骤可以看成E步和M步,E:固定参数类别中心向量重新标记样本,M:固定标记样本调整类别中心向量。K均值只考虑(估计)了均值,而没有估计类别的方差,所以聚类的结构比较适合于特征协方差相等的类别。
Kmeans在某种程度也可以看成Meanshitf的特殊版本,Meanshift是一种概率密度梯度估计方法(优点:无需求解出具体的概率密度,直接求解概率密度梯度。),所以Meanshift可以用于寻找数据的多个模态(类别),利用的是梯度上升法。在06年的一篇CVPR文章上,证明了Meanshift方法是牛顿拉夫逊算法的变种。Kmeans和EM算法相似是指混合密度的形式已知(参数形式已知)情况下,利用迭代方法,在参数空间中搜索解。而Kmeans和Meanshift相似是指都是一种概率密度梯度估计的方法,不过是Kmean 选用的是特殊的核函数(uniform kernel),而与混合概率密度形式是否已知无关,是一种梯度求解方式。PS:两种Kmeans的计算方法是不同的。
Vector quantization也称矢量量化:指一个向量用一个符号K来代替。比如有10000个数据,用Kmeans 聚成100类即最有表征数据意义的向量,使得数据得到了压缩,以后加入的数据都是用数据的类别来表示存储,节约了空间,这是有损数据压缩。数据压缩是数据聚类的一个重要应用,也是数据挖掘的主要方法。
混合高斯模型是一系列不同的高斯模型分量的线性组合。在最大似然函数求极值时,直接求导存在奇异点的问题,即有时一个分量只有一个样本点,无法估计其协方差,导致其似然函数趋于无穷,无法求解。另一个问题是,用代数法求得的解是不闭合的,即求解的参数依赖于参数本身的值,变成一个鸡生蛋,蛋生鸡的问题。这些问题看似无解,但是可以使用迭代的方法如EM,k均值等,预先设置一些参数,然后迭代求解。PS:也有用基于梯度的方法求解的。在求解混合模型时,有一个重要的概念即模型的可辨识性(如果无论样本的数量为多少都无法求出模型参数的唯一解,则称模型是不可辨识的),这是EM算法的前提。在实际应用时,由于EM算法的复杂度比K均值高,所以一般先用K均值大致收敛到一些点,然后用EM算法。EM算法求解混合模型的固然有效,但不能保证找到最大使然函数的最大值。
EM算法是求解具有隐变量的概率模型的最大似然函数的解的常用方法。当样本集是样本与隐变量一一对应时,数据集称为完整数据集,可以直接求解模型参数,但很多时候只知道样本,不知道其对应的隐变量,这是非完整数据集。所以求解模型参数的关键是隐变量的后验概率,由后验概率可以推出完整数据集用于求解参数。增量式的EM算法,每次只更新一个点,收敛速度更快。上述方法可以看成是无监督学习。
PS:EM是一个似然函数下界最大化解法,保证了解法的收敛性。
Opencv之KMEANS篇
Opencv中的K-means适用于数据预处理,但图像分割的消耗的时间太长并且效果不怎么好,使用空间信息后,图像的分割后受空间的影响很大(同一类的数据如果分布较远,不是高斯型的,就会错分),
因为图像分割本身要求数据是呈超球体(高斯类)分布。K-means得到的是线性判决面,因为算法使用的准则函数是最小均方误差,相当于不同类别间求最小二乘直线拟合。这是一个局限点,而且类别数的选择也很重要,但实际情况是,往往很难确定图片中的类别数。在OPENCV里判断聚类误差是由类别中心点的两次迭代结果的差决定的,即当类别中心点都变化不大时或者说不变时,聚类结束。多次运行程序会发现不同的结果,因为程序可能会陷入不同的局部极值,所以如果要找到全局最优,可以多次运行找出误差最小值。在opencv的kmeans函数内有关于运行次数的选择变量,除了输出类别标记外,还可以输出类别中心等。输入图片:
输出图片:
类别间的分界基本呈线性。
在使用K-means函数时,注意输入和输出矩阵的数据类型,是32FC1。输入矩阵的每一行是一个输入向量。OPENCV矩阵的特点是,矩阵的元素本身可以是个向量,即元素的数据通道,这样方便图像处理。所以一个样本向量可以用矩阵的一行表示即单通道多数据,也可以用一个多数据通道的矩阵元素表示。
PS:在使用空间信息作分类时,其实向量是由不同的域组成,空间域和颜色域,不满足欧几里德空间的约束,这里用了近似的。
只使用RGB颜色,未添加空间信息的分割结果:
OPENCV之EM算法篇
EM算法是求解最大似然函数极值的一种解法,使用的是迭代求解的方法,并且保证收敛。EM算法的应用相当广泛,包括混合高斯模型的求解,隐马尔科夫模型的求解,最大后验概率模型的求解等。最常用的是混合高斯模型的求解,把混合概率密度分解为一系列的高斯分量之和。关于EM算法的具体流程可参考网上,个人推荐一个介绍的不错的,《pattern recognition and machine learning》有一章专门介绍这个,通俗易懂,介绍了KMEANS与EM算法的关系,还介绍了一搬(general)EM算法的流程。在我博客里还会有另一篇文章专门介绍Kmeans和EM算法和MEANSHIFT算法的关系。
Opencv里的CVEM函数是用于专门求解混合高斯模型的,输入和输出都与CVkmeans2函数的输入输出兼容,都是输入矩阵一行代表一个样本。可以选择两种模式,一种是普通的方差矩阵,一种是对角的方差矩阵。对角的方差矩阵计算相对简单,可以减少计算量,而且很多情况下效果和普通的方差矩阵差不多。由于EM算法的计算复杂度要高于Kmeans,所以在实际使用时一般先用Kmeans选定类别中心,再用EM算