我n在一些任意空间中有数据点,我对它们进行聚类。
我的聚类算法的结果是一个由l长度为 int 的向量表示的分区,n将每个点分配给一个集群。值的l范围从 0 到(可能)n-1。
例子:
l_1 = [ 1 1 1 0 0 2 6 ]
将n=7点划分为 4 个簇:前三个点聚集在一起,第四个和第五个点在一起,最后两个点形成两个不同的单例簇。
我的问题:
假设我有两个分区l_1,l_2如何有效地确定它们是否代表相同的分区?
例子:
l_2 = [ 2 2 2 9 9 3 1 ]
是相同的,l_1因为它表示点的相同分区(尽管集群的“数字”/“标签”不相同)。
另一方面
l_3 = [ 2 2 2 9 9 3 3 ]
不再相同,因为它将最后两点组合在一起。
我正在寻找 C++、python 或 Matlab 中的解决方案。
不想要的方向
一种天真的方法是比较共现矩阵
c1 = bsxfun( @eq, l_1, l_1' );
c2 = bsxfun( @eq, l_2, l_2' );
l_1_l_2_are_identical = all( c1(:)==c2(:) );
共现矩阵c1的大小为nx n,trueif 点位于同一簇中,k否则(无论簇“编号”/“标签”如何)。
因此,如果共现矩阵和相同,则和表示相同的分区。mfalsec1c2l_1l_2
但是,由于点的数量n, 可能非常大,我想避免使用 O( n^2) 解决方案...
有任何想法吗?
谢谢!