检测矩阵(二维数组)中的精确块

时间:2018-12-05 21:16:54

标签: arrays matrix cluster-analysis

我正在寻找一种有效的算法来识别具有许多0项的矩阵中的块结构。

例如6×7矩阵

0.0975    0.9575         0         0         0         0         0
0.2785    0.9649         0         0         0         0         0
0.5469    0.1576         0         0         0         0         0
     0         0    0.9706    0.9572         0         0         0
     0         0         0         0    0.8235    0.3171    0.0344
     0         0         0         0    0.6948    0.9502    0.4387

分别由三个大小分别为3×2、1×2和2×3的块组成。

一个块由一组行和一组列定义。块结构的特征在于,不属于块的所有条目都完全为0。但是,这些块中也可能存在完全为0的条目。

一个简单的解决方案是始终将整个矩阵声明为一个块;因此,寻求一种解决方案,以使块内条目的数量尽可能少。

要使事情变得更困难(或可能更容易?),这些块不必是连续的。上述矩阵的排列版本,

     0    0.9572         0         0         0         0    0.9706
     0         0    0.0975         0         0    0.9575         0
0.4387         0         0    0.9502    0.6948         0         0
0.0344         0         0    0.3171    0.8235         0         0
     0         0    0.2785         0         0    0.9649         0
     0         0    0.5469         0         0    0.1576         0

因此也具有三块结构,可以描述为:

  • 包含第3、4行和第1、4、5列的块
  • 包含第1行和第2、7列的块
  • 包含第2、5、6行和第3、6列的块。

我想到的解决方案是:

  • 使用基于连接权重的群集算法。但是,矩阵不必是对称的,甚至不必是正方形的。特定的行和特定的列之间没有对应关系。

  • 最初将一个块定义为包含一个(非0)条目(由其行和其列描述),在其行和其列中查找非0条目,并添加相应的列和行,迭代地增长,直到没有添加行或列为止;标识一个块。从块中未包含的条目开始执行相同的操作。重复直到没有剩余非0条目为止。在这里,我怀疑这种算法能否有效地扩展到具有许多块的大型矩阵。

我正在寻找一种算法,或者关于算法的其他想法,而不是一种实现。但是,例如欢迎使用Matlab或Python。

1 个答案:

答案 0 :(得分:1)

这是一般表达分析中的标准方案。

用于此目的的算法称为 biclustering (因为它们同时聚集行和列)。早期的方法归功于Cheng和Church。