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— значение эпсилон для типа данных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]. Он также появляется в «Численных рецептах» в обсуждении решений SVD для линейных наименьших квадратов [2].Это пороговое значение по умолчанию разработано для обнаружения недостаточности ранга с учетом числовых ошибок вычисления SVD. Представьте, что в
Mесть столбец, который является точным (в формате с плавающей запятой) линейным сочетанием других столбцов вM. Вычисление SVD дляMне даст, как правило, сингулярного значения, равного точно нулю: любая разница наименьшего значения 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, которые позволили бы вам рассмотреть другие значения толерантности для обнаружения эффективной недостаточности ранга. Наиболее полезная мера толерантности зависит от операций, которые вы намереваетесь использовать со своей матрицей. Например, если ваши данные получены из неопределённых измерений с неопределённостями, большими, чем эпсилон с плавающей точкой, предпочтительно выбрать порог, близкий к этой неопределённости. Порог может быть абсолютным, если неопределённости абсолютные, а не относительные.Ссылки
[R44] Документация MATLAB, «Ранг» http://www.mathworks.com/help/techdoc/ref/rank.html [R45] W. H. Press, S. A. Teukolsky, W. T. Vetterling и B. P. Flannery, «Численные рецепты (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.14.5/reference/generated/numpy.linalg.matrix_rank.html