Spec-Zone.ru › NumPy 1.15

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]. Он также приведён в Numerical recipes в обсуждении решений SVD для линейных наименьших квадратов [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, что заставит вас рассмотреть другие значения допуска для обнаружения эффективной недостаточности ранга. Наиболее полезная мера допуска зависит от операций, которые вы планируете использовать с вашей матрицей. Например, если ваши данные получены из неопределённых измерений с неопределённостями, превышающими погрешность с плавающей точкой, может быть предпочтительнее выбрать допуск, близкий к этой неопределённости. Допуск может быть абсолютным, если неопределённости являются абсолютными, а не относительными.

Ссылки

[1] Документация MATLAB, «Ранг» http://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.15.4/reference/generated/numpy.linalg.matrix_rank.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API