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

Я хотел бы вычислить математический ранг матрицы, используя scipy. Наиболее очевидная функция numpy.rank вычисляет размерность массива (т. 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 .

  • Повышение точности numpy.dot (python)
  • scipy signal find_peaks_cwt не находит пики точно?
  • Используйте Часовню для обработки массивной матрицы
  • косовое нормальное распределение в scipy
  • python (scipy): изменение размера разреженной матрицы
  • Как ограничить ширину окна корреляции в Numpy?
  • Как я могу эффективно обрабатывать массив numpy в блоках, подобных функции blkproc (blockproc) Matlab
  • Интерполяция 3d-массива в Python. Как избежать циклов?
  • 6 Solutions collect form web for “Calculate Matrix Rank с использованием scipy”

    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 

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

     u, s, v = np.linalg.svd(A) rank = np.sum(s > 1e-10) 

    Если 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)

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

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

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

    Вещи, которые встроены в базовые классы, как правило, являются вещами, которые могут выполняться уникальным и простым способом, таким как матричные умножения в наиболее сложных.

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

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

    Python - лучший язык программирования в мире.