我最近阅读了k-Means单次通过种子选择算法的文章,但对其中的算法不太理解,具体如下:
- 计算距离矩阵
Dist
,其中Dist (i,j)
表示从i
到j
的距离 - 计算
Sumv
,其中Sumv (i)
是第i
个点到所有其他点的距离之和 - 找到
Sumv
的最小值对应的点i
,并设置Index = i
- 将第一个点添加到
C
中作为第一个中心点 - 对于每个点
xi
,设置D (xi)
为xi
与C
中最近点的距离 - 计算
y
,它是Index
点的前n/k
个最近点的距离之和 - 找到唯一的整数
i
,使得D(x1)^2+D(x2)^2+...+D(xi)^2 >= y > D(x1)^2+D(x2)^2+...+D(x(i-1))^2
- 将
xi
添加到C
中 - 重复步骤5-8直到获得
k
个中心点
特别是步骤6,我们是继续使用同一个Index
(同一个点)还是使用C
中新添加的点?关于步骤8,i
是否必须大于1
?
回答:
说实话,我不会太担心理解那篇论文——它并不是很好。
- 算法描述得不好。
- 它实际上不是单次通过,需要进行n^2/2次成对计算再加上一次数据遍历。
- 他们没有报告他们的种子选择方案的运行时间,可能是因为它的工作量是O(n^2),非常差。
- 他们在非常简单的数据库上进行评估,这些数据库中k-Means不太容易陷入糟糕的解中。
- 他们评估“更好”的一个指标是给定种子选择后k-means运行所需的迭代次数。虽然这是一个有趣的指标,但他们报告的微小差异是无意义的(k-means++种子选择可能需要更多迭代,但每次迭代的工作量更少),而且他们没有报告运行时间或他们使用的k-means算法类型。
你会从学习和理解他们所比较的k-means++算法中获得更多益处,并阅读一些相关的背景历史。
如果你真的想理解他们在做什么,我建议你提升一下你的Matlab技能,并阅读他们提供的Matlab代码。但这真的不值得。如果你查找分位数种子选择算法,他们基本上在做非常相似的事情。不是使用到第一个种子的距离来排序点,他们似乎在使用成对距离的总和(这意味着他们不需要初始种子,因此有唯一解)。