numpy.linalg.matrix_rank
-
numpy.linalg.matrix_rank(M, tol=None, hermitian=False)[source] -
Возвращает ранг матрицы массива, используя метод SVD
Ранг массива — это количество сингулярных значений массива, которые больше
tol.Изменено в версии 1.14: Теперь может работать со стеками матриц
Параметры: -
M : {(M,), (…, M, N)} array_like -
Входной вектор или стек матриц
-
tol : (…) array_like, float, optional -
Порог, ниже которого значения SVD считаются нулевыми. Если
tolравно None, иS— массив с сингулярными значениями дляM, иeps— значение epsilon для типа данныхS, тоtolустанавливается вS.max() * max(M.shape) * eps.Изменено в версии 1.14: Распространяется на стек матриц
-
hermitian : bool, optional -
Если True, предполагается, что
Mявляется эрмитовой (симметричной, если вещественной), что позволяет использовать более эффективный метод для нахождения сингулярных значений. По умолчанию False.Добавлена в версии 1.14.
Примечания
Пороговое значение по умолчанию для обнаружения недостаточности ранга — проверка величины сингулярных значений
M. По умолчанию мы определяем сингулярные значения, меньшиеS.max() * max(M.shape) * eps, как свидетельствующие о недостаточности ранга (с использованием определенных выше символов). Это алгоритм, используемый MATLAB [1]. Он также приведён в Numerical recipes в обсуждении решений SVD для линейных наименьших квадратов [2].Это значение порога по умолчанию разработано для обнаружения недостаточности ранга с учётом числовых ошибок вычисления SVD. Представьте, что в
Mесть столбец, являющийся точной (в формате с плавающей точкой) линейной комбинацией других столбцов вM. Вычисление SVD поMв общем случае не даст сингулярного значения, точно равного 0: любая разница наименьшего значения SVD от 0 будет вызвана числовой неточностью при вычислении SVD. Наш порог для малых значений SVD учитывает эту числовую неточность, и пороговое значение по умолчанию обнаружит такую числовую недостаточность ранга. Пороговое значение может объявить матрицуMнедостаточной по рангу даже если линейная комбинация некоторых столбцовMне точно равна другому столбцуM, а лишь численно очень близка к другому столбцуM.Мы выбрали наше значение порога по умолчанию, так как оно широко используется. Возможны и другие пороги. Например, в другом месте в 2007-м издании Numerical recipes есть альтернативный порог
S.max() * np.finfo(M.dtype).eps / 2. * np.sqrt(m + n + 1.). Авторы описывают этот порог как основанный на «ожидаемой ошибке округления» (с. 71).Вышеуказанные пороги учитывают погрешность округления с плавающей запятой при вычислении SVD. Однако у вас может быть больше информации о источниках ошибок в
M, что заставит вас рассмотреть другие значения допуска для обнаружения эффективной недостаточности ранга. Наиболее полезная мера допуска зависит от операций, которые вы планируете использовать с вашей матрицей. Например, если ваши данные получены из неопределённых измерений с неопределённостями, превышающими погрешность с плавающей точкой, может быть предпочтительнее выбрать допуск, близкий к этой неопределённости. Допуск может быть абсолютным, если неопределённости являются абсолютными, а не относительными.Ссылки
[1] Документация MATLAB, «Ранг» http://www.mathworks.com/help/techdoc/ref/rank.html [2] W. H. Press, S. A. Teukolsky, W. T. Vetterling и B. P. Flannery, «Numerical Recipes (3-е издание)», Cambridge University Press, 2007, страница 795. Примеры
>>> from numpy.linalg import matrix_rank >>> matrix_rank(np.eye(4)) # Full rank matrix 4 >>> I=np.eye(4); I[-1,-1] = 0. # rank deficient matrix >>> matrix_rank(I) 3 >>> matrix_rank(np.ones((4,))) # 1 dimension - rank 1 unless all 0 1 >>> matrix_rank(np.zeros((4,))) 0
-
© 2005–2019 NumPy Developers
Licensed under the 3-clause BSD License.
https://docs.scipy.org/doc/numpy-1.15.4/reference/generated/numpy.linalg.matrix_rank.html