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