Answers:
k均值包括随机成分,因此除非您具有完全相同的实现并使用相同的起始配置,否则您不太可能获得相同的结果。但是,您可以看到结果是否与众所周知的实现相一致(不了解Matlab,但是R中的k-means算法的实现得到了很好的解释,请参见Hartigan&Wong,1979)。
至于比较两个系列的结果,如果要多次运行,则标签切换仍然存在问题。再次,在e1071 R软件包中,有一个非常方便的函数(; matchClasses()
),可用于在双向分类表中的两个类别之间找到“最佳”映射。基本上,这个想法是重新排列行以使其与列的一致性最大化,或者使用贪婪的方法对行和列进行置换,直到对角线的总和(原始一致)最大。还提供诸如Kappa统计量的一致性系数。
最后,关于如何对实现进行基准测试,有许多免费的可用数据,或者您可以模拟专用的数据集(例如,通过有限的混合模型,请参见MixSim软件包)。
两组结果之间的映射很容易计算,因为您在测试中获得的信息可以表示为一组三元组:第一个组件是一个(多维)点,第二个组件是(任意)簇标签由您的算法提供,第三个是参考算法提供的(任意)簇标签。构建通过ķ标签对的分类表:如果结果一致,它将是排列矩阵的倍数。也就是说,每一行和每一列必须恰好具有一个非零单元。这是编程的简单检查。跟踪从该理想值到单个数据点的微小偏差也很容易,因此您可以精确地看到两个答案如果完全不同则如何不同。我不会费心去计算一致性的统计量度:要么是完美的一致性(直到置换),要么是没有完美的一致性;在后一种情况下,您需要跟踪所有不一致的点以了解它们如何发生。结果要么一致,要么不一致。任何数量的分歧,甚至只是一点,都需要加以检查。
您可能需要使用几种数据集进行测试:(1)具有已发布的k均值结果的已发布的数据集;(2)具有明显强聚类的综合数据集;(3)没有明显聚类的综合数据集。(1)是编写任何数学或统计程序时都可以使用的良好学科。(2)在许多方面都很容易做到,例如通过生成一些随机点作为聚类中心,然后通过随机移动相对较小的聚类中心来生成点云。(3)提供一些可能发现意外行为的随机检查;同样,这是一个很好的常规测试学科。
另外,考虑通过仅位于极端解之间的边界上来创建强调算法的数据集。这将需要创造力和对算法的深刻理解(大概您已经掌握了!)。一个示例我希望在任何情况下,以检查将是集的形式的载体的,其中v是没有零个分量的矢量和我呈现顺序整数值0 ,1 ,2 ,... ,ñ - 1。我还想检查形成等边多边形的矢量集上的算法。在这两种情况下,情况ñ是不的倍数是特别有意思的,包括其中Ñ是少比ķ。这些情况的共同点是(a)他们使用问题的所有维度,但是(b)正确的解决方案在几何上是显而易见的,并且(c)有多个正确的解决方案。
(形成随机的等边多边形通过用两个非零矢量起始尺寸ù和v随机选择(一个好方法是让他们的。2个d组件是独立的标准正态分布个变量)重缩放它们具有单位长度;让我们呼叫这些x和z通过公式从z中删除x分量
通过将w重新缩放为单位长度来获得。如果愿意,可以均匀地随机缩放x和y。向量x和y形成d维中随机2D子空间的正交基础。的正多边形Ñ顶点作为所述一组获得的COS (2 π ķ / Ñ )X + 罪(2 π ķ / Ñ )ý作为所述整数ķ范围为0至)。