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.
Возвращает: -
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, что позволит вам рассмотреть другие значения толерантности для определения эффективной недостаточности ранга. Наиболее полезная мера толерантности зависит от операций, которые вы планируете использовать над вашей матрицей. Например, если ваши данные получены из неопределённых измерений с неопределённостями, превышающими значение epsilon в формате с плавающей точкой, выбор толерантности, близкой к этой неопределённости, может быть предпочтительнее. Толерантность может быть абсолютной, если неопределённости являются абсолютными, а не относительными.Ссылки
[1] Документация MATLAB, «Ранг» https://www.mathworks.com/help/techdoc/ref/rank.html [2] 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.17.0/reference/generated/numpy.linalg.matrix_rank.html