机器学习算法-Mean-shift

mean-shift算法是一种在一组数据的密度分布中寻找局部极值的稳定的无参特征空间估计方法(non-parametric feature-space analysis)。

“稳定”是指统计意义上的稳定,因为mean-shift忽略了数据中的outlier,即忽略原理数据峰值的点。mean-shift只对数据局部窗口中的点进行处理,处理完成后再移动窗口。

QQ截图20150818235450

Kernel Density Estimation(核密度估计)

核密度估计是在概率中用来估计未知的密度函数,又名Parzen窗(Parzen window),由Rosenblatt (1955)和Emanuel Parzen(1962)提出,基本思想是利用一定范围内各点密度的平均值对总体密度函数进行估计。

在贝叶斯统计中,概率密度函数(probability density function)的核:the form of the pdf  in which any factors that are not functions of any of the variables in the domain are omitted。这些factors是pdf参数的函数,组成了概率分布的归一化因子。

比如,正态分布的pdf和对应的核分别为( σ2 σ2不是变量 x x的函数)。

p(x|\mu,\sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(x-\mu)^2}{2\sigma^2}}            ;           p(x|\mu,\sigma^2) \propto e^{-\frac{(x-\mu)^2}{2\sigma^2}}

一般而言,设 xRd x∈Rd N N是所选择的样本总数,则 x x处的分布概率密度

pN(x)^=1NNi=11hNφ(xxihN) pN(x)^=1N∑i=1N1hNφ(x−xihN)

其中, φu φu称为窗函数,或核函数、势函数。窗函数的作用是内插,每一样本对估计所起的作用取决于它到 x x的距离。当样本数 N N有限时,核宽度 hN hN对估计的效果有较大影响。

核函数的选取

一般可以选择的核函数有方窗、正态窗,指数窗函数等。正态窗函数为

φ(u)=12πexp{12u2} φ(u)=12πexp{−12u2}

φ(xxihN)=12πexp[12(xxihN)2] φ(x−xihN)=12πexp[−12(x−xihN)2]

则概率密度的估计为

pN(x)^=1NhNNi=112πexp[12(xxihN)2] pN(x)^=1N⋅hN∑i=1N12πexp[−12(x−xihN)2]

一个一维数据的实验:

QQ截图20150819004101

QQ截图20150819004051

对于mean-shift,将数据表示为点。我们认为这些数据采样于一个概率分布,KDE采用平滑的峰值函数(“核”)来拟合观察到的数据点,从而对真实的概率分布曲线进行模拟。

“核”是一个局部函数(例如高斯分布)。如果在足够的点处有足够合适的带权重和尺度的核,数据的分布便可以完全根据这些核来表示。将这些分布的核叠加组成一个概率表面(probability surface),取决于选取的核带宽参数,相应的密度函数会发生变化。

下图所示为点集使用核带宽为2的高斯核的KDE surface及等高线图。

 Mean shift

将每个点迭代地进行爬山算法直到其到达一个局部最优解(peak)。极端情况下,采用非常tall and tinny kernels(即很小的核带宽),KDE surface对于每一个点都有一个peak,也就是每个点都属于其自身的聚类。同理,采用extremely short fat kernels (e.g., 即很大的核带宽),会导致所有的点爬山到同一个peak,从而只有一个聚类。如下图,上面的仿真结果会形成3个KDE surface peaks即三个聚类中心,采用较小的核带宽,会产生更多的聚类中心。

爬山算法

一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解。如图1所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动都不能得到更优的解。

K-means 与Mean Shift Clustering的结合

K-means算法应用非常广泛,而mean-shift的应用比较局限(比如在图像分割领域)。

Mean Shift算法的缺陷:

  • calculation intensive,一般需要 O(kN2 O(kN2的计算复杂度(主要用于计算欧式距离), N N为样本数, k k为每个数据点的平均迭代次数。
  • Rely on sufficient high data density with clear gradient to locate the cluster centers。因而其对一些data outliers 无法找到合适的聚类。即一些小的不确定的聚类。

K-means算法没有以上缺陷,其通常只需要 O(kN) O(kN)的计算复杂度,所以适用于相对大型数据集。但它也有很明显的缺陷:

  • 其需要实现确定聚类数目,实际应用中很难操作,所以一般只能选足够大的聚类数目,这就导致一些自然的聚类会被多个聚类所表示
  • K-means无法找到non-convex cluster,k-means的聚类会对数据空间形成voronoi 分割。所以限制了k-means对于一些复杂的非线性数据的适用性。

但是,我们可以将它们结合起来来克服先前提到的问题。首先对数据集做K-means;然后我们在找到的聚类中心上做mean shift操作,由于现在的输入数据远小于原始数据,mean-shift可以较快地完成。

K-means并不知道正确的聚类数目,所以会选择一个较大的聚类数目。Mean Shift将合适的聚类中心合并来匹配自然的聚类。

K-means算法产生的聚类一般位于高密度空间,所以Mean Shift也就不会产生一些小的不确定的聚类。

同时,两者的结合可以解决非凸聚类的寻找问题

QQ截图20150819014312

 

猜你喜欢

转载自blog.csdn.net/ncut_matlab/article/details/50581726