【问题标题】:Finding linearly interdependent columns of a matrix in numpy在numpy中查找矩阵的线性相互依赖的列
【发布时间】:2014-07-30 17:24:41
【问题描述】:

问题:我有一个 MxN 矩阵,其中 M>=N。我想在这个矩阵中识别出线性相互依赖的列向量组。

我希望在 numpy 中有一种快速简便的方法。

>>> a = np.random.randn(7, 6)
>>> a[:, 3] = 2*a[:, 0]-a[:, 4]
>>> a[:, 5] = 3*a[:, 1]

我正在寻找一个函数get_column_groups,它将返回

>>> get_column_groups(a)
array([0, 1, 2, 0, 0, 1])

如果它还返回每个组的排名,我猜加分,例如:

>>> groups, group_ranks = get_column_groups(a)
>>> groups    
array([0, 1, 2, 0, 0, 1])
>>> group_ranks
[2, 1, 1]

【问题讨论】:

  • 我不确定我是否正确理解了这个问题,并且想知道它的定义明确到什么程度,因为我不确定这些组是独一无二的。下面我根据矩阵的Spark给出了答案。
  • 也许您的问题比这更具体,可以通过附加信息更好地解决?
  • 我的直觉是它是独一无二的,但也许我的直觉并没有推广到更高的维度。用 3 个向量描绘一个 3-d 空间,其中两个向量的“组”位于穿过原点的线上。第三个,孤独的向量不能被构造为 2 组中向量的线性组合,但是 2 组中的任何向量都是另一个向量的倍数。所以我们有 groups==[0, 0, 1] 和 group_ranks = [1, 1]。我无法想象一个向量可能属于多个组的情况,但也许那是因为我无法想象 4-d。
  • 也许我的推理只在 M
  • 假设 R 是 MxN 矩阵的秩,其中 M>=N。 R

标签: python numpy matrix linear-algebra


【解决方案1】:

据我理解的问题,计算矩阵的Spark 是您请求的子问题,因此在大多数情况下将其呈现为 NP-Complete。

可能有一些算法比仅仅对最大为rank(a) 的列进行组合评估做得更好,但这只是一个开始。

【讨论】:

  • Here 是一个可以作为起点的 octave 实现。
  • 嗯。是的,所以我想愚蠢的方法是
  • spark 标识最低维组的维度,但不标识定义它的列。我想我需要argspark。然后,您可以迭代地删除这些列以获取组。
  • 愚蠢的方法是获取所有可能的列组合,并获取每个组合组成的子矩阵的排名,然后将每列分配给它所属的排名最低的组合。我认为这行得通。
  • 我指出Spark是为了表明问题很困难。正如您所说,您要查找的第一组将在 argSpark 中。
猜你喜欢
  • 1970-01-01
  • 2021-08-27
  • 2016-07-02
  • 1970-01-01
  • 2018-12-14
  • 2013-09-02
  • 2019-03-07
  • 2016-04-13
  • 1970-01-01
相关资源
最近更新 更多