Spec-Zone.ru › NumPy 1.17

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.

Возвращает:
rank : (…) array_like

Ранг M.

Примечания

Пороговое значение по умолчанию для определения недостаточности ранга — это проверка величины сингулярных значений M. По умолчанию мы определяем сингулярные значения, меньшие, чем S.max() * max(M.shape) * eps, как указывающие на недостаточность ранга (при определённых выше символах). Это алгоритм, используемый MATLAB [1]. Он также присутствует в «Численных рецептах» в обсуждении решений SVD для линейных наименьших квадратов [2].

Этот порог по умолчанию разработан для обнаружения недостаточности ранга, учитывая числовые ошибки вычисления SVD. Представьте, что в M есть столбец, который является точной (в формате с плавающей точкой) линейной комбинацией других столбцов в M. Вычисление SVD для M в целом не даст сингулярного значения, точно равного 0: любая разница наименьшего значения SVD от 0 будет вызвана числовой неточностью в расчете SVD. Наш порог для малых значений SVD учитывает эту числовую неточность, и порог по умолчанию обнаружит такую числовую недостаточность ранга. Порог может объявить матрицу M недостаточной по рангу, даже если линейная комбинация некоторых столбцов M не точно равна другому столбцу M, а только численно очень близка к другому столбцу M.

Мы выбрали порог по умолчанию, потому что он широко используется. Другие пороги тоже возможны. Например, в другом месте в издании «Численные рецепты» 2007 года есть альтернативный порог 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, «Численные рецепты (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.17.0/reference/generated/numpy.linalg.matrix_rank.html

Spec-Zone.ru

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