您如何测试k均值的实现?


11

免责声明:我在Stackoverflow上发布了此问题,但我认为这可能更适合此平台。

您如何测试自己的多维数据集的k-means实现?

我正在考虑对数据运行一个已经存在的实现(即Matlab),并将结果与​​我的算法进行比较。但这将要求两种算法的工作原理大致相同,并且两种结果之间的映射可能并非易事。

你有更好的主意吗?

Answers:


10

k均值包括随机成分,因此除非您具有完全相同的实现并使用相同的起始配置,否则您不太可能获得相同的结果。但是,您可以看到结果是否与众所周知的实现相一致(不了解Matlab,但是R中的k-means算法的实现得到了很好的解释,请参见Hartigan&Wong,1979)。

至于比较两个系列的结果,如果要多次运行,则标签切换仍然存在问题。再次,在e1071 R软件包中,有一个非常方便的函数(; matchClasses()),可用于在双向分类表中的两个类别之间找到“最佳”映射。基本上,这个想法是重新排列行以使其与列的一致性最大化,或者使用贪婪的方法对行和列进行置换,直到对角线的总和(原始一致)最大。还提供诸如Kappa统计量的一致性系数。

最后,关于如何对实现进行基准测试,有许多免费的可用数据,或者您可以模拟专用的数据集(例如,通过有限的混合模型,请参见MixSim软件包)。


嗨,谢谢你的回答。如果您愿意,您也可以在SO回答相同的问题,我也在那里接受。=> stackoverflow.com/questions/4280371/…–
Framester

(+1)第一段很快成为问题的核心。
ub

6

两组结果之间的映射很容易计算,因为您在测试中获得的信息可以表示为一组三元组:第一个组件是一个(多维)点,第二个组件是(任意)簇标签由您的算法提供,第三个是参考算法提供的(任意)簇标签。构建通过ķķķ标签对的分类表:如果结果一致,它将是排列矩阵的倍数。也就是说,每一行和每一列必须恰好具有一个非零单元。这是编程的简单检查。跟踪从该理想值到单个数据点的微小偏差也很容易,因此您可以精确地看到两个答案如果完全不同则如何不同。我不会费心去计算一致性的统计量度:要么是完美的一致性(直到置换),要么是没有完美的一致性;在后一种情况下,您需要跟踪所有不一致的点以了解它们如何发生。结果要么一致,要么不一致。任何数量的分歧,甚至只是一点,都需要加以检查。

您可能需要使用几种数据集进行测试:(1)具有已发布的k均值结果的已发布的数据集;(2)具有明显强聚类的综合数据集;(3)没有明显聚类的综合数据集。(1)是编写任何数学或统计程序时都可以使用的良好学科。(2)在许多方面都很容易做到,例如通过生成一些随机点作为聚类中心,然后通过随机移动相对较小的聚类中心来生成点云。(3)提供一些可能发现意外行为的随机检查;同样,这是一个很好的常规测试学科。

另外,考虑通过仅位于极端解之间的边界上来创建强调算法的数据集。这将需要创造力和对算法的深刻理解(大概您已经掌握了!)。一个示例我希望在任何情况下,以检查将是集的形式的载体的,其中v是没有零个分量的矢量和呈现顺序整数值0 1 2 ... ñ - 1。我还想检查形成等边多边形的矢量集上的算法。在这两种情况下,情况ñ一世vv一世01个2ñ-1个ñ的倍数是特别有意思的,包括其中Ñķ。这些情况的共同点是(a)他们使用问题的所有维度,但是(b)正确的解决方案在几何上是显而易见的,并且(c)有多个正确的解决方案。ķñķ

(形成随机的等边多边形通过用两个非零矢量起始尺寸ùv随机选择(一个好方法是让他们的。2个d组件是独立的标准正态分布个变量)重缩放它们具有单位长度;让我们呼叫这些xz通过公式从z中删除x分量d2üv2dXžXž

w=ž-žXX

通过将w重新缩放为单位长度来获得。如果愿意,可以均匀地随机缩放xy。向量xy形成d维中随机2D子空间的正交基础。的正多边形Ñ顶点作为所述一组获得的COS 2 π ķ / Ñ X + 2 π ķ / Ñ ý作为所述整数ķ范围为0ÿwXÿXÿdñcos2πķ/ñX+2πķ/ñÿķ0)。ñ-1个


(+1)非常欢迎您对可能生成相关综合数据的方式发表评论。
chl 2010年

2

一种非常简单的“天真”方法是使用简单的综合数据,因为每个实现都应产生相同的集群。

Python中的示例import numpy as np

test_data = np.zeros((40000, 4))
test_data[0:10000, :] = 30.0
test_data[10000:20000, :] = 60.0
test_data[20000:30000, :] = 90.0
test_data[30000:, :] = 120.0

因为n_clusters = 4它应该给你一个排列[30, 60, 90, 120]


0

由于k均值包含随机选择的决策(仅初始化部分),因此我认为尝试算法的最佳方法是选择初始点,然后先将其固定在算法中,然后再选择该算法的另一个源代码,以相同的方式固定点。然后,您可以比较实际结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.