Scipy - найти основания пространства столбцов матрицы

Я пытаюсь написать простой алгоритм Simplex, первым шагом которого является поиск базового возможного решения:

  1. Выберите набор B линейно независимых столбцов A
  2. Установите все компоненты x, соответствующие столбцам, не входящим в B, равными нулю.
  3. Решите получившиеся m уравнений, чтобы определить компоненты x. Это основные переменные.

Я знаю, что решение будет включать использование scipy.linalg.svd (или scipy.linalg.lu) и некоторой магии numpy.argwhere / numpy.where, но я не уверен, как именно.

Есть ли у кого-нибудь чистая реализация Numpy/Scipy для поиска основы (шаг 1) или, что еще лучше, всего вышеперечисленного?

Пример:

>>> A
array([[1, 1, 1, 1, 0, 0, 0],
       [1, 0, 0, 0, 1, 0, 0],
       [0, 0, 1, 0, 0, 1, 0],
       [0, 3, 1, 0, 0, 0, 1]])

>>> u, s, v = scipy.linalg.svd(A)
>>> non_zero, = numpy.where(s > 1e-7)
>>> rank = len(non_zero)
>>> rank
4
>>> for basis in some_unknown_function(A):
...     print(basis)
{3, 4, 5, 6}
{1, 4, 5, 6}

и так далее.


person MikeRand    schedule 27.11.2014    source источник
comment
Для всего вышеперечисленного попробуйте scipy.optimize.linprog в достаточно новом SciPy, который фактически реализует симплексный алгоритм.   -  person Fred Foo    schedule 27.11.2014


Ответы (2)


разложение QR обеспечивает ортогональный базис для пространства столбца A:

q,r = np.linalg.qr(A)

Если ранг A равен n, то первые n столбца q формируют основу для пространства столбцов A.

person jme    schedule 27.11.2014
comment
Но я думал, что основания столбца A будут линейно независимыми подмножествами столбцов A. q выше кажется чем-то другим. - person MikeRand; 27.11.2014
comment
q — это набор ортогональных векторов, которые охватывают пространство столбца A. Потенциально существует бесконечно много оснований пространства столбцов, q особенно хорош. Но если вам нужно, чтобы базис состоял из столбцов A, вы можете вычислить разложение QR и отбросить линейно зависимые столбцы. Например, см. здесь. - person jme; 27.11.2014
comment
Я только что проверил и обнаружил, что в настоящее время неправильно использовать np.linalg.qr(A) для поиска основы для пространства столбца A. Это связано с тем, что нам могут понадобиться все ортонормированные векторы, которые он предоставляет через q, чтобы получить A — даже для сингулярных матриц. Вместо этого мы должны использовать scipy.linalg.qr(A, pivoting=True), чтобы первые n столбцов q дали нам основу. scipy.linalg.qr< /а> - person Shahrokh Bah; 19.01.2021

Попробуйте использовать это

scipy.linalg.orth(A)

это дает ортонормированный базис для матрицы A

person Jayanth Kumar    schedule 29.03.2018