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— значение epsilon для типа данных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, что приведет вас к рассмотрению других значений толерантности для обнаружения эффективной недостаточности ранга. Наиболее полезная мера толерантности зависит от операций, которые вы собираетесь использовать со своей матрицей. Например, если ваши данные получены из неопределенных измерений с неопределенностями, превышающими epsilon с плавающей запятой, выбор толерантности, близкой к этой неопределенности, может быть предпочтительнее. Толерантность может быть абсолютной, если неопределенности являются абсолютными, а не относительными.Ссылки
[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–2016 NumPy Developers
Licensed under the NumPy License.
https://docs.scipy.org/doc/numpy-1.11.0/reference/generated/numpy.linalg.matrix_rank.html