Spec-Zone.ru › NumPy 1.11

numpy.linalg.matrix_rank

numpy.linalg.matrix_rank(M, tol=None) [source]

Возвращает ранг матрицы массива, используя метод SVD

Ранг массива — это количество сингулярных значений SVD массива, которые больше, чем tol.

Параметры:

M : {(M,), (M, N)} array_like

массив с количеством измерений <=2

tol : {None, float}, optional

порог, ниже которого значения SVD считаются нулевыми. Если tol равно None, и S — массив с сингулярными значениями для M, и eps — значение epsilon для типа данных S, то tol устанавливается в S.max() * max(M.shape) * eps.

Примечания

Пороговое значение по умолчанию для обнаружения недостаточности ранга — это тест на величину сингулярных значений 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.

Мы выбрали наше пороговое значение по умолчанию, потому что оно широко используется. Другие пороговые значения возможны. Например, в другом месте в издании Numerical recipes 2007 года есть альтернативное пороговое значение S.max() * np.finfo(M.dtype).eps / 2. * np.sqrt(m + n + 1.). Авторы описывают это пороговое значение как основанное на «ожидаемой ошибке округления» (с. 71).

Перечисленные выше пороги имеют дело с ошибкой округления с плавающей запятой при вычислении SVD. Однако у вас может быть больше информации о источниках ошибок в M, что приведет вас к рассмотрению других значений толерантности для обнаружения эффективной недостаточности ранга. Наиболее полезная мера толерантности зависит от операций, которые вы собираетесь использовать со своей матрицей. Например, если ваши данные получены из неопределенных измерений с неопределенностями, превышающими epsilon с плавающей запятой, выбор толерантности, близкой к этой неопределенности, может быть предпочтительнее. Толерантность может быть абсолютной, если неопределенности являются абсолютными, а не относительными.

Ссылки

[R39] Документация MATLAB, «Ранг» http://www.mathworks.com/help/techdoc/ref/rank.html
[R40] 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

© 2008–2016 NumPy Developers
Licensed under the NumPy License.
https://docs.scipy.org/doc/numpy-1.11.0/reference/generated/numpy.linalg.matrix_rank.html

Spec-Zone.ru

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