Calculate Matrix Rank с использованием scipy
Ответ 1
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
Ответ 2
Предоставить примерный фрагмент кода для людей, которым необходимо сделать это на практике. Не стесняйтесь улучшаться.
u, s, v = np.linalg.svd(A)
rank = np.sum(s > 1e-10)
Ответ 3
Если 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)
Ответ 4
Этот ответ устарел.
Ответ - нет - в настоящее время нет функции, посвященной вычислению ранга матрицы массива/матрицы в scipy. Добавление одного из них обсуждалось ранее, но если это произойдет, я не думаю, что он еще не был.
Ответ 5
В частности, я не знаю о Numpy, но вряд ли это будет встроенная операция над матрицей; он включает в себя довольно интенсивные численные вычисления (и связанные с ними проблемы с ошибкой округления с плавающей запятой и т.д.) и пороговые выборки, которые могут быть или не быть подходящими в данном контексте, а выбор алгоритма важен для его точного и быстрого вычисления.
Вещи, которые встроены в базовые классы, как правило, являются вещами, которые могут быть выполнены уникальным и понятным способом, таким как матричные умножения в наиболее сложных.
Ответ 6
Функции линейной алгебры обычно группируются в numpy.linalg
. (Они также доступны из scipy.linalg
, который имеет больше функциональности.) Это позволяет полиморфизм: функции могут принимать любые типы, которые обрабатывает SciPy.
Итак, да, функция numpy.linalg.lstsq
делает то, что вы просите. Почему это недостаточно?