【发布时间】:2023-03-30 09:40:01
【问题描述】:
我在某个任意空间中有n 数据点,我将它们聚类。
我的聚类算法的结果是一个由长度为 n 的 int 向量 l 表示的分区,将每个点分配给一个集群。 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 的大小为nxn,如果点k 和m 在同一个簇中,则false 位于同一簇中,否则为false(无论簇如何)数字”/“标签”)。
因此,如果共现矩阵c1 和c2 相同,则l_1 和l_2 表示相同的分区。
但是,由于点数 n 可能非常大,我想避免使用 O(n^2) 解决方案...
有什么想法吗?
谢谢!
【问题讨论】:
-
[1 1 2 2 3 3] 和 [1 1 2 2 1 1] 怎么样?它们是一样的吗?
-
@ElKamina 显然不是。
标签: c++ python algorithm matlab cluster-analysis