Как найти линейно зависимые векторы в матрице?
Нужно найти линейно зависимые векторы в матрице произвольного размера. В примере такими векторами есть второй и четвертый.
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 шт):
По идее, надо смотреть матрицу корреляции, которую даёт 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.
Если кому-то пригодится, решил проблему таким образом:
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