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