python — вычислить ранг матрицы, используя scipy
Задавать вопрос
спросил
Изменено 5 лет назад
Просмотрено 40 тысяч раз
Я хотел бы рассчитать математический ранг матрицы с помощью scipy. Самая очевидная функция numpy.rank
вычисляет размерность массива (т. е. скаляры имеют размерность 0, векторы 1, матрицы 2 и т. д.). Я знаю, что модуль numpy.linalg.lstsq
имеет эту возможность, но мне было интересно, встроена ли такая фундаментальная операция где-нибудь в матричный класс.
Вот явный пример:
из матрицы импорта numpy, ранг A = матрица ([[1,3,7],[2,8,3],[7,8,1]]) ранг печати (A)
Это дает 2
измерение, где я ищу ответ 3
.
- питон
- матрица
- numpy
- scipy
3
Numpy предоставляет numpy.linalg.matrix_rank()
:
>>> импортировать numpy >>> numpy.__version__ «1.5.1» >>> A = numpy.matrix([[1,3,7],[2,8,3],[7,8,1]]) >>> numpy.linalg.matrix_rank(A) 3
1
Предоставить примерный фрагмент кода для людей, которым нужно сделать это на практике. Не стесняйтесь совершенствоваться.
u, s, v = np.linalg.svd(A) ранг = np.sum(s > 1e-10)
Если numpy
не предлагает средства ранга, почему бы вам не написать свой собственный?
Эффективным способом вычисления ранга является разложение по сингулярным значениям — ранг матрицы равен количеству ненулевых сингулярных значений.
ранг защиты (A, eps=1e-12): u, s, vh = numpy.linalg.svd(A) return len([x вместо x в s, если abs(x) > eps])
Обратите внимание, что в вашем приложении eps зависит от
— большинство согласится с тем, что 1e-12 соответствует нулю, но вы можете наблюдать числовую нестабильность даже для eps=1e-9.
Используя ваш пример, ответ равен трем. Если вы измените вторую строку на [2, 6, 14]
(линейно зависит от первой строки), ответ будет равен двум («нулевое» собственное значение равно 4,9960E-16)
Этот ответ устарел.
Ответ — нет — в настоящее время в scipy нет функции, предназначенной для вычисления матричного ранга массива/матрицы. Добавление одного обсуждалось ранее, но если это произойдет, я не верю, что это еще не произошло.
2
Я не знаю конкретно о Numpy, но вряд ли это встроенная операция над матрицей; он включает в себя довольно интенсивные численные вычисления (и связанные с этим опасения по поводу ошибки округления с плавающей запятой и т. д.) и выбор пороговых значений, которые могут подходить или не подходить в данном контексте, и выбор алгоритма важен для точного и быстрого его вычисления.
Вещи, встроенные в базовые классы, как правило, могут быть выполнены уникальным и простым способом, например, умножение матриц в самых сложных случаях.