Spec-Zone.ru › NumPy 1.18

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: Расширяется по отношению к стеку матриц

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

Ссылки

1

Документация MATLAB, «Ранг» https://www.mathworks.com/help/techdoc/ref/rank.html

2

У. Х. Пресс, С. А. Теуколъский, У. Т. Веттерлинг и Б. П. Фланнери, «Численные рецепты (3-е издание)», Издательство Кембриджского университета, 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–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.18/reference/generated/numpy.linalg.matrix_rank.html

Spec-Zone.ru

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