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