Рассчитать Матричный ранг используя scipy - PullRequest
40 голосов
/ 19 марта 2010

Я бы хотел вычислить математический ранг матрицы, используя scipy.Наиболее очевидная функция numpy.rank вычисляет размерность массива (т. Е. Скаляры имеют размерность 0, векторы 1, матрицы 2 и т. Д.).Я знаю, что модуль numpy.linalg.lstsq обладает такой возможностью, но мне было интересно, встроена ли где-нибудь такая фундаментальная операция в класс матрицы.

Вот явный пример:

from numpy import matrix, rank
A = matrix([[1,3,7],[2,8,3],[7,8,1]])
print rank(A)

Это дает 2 измерение, где я ищу ответ 3.

Ответы [ 7 ]

55 голосов
/ 01 августа 2011

Numpy обеспечивает numpy.linalg.matrix_rank():

>>> import numpy
>>> numpy.__version__
'1.5.1'
>>> A = numpy.matrix([[1,3,7],[2,8,3],[7,8,1]])
>>> numpy.linalg.matrix_rank(A)
3
14 голосов
/ 28 июля 2010

Предоставить грубый фрагмент кода для людей, которым необходимо выполнить это на практике. Не стесняйтесь улучшать.

u, s, v = np.linalg.svd(A)
rank = np.sum(s > 1e-10)
5 голосов
/ 28 июля 2010

Если numpy не предлагает услуги ранга, почему бы вам не написать свою собственную?

Эффективным способом вычисления ранга является разложение по сингулярному значению - ранг матрицы равен числу ненулевых сингулярных значений.

def rank(A, eps=1e-12):
    u, s, vh = numpy.linalg.svd(A)
    return len([x for x in s if abs(x) > eps])

Обратите внимание, что eps зависит от вашего приложения - большинство согласится с тем, что 1e-12 соответствует нулю, но вы можете быть свидетелями численной нестабильности даже для eps = 1e-9.

Используя ваш пример, ответ три. Если вы измените вторую строку на [2, 6, 14] (линейно зависит от первой строки), ответ будет два ("нулевое" собственное значение - 4.9960E-16)

2 голосов
/ 19 марта 2010

Этот ответ устарел.

Ответ - нет, в настоящее время нет функции, предназначенной для вычисления ранга матрицы массива / матрицы в scipy. Добавление одного уже обсуждалось ранее, но если это произойдет, я не верю, что это произошло.

1 голос
/ 19 февраля 2018

scipy теперь содержит эффективный интерполяционный метод для оценки ранга матрицы / линейного оператора с использованием случайных методов, которые часто могут быть достаточно точными:

>>> from numpy import matrix
>>> A = matrix([[1,3,7],[2,8,3],[7,8,1]], dtype=float)  # doesn't accept int

>>> import scipy.linalg.interpolative as sli
>>> sli.estimate_rank(A, eps=1e-10)
3
1 голос
/ 19 марта 2010

Функции линейной алгебры обычно группируются в numpy.linalg. (Они также доступны с scipy.linalg, который имеет больше функций.) Это позволяет полиморфизм: функции могут принимать любые типы, которые обрабатывает SciPy.

Итак, да, функция numpy.linalg.lstsq делает то, что вы просите. Почему этого недостаточно?

1 голос
/ 19 марта 2010

Я не знаю, в частности, о Numpy, но вряд ли это будет встроенная операция над матрицей; он включает в себя довольно интенсивные численные вычисления (и связанные с этим проблемы с ошибкой округления с плавающей запятой и т. д.) и выбор порогов, которые могут или не могут быть уместными в данном контексте, и выбор алгоритма важен для его точного и быстрого вычисления.

Вещи, встроенные в базовые классы, - это, как правило, вещи, которые могут быть выполнены уникальным и простым способом, например, умножение матриц на самые сложные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...