numpy.linalg.matrix_rank
-
numpy.linalg.matrix_rank(M, tol=None)[source] -
Возвращает ранг матрицы массива, используя метод SVD
Ранг массива — это количество сингулярных значений SVD массива, которые больше
tol.Параметры: M : {(M,), (..., M, N)} array_like
входной вектор или набор матриц
tol : {None, float}, необязательно
порог, ниже которого значения SVD считаются нулевыми. Если
tolравно None, иS— массив с сингулярными значениями дляM, иeps— значение epsilon для типа данныхS, тоtolустанавливается вS.max() * max(M.shape) * eps.Примечания
Пороговое значение по умолчанию для обнаружения недостаточности ранга — это проверка величины сингулярных значений
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, что заставило бы вас рассмотреть другие значения толерантности для обнаружения эффективного недостатка ранга. Наиболее полезная мера толерантности зависит от операций, которые вы планируете использовать для вашей матрицы. Например, если ваши данные получены из неопределённых измерений с погрешностями, превышающими погрешность с плавающей точкой, предпочтительно выбрать толерантность, близкую к этой неопределённости. Толерантность может быть абсолютной, если погрешности абсолютные, а не относительные.Ссылки
[R42] Документация MATLAB, «Ранг» http://www.mathworks.com/help/techdoc/ref/rank.html [R43] W. H. Press, S. A. Teukolsky, W. T. Vetterling и B. P. Flannery, «Численные рецепты (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
© 2008–2017 NumPy Developers
Licensed under the NumPy License.
https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.linalg.matrix_rank.html