我正在寻找一种有效的算法来识别具有许多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
因此也具有三块结构,可以描述为:
我想到的解决方案是:
使用基于连接权重的群集算法。但是,矩阵不必是对称的,甚至不必是正方形的。特定的行和特定的列之间没有对应关系。
最初将一个块定义为包含一个(非0)条目(由其行和其列描述),在其行和其列中查找非0条目,并添加相应的列和行,迭代地增长,直到没有添加行或列为止;标识一个块。从块中未包含的条目开始执行相同的操作。重复直到没有剩余非0条目为止。在这里,我怀疑这种算法能否有效地扩展到具有许多块的大型矩阵。
我正在寻找一种算法,或者关于算法的其他想法,而不是一种实现。但是,例如欢迎使用Matlab或Python。
答案 0 :(得分:1)
这是一般表达分析中的标准方案。
用于此目的的算法称为 biclustering (因为它们同时聚集行和列)。早期的方法归功于Cheng和Church。