arrays - 检测矩阵(二维数组)中的精确 block

标签 arrays matrix cluster-analysis

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

例如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 的 block 组成。

block 由一组行和一组列定义。 block 结构的特点是所有不属于 block 的条目都恰好为 0。但是, block 内也可能存在精确 0 的条目。

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

为了让事情变得更难(或者更容易?), block 不必是连续的。上述矩阵的排列版本,

     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

因此也有一个三 block 结构,可以描述为:

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

我想到的解决方案是:

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

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

我正在寻找一种算法或算法的其他想法,而不是为了实现。然而,一个实现例如欢迎使用 Matlab 或 Python。

最佳答案

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

这种算法称为双聚类(因为它们同时对行和列进行聚类)。 Cheng 和 Church 提出了一种早期方法。

关于arrays - 检测矩阵(二维数组)中的精确 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53640877/

相关文章:

matlab - 为什么这个 MATLAB 'if' 语句不起作用?

r - 使用 clusplot 绘制以 0 为中心坐标的聚类

python - Python 中的线性/保序聚类

r - 热图中的行顺序?

java - JAVA中不同数量的数组和数组元素生成子集

matrix - 将 GIMP 的透视变换矩阵应用到 GLSL 着色器中

c++ - 在函数调用结束后保留​​数组的内容。 (C++)

Python 大数据矩阵操作

arrays - ruby - 在 ruby​​ 中将多个哈希插入数组

javascript - AngularJS:从过滤器获取动态数组,然后将其用于 forEach 方法