【问题标题】:detect exact blocks in matrix (two-dimensional array)检测矩阵中的精确块(二维数组)
【发布时间】:2018-12-07 15:10:38
【问题描述】:

我正在寻找一种有效的算法来识别具有许多 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。

【问题讨论】:

  • 您能否根据行数和列数说明您需要处理的矩阵的大小?许多?数百?数千?更多?
  • @dmuir,行数为数千,列数为数百。

标签: arrays matrix cluster-analysis


【解决方案1】:

这是一般表达式分析中的标准场景。

这种算法称为双聚类(因为它们同时对行和列进行聚类)。一个早期的方法归功于Cheng和Church。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多