Medoid Shift(中心点偏移) 算法
Medoid Shift (中心点偏移)是一种应用核密度估计的非参数mode(算法中代表密度局部最大值)搜索算法,是基于medoids(中心点) 的加权来估计局部的近似梯度,通过计算shift从而向数据密度更大的区域偏移。Medoid shifts 可以用于增长数据集的增量聚类,图像分割、使用增量聚类进行镜头分割和对非线性可分离数据进行聚类等[1] 。
Medoid Shift算法分析
Medoid shift 与Mean shift
Medoid shift 算法是源于Mean shift 算法(查看参考文献[2])的思想,它的理论和过程和Mean shift有很类似的地方。它们都是通过计算shift向数据密度更大的区域偏移,通过迭代找到聚类中心,自动计算聚类数,并且数据不必线性可分。与Mean shift不同,Medoid shift不需要mean的定义,medoid不需要明确的特征空间,只需要定义有效的样本点距离度量。两者最大的不同是相较于Mean shift 算法中计算shift是找均值偏移向量的位置,Medoid shift算法计算shift寻找的是距离偏移最近的数据集里的点。
用公式表示两者的过程, y k y_k yk代表当前数据点的位置, y k + 1 y_{k+1} yk+1代表算法计算的下一个位置。
Note: 公式是直接复制自文献[1],但是为什么这样表示,可以查看参考文献[2]公式(12),这里其实是求密度梯度估计。
Mean shift可以表示如下[1]
y
k
+
1
m
e
a
n
=
a
r
g
m
i
n
y
∑
i
∥
x
i
−
y
∥
2
φ
(
∥
x
i
−
y
k
h
∥
2
)
(
1
)
y_{k+1}^{mean} = \mathop{arg min}_{y} \sum_{i}\parallel x_i -y\parallel^2\varphi(\parallel\frac{x_i -y_k}{h} \parallel^2) \quad \quad \quad \quad \quad \quad (1)
yk+1mean=argminyi∑∥xi−y∥2φ(∥hxi−yk∥2)(1)
Medoid shift可以表示如下[1]
y
k
+
1
m
e
d
o
i
d
=
a
r
g
m
i
n
y
∈
x
i
∑
i
∥
x
i
−
y
∥
2
φ
(
∥
x
i
−
y
k
h
∥
2
)
(
2
)
y_{k+1}^{medoid} = \mathop{arg min}_{y\in{x_i}} \sum_{i}\parallel x_i -y\parallel^2\varphi(\parallel\frac{x_i -y_k}{h} \parallel^2) \quad \quad \quad \quad \quad (2)
yk+1medoid=argminy∈xii∑∥xi−y∥2φ(∥hxi−yk∥2)(2)
可以看到,Mean shift 选择最小化函数(1)的位置
y
y
y,而 Medoid shift 选择最小化函数(2)的数据样本点
x
i
x_i
xi。具体如下图一所示。
图一(来源于参考文献[1] 中Figure1)
Medoid shift算法
Medoid shift 其实可以理解为把整个数据集看成一个森林,每个单独的簇类代表森林里的多个不相交的树(森林里可以有多棵树,一棵树代表一个簇),其中每棵树由属于同一簇的node节点(对应样本点)组成,每棵树的根对应于该树指定的mode(簇类中心)。Medoid shift 在数据点
y
(
k
)
y(k)
y(k) 与其对应的
y
(
k
+
1
)
y(k+1)
y(k+1) 之间建立一个有向边,可以使用单个树遍历将簇类分配给与该树相关联的所有点。可以理解成类似于下图二的连接方式
图二(来源于参考文献[3] 中Figure1)
对于Medoid shift聚类,由于 ∀ k , y k ∈ x i \forall k,y_k\in{x_i} ∀k,yk∈xi,对于任何 y k , y k + 1 y_k,y_{k+1} yk,yk+1必然属于样本集中的一个点。 因此,在每一次计算新的mode点的时候,每个数据样本点只需要计算一次shift偏移。 一旦为数据集中的所有样本点计算了shift偏移,那么所有 y k + 1 y_{k+1} yk+1 的下一个shift偏移就已经存在了[2]。
如果在一次迭代中某个样本点的 y k y_k yk 与 y k + 1 y_{k+1} yk+1 相同,则认为这个样本点是这次迭代的其中一个mode(并非最终的mode)。Medoid shift聚类算法中,除了第一次计算使用所有的样本点,后续迭代计算是以上一次迭代得出的所有mode点作为新的样本点进行计算 y k + 1 y_{k+1} yk+1的,一直迭代到mode点的个数不再变化,则认为所有的正确的mode点已经找到了。
Medoid shift算法过程图示
- 以下图的数据集为例 (图示的坐标轴有点差别)
图三
- 根据公式(2)计算数据集中每个样本点
y
k
y_k
yk的medoid shift 的
y
k
+
1
y_{k+1}
yk+1,
y
k
y_k
yk代表当前数据点的位置,
y
k
+
1
y_{k+1}
yk+1代表算法计算的下一个位置。计算得出的第一次中
y
k
y_k
yk 与
y
k
+
1
y_{k+1}
yk+1 相同的点为图中红色点所示。(图示的坐标轴有点差别)
图四
-
以2中得到的mode点作为新的样本点,计算每个新样本点 y k y_k yk的medoid shift 的 y k + 1 y_{k+1} yk+1 。(图示的坐标轴有点差别)
图五 -
直到mode点的个数不再变化,则medoid shift的算法结束。(图示的坐标轴有点差别)
图六
-
最终经过medoid shift 算法后,得到的不同簇和簇中心如下图七所示。(图示的坐标轴有点差别)
图七
Medoid shift算法实现
算法的实现,其实在文献[1]中已经有非常详细的讲解了,这里直接引用了。
下面是采用矩阵运算来代替上面算法的步骤1,用于简化计算。
为什么可以用矩阵来代替计算呢?文献[1]中也做了详细的解答,这里直接引用。
总结
总的来说,Medoid shift 算法其实是Mean shift 算法的改进型。其相对于Mean shift 算法具有一下三个优势[3]:
-
对于每一个样本点 x i x_i xi向聚类中心mode偏移的轨迹 y i ( 1 ) , i = 1 , 2 , ⋯ , N y_i(1),i = 1,2,\cdots,N yi(1),i=1,2,⋯,N只需要计算一次(因为 y i ( t + 1 ) = y y i ( t ) ( 1 ) y_i(t+1) = y_{y_i(t)}(1) yi(t+1)=yyi(t)(1)。
-
不需要停止迭代和合并聚类的相关条件。
-
数据特征空间可能是非欧几里得的,只需要定义点的距离度量即可。
Note:代码参考可以查看[4] Python版本 ,[5] matlab 和C++ 版本。
参考文献
[1] Y. A. Sheikh, E. A. Khan and T. Kanade, “Mode-seeking by Medoidshifts,” 2007 IEEE 11th International Conference on Computer Vision, 2007, pp. 1-8, doi: 10.1109/ICCV.2007.4408978.
[2] Comaniciu D , Meer P . Meer, P.: Mean shift: A Robust Approach Toward Feature Space Analysis. IEEE Transactions on Pattern Analysis and Machine Intelligence 24(5), 603-619[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2002, 24(5):603-619.
[3] Vedaldi, A. , and S. Soatto . “Quick Shift and Kernel Methods for Mode Seeking.” European Conference on Computer Vision DBLP, 2008.
代码参考
[4] MedoidShift and Quickshift algorithms Implementation https://github.com/Nick-Ol/MedoidShift-and-QuickShift
[5] https://gitee.com/bryantdai/cv-paper-reproduction/tree/master/Medoid%20Shift