上篇博客介绍了基于距离的K-Means聚类,这次给大家推荐一个基于密度的聚类算法:Meanshift(均值漂移)。
Meanshift 聚类基本原理
Meanshift 聚类的主要思路是:计算某一点A与其半径R内的点之间向量距离的平均值M,得到该点下一步的漂移(移动)方向(A=M+A)和距离(||M||)。当该点不再移动时,计算这个点与历史簇中心的距离,满足小于阈值D即合并为同一个类簇,不满足则自身形成一个类簇。直到所有的数据点选取完毕。
Meanshift 聚类流程简述
相比 K-Means 聚类,Meanshift 最大的优势是不需要人为指定分成几类。该算法会根据分布密度自动将数据归到适合的类中。
Meanshift 聚类算法的大致思想就是 “哪里人多哪里跑” :
首先,将所有数据点设置为未标价状态。
- 从未被标记的数据中随机选取一个点作为初始大佬(质心);
由于事先并不知道会聚成几类,所以只能一类一类的聚,最后聚成几类就几类了╮(╯▽╰)╭。 - 以当前大佬为圆心,半径为 R R R(超参1) 画个圆,圆内的点记做集合 M M M,里面为该位大佬的小弟;为了方便日后相认,大佬决定给小弟们一张带来自己标识的保命卡进行标记。
- 由于是随机选择的大佬,难以服众。这位大佬的小弟们提出要召开选举大会,选出新的大佬(即通过算法选出新的质心);
- 投票依据:这一届的小弟都很喜欢热闹,哪里人多就往哪边投。依次计算各位小弟到该大佬的向量距离(黑色向量)的平均值 s h i f t shift shift(绿色向量),如下图所示。
- 更新方式:旧大佬(蓝色圆圈)沿着投票方向即shift向量的方向移动,移动距离是||shift||,即为新大佬的位置(橙色圆圈)。也就是说这个大佬是“虚拟的”。
- 迭代2~3步骤,直到新大佬和旧大佬之间的偏移量小于某一个设置的阈值 δ \delta δ (超参2),即表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛。从而得到一个候选大佬(还不是正式的哈,晋级之路漫漫其修远兮)。
- 比较这位候选大佬跟正式大佬的距离,若距离小于指定的阈值 ω \omega ω(超参3),则合并这两个大佬。否则,将该候选大佬提升为正式大佬,类别数加1;
- 迭代上述1~5步骤,直到所有数据点都被标记;
- 正式大佬全部确定下来后,小弟们就要选择投靠哪位大佬了。根据大佬在晋级路上发给小弟们的保命卡数量(即每个正式大佬对每个小弟的访问频数),小弟们选择投靠给自己保命卡最多的大佬(即对自己访问频数最大的那个大佬)。看样子小弟们还是很念旧情的哈。
- 注意:上面涉及的三个超参是需要用户人为指定的哈。
实例演示
看了上面的原理简述,估计还是有点糊涂,下面举一个非常形象简单的例子。
如下图所示,有6个点,从图上看应该可以分成两堆,前三个点一堆,后三个点另一堆。现在我手工地把MeanShift 算法的计算过程演示一下,同时检验是不是和预期一致:
-
随机选择一个初始大佬(就选 P2),开始它的晋级之路;
-
以 R = 5 R=5 R=5 为半径,圈定大佬的势力范围。在范围内的点 P1、P3 即为该大佬的小弟。大佬为了笼络小弟们的心,给范围内的小弟人手一张保命卡。此时所有数据点的保命符情况:
保命符 | P1 | P2 | P3 | P4 | P5 | P6 |
---|---|---|---|---|---|---|
大佬1 | 1 | 0 | 1 | 0 | 0 | 0 |
-
召开选举大会,重新选大佬。
首先,计算各位小弟到该大佬的向量距离(黑色向量)的平均值 s h i f t shift shift。
P1 | P3 | |
---|---|---|
距离向量 | ( − 1 , − 2 ) (-1,-2) (−1,−2) | ( 2 , − 1 ) (2,-1) (2,−1) |
则, s h i f t = ( − 1 + 2 2 , − 2 − 1 2 ) = ( 0.5 , − 1.5 ) shift=(\dfrac{-1+2}{2}, \dfrac{-2-1}{2})=(0.5,-1.5) shift=(2−1+2,2−2−1)=(0.5,−1.5)
此时,旧大佬沿着shift向量的方向进行漂移,漂移长度为||shift||,即为新大佬 P 哥的位置: ( 1 , 2 ) + ( 0.5 , − 1.5 ) = ( 1.5 , 0.5 ) (1,2)+(0.5, -1.5) = (1.5, 0.5) (1,2)+(0.5,−1.5)=(1.5,0.5)
- 令超参 δ = 1 \delta=1 δ=1,由于上一步偏移距离 ∣ ∣ s h