numpy.linalg.matrix_rank
-
numpy.linalg.matrix_rank(M, tol=None)[source] -
Возвращает ранг матрицы массива, используя метод SVD
Ранг массива — это количество сингулярных значений SVD массива, которые больше
tol.Параметры: M : {(M,), (M, N)} array_like
массив размерности <=2
tol : {None, float}, optional
порог, ниже которого значения SVD считаются нулевыми. Если
tolравно None, иS— массив с сингулярными значениями дляM, аeps— значение эпсилон для типа данныхS, тоtolустанавливается вS.max() * max(M.shape) * eps.Примечания
По умолчанию порог для обнаружения недостаточности ранга — это проверка величины сингулярных значений
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.Мы выбрали наш порог по умолчанию, потому что он широко используется. Возможны и другие пороги. Например, в другом месте в издании Numerical recipes 2007 года существует альтернативный порог
S.max() * np.finfo(M.dtype).eps / 2. * np.sqrt(m + n + 1.). Авторы описывают этот порог как базирующийся на «ожидаемой погрешности округления» (стр. 71).Вышеупомянутые пороги связаны с погрешностью округления с плавающей запятой при вычислении SVD. Однако у вас может быть больше информации о источниках ошибок в
M, что позволит вам рассмотреть другие значения толерантности для обнаружения эффективной недостаточности ранга. Наиболее полезная мера толерантности зависит от операций, которые вы намерены использовать с вашей матрицей. Например, если ваши данные получены из неопределенных измерений с погрешностями, превышающими эпсилон с плавающей запятой, предпочтительнее выбрать толерантность, близкую к этой неопределенности. Толерантность может быть абсолютной, если погрешности абсолютные, а не относительные.Ссылки
[R39] Документация MATLAB, «Ранг» http://www.mathworks.com/help/techdoc/ref/rank.html [R40] 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
© 2008–2017 NumPy Developers
Licensed under the NumPy License.
https://docs.scipy.org/doc/numpy-1.12.0/reference/generated/numpy.linalg.matrix_rank.html