numpy.linalg.matrix_rank
- linalg.matrix_rank(M, tol=None, hermitian=False)[source]
-
Возвращает ранг матрицы массива с использованием метода SVD
Ранг массива — это количество сингулярных значений массива, больших, чем
tol.Изменено в версии 1.14: Теперь может работать со стеками матриц
- Параметры
-
- M{(M,), (…, M, N)} array_like
-
Вектор входных данных или стек матриц.
- tol(…) array_like, float, необязательно
-
Пороговое значение, ниже которого значения SVD считаются нулевыми. Если
tolравно None, иSявляется массивом с сингулярными значениями дляM, иeps— значение epsilon для типа данныхS, тоtolустанавливается вS.max() * max(M.shape) * eps.Изменено в версии 1.14: Распространяется на стек матриц
- hermitianbool, необязательно
-
Если True, то предполагается, что
Mявляется эрмитовой (симметричной, если вещественной), что позволяет использовать более эффективный метод для нахождения сингулярных значений. По умолчанию False.Введено в версии 1.14.
- Возвращает
-
- rank(…) array_like
-
Ранг матрицы M.
Примечания
Пороговое значение по умолчанию для обнаружения недостаточности ранга — это проверка величины сингулярных значений
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.Мы выбрали наше пороговое значение по умолчанию, потому что оно широко используется. Другие пороги возможны. Например, в другом месте в издании «Numerical recipes» 2007 года есть альтернативное пороговое значение
S.max() * np.finfo(M.dtype).eps / 2. * np.sqrt(m + n + 1.). Авторы описывают этот порог как основанный на «ожидаемой ошибке округления» (с. 71).Указанные выше пороги связаны с ошибками округления с плавающей точкой при вычислении SVD. Однако у вас может быть больше информации об источниках ошибок в
M, что позволит вам рассмотреть другие значения порога для обнаружения эффективной недостаточности ранга. Наиболее полезная мера порога зависит от операций, которые вы планируете выполнять над вашей матрицей. Например, если ваши данные получены из неопределённых измерений с неопределённостями, превышающими epsilon с плавающей точкой, выбор порога, близкого к этой неопределённости, может быть предпочтительнее. Порог может быть абсолютным, если неопределённости являются абсолютными, а не относительными.Ссылки
- 1
-
Документация MATLAB, «Rank» https://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–2022 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.21/reference/generated/numpy.linalg.matrix_rank.html