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.
Примечания
Пороговое значение по умолчанию для обнаружения недостатка ранга — это проверка величины сингулярных значений
M. По умолчанию мы определяем сингулярные значения, меньшие, чемS.max() * max(M.shape) * eps, как указывающие на недостаток ранга (при определении вышеперечисленных символов). Это алгоритм, используемый MATLAB [1]. Он также появляется в обсуждении решений SVD для линейных наименьших квадратов в Numerical recipes [2].Это значение порога по умолчанию разработано для обнаружения недостатка ранга с учетом численных ошибок вычисления SVD. Представьте, что в
Mесть столбец, являющийся точной (в формате с плавающей запятой) линейной комбинацией других столбцов вM. Вычисление SVD поMв общем случае не даст сингулярного значения, равного точно 0: любая разница наименьшего значения SVD от 0 будет вызвана численной неточностью при вычислении SVD. Наш порог для малых значений SVD учитывает эту численную неточность, и пороговое значение по умолчанию обнаружит такой численный недостаток ранга. Пороговое значение может объявить матрицуMс недостатком ранга, даже если линейная комбинация некоторых столбцовMне точно равна другому столбцуM, а только численно очень близка к другому столбцуM.Мы выбрали наше значение порога по умолчанию, так как оно широко используется. Другие пороги тоже возможны. Например, в другом месте в издании 2007 года Numerical recipes есть альтернативный порог
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, «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
-
© 2005–2019 NumPy Developers
Licensed under the 3-clause BSD License.
https://docs.scipy.org/doc/numpy-1.16.1/reference/generated/numpy.linalg.matrix_rank.html