Как найти линейно зависимые векторы в матрице?

Нужно найти линейно зависимые векторы в матрице произвольного размера. В примере такими векторами есть второй и четвертый.

import numpy as np

matrix = np.array([
    [1, 0, 1, 1, 1, 0],
    [0, 0, 0, 1, 0, 0],
    [1, 0, 0, 0, 0, 1],
    [0, 0, 0, 1, 0, 0]
    ])

Пробовал банальным перебором, но получилось очень громоздко и криво, поэтому даже не стал дописывать. Надеюсь, есть способ проще. Еще пытался использовать np.linalg.eig, но не могу разобраться как ее правильно использовать.


Ответы (2 шт):

Автор решения: CrazyElf

По идее, надо смотреть матрицу корреляции, которую даёт np.corrcoef, но как её правильно интерпретировать я сходу не соображу. Хотя и вижу единички не на диагонали:

print(np.corrcoef(matrix))

Вывод:

[[ 1.          0.31622777 -0.25        0.31622777]
 [ 0.31622777  1.         -0.31622777  1.        ]
 [-0.25       -0.31622777  1.         -0.31622777]
 [ 0.31622777  1.         -0.31622777  1.        ]]

Подумал ещё, сочинил вот такого монстра:

print(np.nonzero(((np.corrcoef(matrix) - np.eye(matrix.shape[0])) >= 1.)))

На выходе:

(array([1, 3]), array([3, 1]))

Интерпретировать можно так (учитывая, что индексация в Питоне идёт с 0, т.е. в вашем случае имеем векторы под индексом 0, 1, 2, 3): вектор 1 линейно коррелирует с вектором 3; и наоборот: вектор 3 линейно коррелирует с вектором 1.

→ Ссылка
Автор решения: Ted Mosby

Если кому-то пригодится, решил проблему таким образом:

from itertools import combinations
from numpy import sum as npsum

def combs(matr):
    arr = []
    for k in range(2, len(matr) + 1):
        rows = combinations(matr,k)
        indices = list(combinations(range(len(matr)), k))
        for i, j in enumerate(rows):
            if sum(npsum(j, axis=0) % 2) == 0: 
                arr.append(indices[i])
    return arr
→ Ссылка