Подтвердить что ты не робот

Calculate Matrix Rank с использованием scipy

Я хотел бы вычислить математический ранг

4b9b3361

Ответ 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 делает то, что вы просите. Почему это недостаточно?