Spec-Zone.ru › NumPy 1.16

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

Spec-Zone.ru

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