numpy.linalg.matrix_rank#
- linalg.matrix_rank(A, tol=None, эрмитов=False, *, rtol=None)[источник]#
Возвращает ранг матрицы массива с использованием метода SVD
Ранг массива - это количество сингулярных значений массива, которые больше tol.
- Параметры:
- A{(M,), (..., M, N)} array_like
Входной вектор или стек матриц.
- tol(…) array_like, float, необязательный
Порог, ниже которого значения SVD считаются нулевыми. Если tol является None, и
Sявляется массивом с сингулярными значениями для M, иeps— это значение эпсилон для типа данныхS, затем tol установлено вS.max() * max(M, N) * eps.- эрмитовbool, необязательно
Если True, A предполагается эрмитовой (симметричной, если вещественнозначная), что позволяет использовать более эффективный метод поиска сингулярных значений. По умолчанию False.
- rtol(…) array_like, float, необязательный
Параметр для компонента относительной погрешности. Только
tolилиrtolможно установить одновременно. По умолчаниюmax(M, N) * eps.Новое в версии 2.0.0.
- Возвращает:
- rank(…) array_like
Ранг A.
Примечания
Порог по умолчанию для обнаружения недостатка ранга — это проверка величины сингулярных значений A. По умолчанию мы идентифицируем сингулярные значения меньше
S.max() * max(M, N) * epsкак указание на недостаточность ранга (с использованием символов, определённых выше). Это алгоритм, используемый MATLAB [1]. Он также появляется в Численные рецепты в обсуждении решений SVD для линейных наименьших квадратов [2].Этот порог по умолчанию предназначен для обнаружения недостатка ранга с учётом численных ошибок вычисления SVD. Представьте, что есть столбец в A которая является точной (в плавающей точке) линейной комбинацией других столбцов в A. Вычисление SVD на A не будет производить сингулярное значение, точно равное 0, в общем случае: любое отклонение наименьшего значения SVD от 0 будет вызвано численной неточностью при вычислении SVD. Наш порог для малых значений SVD учитывает эту численную неточность, и порог по умолчанию будет обнаруживать такую численную недостаточность ранга. Порог может объявить матрицу A ранг дефицитен, даже если линейная комбинация некоторых столбцов A не точно равен другому столбцу A но только численно очень близко к другому столбцу A.
Мы выбрали наш порог по умолчанию, потому что он широко используется. Другие пороги возможны. Например, в другом месте в издании 2007 года Numerical recipes существует альтернативный порог
S.max() * np.finfo(A.dtype).eps / 2. * np.sqrt(m + n + 1.). Авторы описывают этот порог как основанный на «ожидаемой ошибке округления» (стр. 71).Пороги выше касаются ошибок округления с плавающей точкой в вычислении SVD. Однако у вас может быть больше информации об источниках ошибок в A что заставило бы вас рассмотреть другие значения допуска для обнаружения эффективный ранговая недостаточность. Наиболее полезная мера допуска зависит от операций, которые вы планируете использовать с вашей матрицей. Например, если ваши данные получены из неточных измерений с погрешностями больше эпсилона с плавающей точкой, выбор допуска близкого к этой погрешности может быть предпочтительнее. Допуск может быть абсолютным, если погрешности абсолютные, а не относительные.
Ссылки
[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 (3rd edition)», Cambridge University Press, 2007, страница 795.
Примеры
>>> import numpy as np >>> 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