我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
的大小为n
x n
,true
if 点位于同一簇中,k
否则(无论簇“编号”/“标签”如何)。
因此,如果共现矩阵和相同,则和表示相同的分区。m
false
c1
c2
l_1
l_2
但是,由于点的数量n
, 可能非常大,我想避免使用 O( n^2
) 解决方案...
有任何想法吗?
谢谢!