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: Расширяется по отношению к стеку матриц
-
hermitianbool, optional -
Если True,
Mпредполагается эрмитовой (симметричной, если вещественной), что позволяет использовать более эффективный метод для нахождения сингулярных значений. По умолчанию False.Новое в версии 1.14.
-
- Возвращает
-
-
rank(…) array_like -
Ранг M.
-
Примечания
Пороговое значение по умолчанию для обнаружения дефекта ранга — это тест на величину сингулярных значений
M. По умолчанию мы идентифицируем сингулярные значения меньше, чемS.max() * max(M.shape) * eps, как указывающие на дефект ранга (при указанных выше обозначениях). Это алгоритм, используемый MATLAB [1]. Он также появляется в «Числовых рецептах» в обсуждении решений SVD для линейных наименьших квадратов [2].Это пороговое значение по умолчанию предназначено для обнаружения дефекта ранга, учитывая численные ошибки вычисления SVD. Представьте, что столбец в
Mявляется точной (в плавающей точке) линейной комбинацией других столбцов вM. Вычисление SVD дляMв общем случае не даст сингулярного значения, точно равного 0: любое различие наименьшего значения SVD от 0 будет вызвано числовой неточностью при вычислении SVD. Наш порог для малых значений SVD учитывает эту числовую неточность, и пороговое значение по умолчанию обнаружит такой численный дефект ранга. Порог может объявить матрицуMдефектной по рангу даже если линейная комбинация некоторых столбцовMне точно равна другому столбцуM, а только численно очень близка к другому столбцуM.Мы выбрали наше пороговое значение по умолчанию, потому что оно широко используется. Другие пороги возможны. Например, в другом месте в 2007-м издании «Числовых рецептов» есть альтернативное пороговое значение
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 -
У. Х. Пресс, С. А. Теуколъский, У. Т. Веттерлинг и Б. П. Фланнери, «Численные рецепты (3-е издание)», Издательство Кембриджского университета, 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–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.18/reference/generated/numpy.linalg.matrix_rank.html