前言

    在之前关于聚类算法的文章中,笔者主要涉及的内容均是和参数求解相关的,如C均值(包括模糊C均值)、混合高斯模型等,而对于一些无参数密度估计的算法尚未讨论,而且一般基于参数密度估计的算法均是建立在假设的概率分布族(如高斯分布、多项式分布等)基础之上的,而在实际运用中可能我们无法预先估计或者假设样本的概率分布到底是来自哪种情形,故对此情况普通的方法可能就一筹莫展了。所以本文给出一种无参数密度估计的多个峰值方法,从理论上就能得到聚类算法。

    本文就是讨论这种无参数密度估计的聚类算法,这主要包括山峰算法均值漂移算法,我们主要聚焦于山峰算法,而对于均值漂移就不过多讨论,有兴趣的读者可以参看相关文献。

    而对于山峰算法的讨论,包括削峰法和描峰法,这两个算法的共同点都是需要计算样本的密度,而描峰法还有其它更好的性质,在下文中笔者会给出相关描述。

削峰法

    笔者在之前的文章中讨论相关聚类算法时曾提及,对于传统的聚类算法存在几个问题:如聚类中心(这个一般是随机的)、迭代次数(这个可能需要视收敛情况,如果到局部鞍点就会存在问题)、收敛误差等等,故会造成结果在一定意义上的不确定性,即没有很好的鲁棒性;如果在初始时选择了不甚恰当的聚类中心,将会导致聚类失败,无端地损失了计算资源。

    1994年,YagerFilev提出了一种新的聚类方法,可以将其作为初始聚类中心选择方法,这个算法的基本思想是基于这样一个事实:能成为聚类中心的点的密度一定都很大,而且聚类中心之间的距离也一定较大。

                 那么如何定义所谓的样本点密度,由下式给出:

c5748b4ad32420d0b71c7767036c24fb.png-wh_

    通过上式能够看出,其实所谓样本点的密度是某个点到其它点的距离(这里使用了高斯距离)之和,那么如果某个点的密度越大则说明的它周边的样本点越多,那么它愈有可能成为聚类的中心,故算法的开始就是计算所有样本点的密度,选取其中最大的一个作为第一个聚类中心,这里可以看出在选取聚类中心时,没有像KMeans算法等随机选取C个(假定需要聚类的数量是C),故从这个角度而言算法本身就避免了一定的盲目性。

    那么如何选择余下的聚类中心呢?这里就要使用所谓的削峰思想了:

53442ba4a6d7e503c21a818d577a0aab.png-wh_

    在上述公式中,spacer.gif表示第一次(第一类)找出的密度最大的样本点的密度,那么根据上述公式再次找出密度最大的样本点作为第二个聚类中心,而削峰的作用是把所有样本点的密度都减去第一个聚类中心的密度,而离第一个聚类中心越近的点则削峰效果越明显,这就体现了类内高度聚合、类间最大分离的思想;然后算法依次计算直到找到所有聚类中心或者本次聚类中心的密度和第一个聚类中心密度之比小于一个常数,即:

95b3560426d72106ac1b911e2072bcb5.png-wh_

   对于上述算法而言,其找出所有聚类点的时间复杂度是O(CN),通过对于这个算法的描述可以看出,其实对于聚类而言并没有结束,我们还需将集合中剩余的点分别归类到各自类中,但这个已经不是很重要了,使用削峰法并结合以前的相关方法可以轻易地对样本进行处理,而且这个算法的鲁棒性较好。但如何选择σ其实还是对结果有一定影响,即如果选的太大则覆盖范围过广,可能达不到聚类的目的,而选择得太小则有可能算法在中途就会结束(未达到C),所以笔者建议还是可以对这个参数加上一个函数以逼近其可能的最优值(随之而来的是为了尝试这个较优值会带来算法运行时间的加长)。

描峰法

   原始的削峰法虽然直观(这里的直观只不过是说算法较直观而已)且简单,但如果样本数据是高维的(难道又是维度灾难?这里显然不是),则聚类的性能很难进行直接观察。为了解决这个问题,Alex RodriguezAlessandro Laio2014年提出了一种新的山峰聚类法,这个算法可以直观地在二维坐标下展示对于样本点的聚类效果。

             如何定义这个二维坐标的坐标轴呢?这里需要涉及到如下公式,同样地,我们定义样本点密度:

17914fd790afa8f6b8db8937b661cb42.png-wh_

   上述公式定义了某点的密度(实际就是聚合度),其中坐标轴中的一维就是它,而另一维就是所谓的分离度:

981cdc7b9611d3a6e279d7a0add4467a.png-wh_

   公式5的含义为,对于样本点spacer.gif而言,密度大于它的点中,到其最大的距离;可以想见,该值越大,则表示点spacer.gif距离高密度点的距离越远,则其越有可能成为聚类的中心。

     选定聚类中心以后,其它点的归属是先按密度由高到低排列,密度最高的未标定点与最近已标定点标定为同类,这样反复计算下去,就像描绘山峰一样,因此这个算法被称作描峰法。