numpy.linalg.qr#

linalg.qr(a, mode='reduced')[источник]#

Вычислите QR-разложение матрицы.

Факторизует матрицу a как qr, где q является ортонормированным и r является верхнетреугольной.

Параметры:
aarray_like, форма (…, M, N)

Объект, подобный массиву, с размерностью не менее 2.

mode{‘reduced’, ‘complete’, ‘r’, ‘raw’}, опционально, по умолчанию: ‘reduced’

Если K = min(M, N), то

  • ‘reduced’ : возвращает Q, R с размерами (…, M, K), (…, K, N)

  • ‘complete’ : возвращает Q, R с размерами (…, M, M), (…, M, N)

  • ‘r’ : возвращает только R с размерностями (…, K, N)

  • 'raw' : возвращает h, tau с размерами (..., N, M), (..., K,)

Опции 'reduced', 'complete' и 'raw' являются новыми в numpy 1.8, см. примечания для дополнительной информации. По умолчанию используется 'reduced', и для поддержания обратной совместимости с более ранними версиями numpy как она, так и старый вариант по умолчанию 'full' могут быть опущены. Обратите внимание, что массив h, возвращаемый в режиме 'raw', транспонирован для вызова Fortran. Режим 'economic' устарел. Режимы 'full' и 'economic' могут передаваться с использованием только первой буквы для обратной совместимости, но все остальные должны быть написаны полностью. См. примечания для дополнительных объяснений.

Возвращает:
Qndarray из float или complex, опционально

Матрица с ортонормированными столбцами. Когда mode = 'complete', результат является ортогональной/унитарной матрицей в зависимости от того, является ли a вещественной/комплексной. Определитель в этом случае может быть +/- 1. Если количество измерений во входном массиве больше 2, возвращается стек матриц с указанными выше свойствами.

Rndarray из float или complex, опционально

Верхнетреугольная матрица или набор верхнетреугольных матриц, если количество измерений во входном массиве больше 2.

(h, tau)ndarrays типа np.double или np.cdouble, опционально

Массив h содержит отражения Хаусхолдера, которые генерируют q вместе с r. Массив tau содержит масштабные коэффициенты для отражателей. В устаревшем режиме 'economic' возвращается только h.

Вызывает:
LinAlgError

Если факторизация не удалась.

Смотрите также

scipy.linalg.qr

Похожая функция в SciPy.

scipy.linalg.rq

Вычислите RQ-разложение матрицы.

Примечания

Когда режим 'reduced' или 'complete', результатом будет namedtuple с атрибутами Q и R.

Это интерфейс к процедурам LAPACK dgeqrf, zgeqrf, dorgqr, и zungqr.

Для получения дополнительной информации о QR-разложении см., например: https://en.wikipedia.org/wiki/QR_factorization

Подклассы ndarray сохраняются, за исключением режима 'raw'. Так что если a имеет тип matrix, все возвращаемые значения также будут матрицами.

Новые опции 'reduced', 'complete' и 'raw' для mode были добавлены в NumPy 1.8.0, а старая опция 'full' стала псевдонимом 'reduced'. Кроме того, опции 'full' и 'economic' были объявлены устаревшими. Поскольку 'full' был предыдущим значением по умолчанию, а 'reduced' — новым значением по умолчанию, обратная совместимость может быть сохранена, если позволить mode по умолчанию. Опция 'raw' была добавлена, чтобы можно было использовать подпрограммы LAPACK, которые могут умножать массивы на q с использованием отражений Хаусхолдера. Обратите внимание, что в этом случае возвращаемые массивы имеют тип np.double или np.cdouble, и массив h транспонирован для совместимости с FORTRAN. В настоящее время в numpy не представлены подпрограммы, использующие возврат 'raw', но некоторые доступны в lapack_lite и ждут необходимой работы.

Примеры

>>> import numpy as np
>>> rng = np.random.default_rng()
>>> a = rng.normal(size=(9, 6))
>>> Q, R = np.linalg.qr(a)
>>> np.allclose(a, np.dot(Q, R))  # a does equal QR
True
>>> R2 = np.linalg.qr(a, mode='r')
>>> np.allclose(R, R2)  # mode='r' returns the same R as mode='full'
True
>>> a = np.random.normal(size=(3, 2, 2)) # Stack of 2 x 2 matrices as input
>>> Q, R = np.linalg.qr(a)
>>> Q.shape
(3, 2, 2)
>>> R.shape
(3, 2, 2)
>>> np.allclose(a, np.matmul(Q, R))
True

Пример, иллюстрирующий общее использование qr: решение задач наименьших квадратов

Каковы наилучшие в смысле наименьших квадратов m и y0 в y = y0 + mx для следующих данных: {(0,1), (1,0), (1,2), (2,1)}. (Постройте график точек, и вы увидите, что должно быть y0 = 0, m = 1.) Ответ предоставляется решением переопределённого матричного уравнения Ax = b, где:

A = array([[0, 1], [1, 1], [1, 1], [2, 1]])
x = array([[y0], [m]])
b = array([[1], [0], [2], [1]])

Если A = QR, где Q ортонормирована (что всегда возможно через Грама-Шмидта), то x = inv(R) * (Q.T) * b. (В практике numpy, однако, мы просто используем lstsq.)

>>> A = np.array([[0, 1], [1, 1], [1, 1], [2, 1]])
>>> A
array([[0, 1],
       [1, 1],
       [1, 1],
       [2, 1]])
>>> b = np.array([1, 2, 2, 3])
>>> Q, R = np.linalg.qr(A)
>>> p = np.dot(Q.T, b)
>>> np.dot(np.linalg.inv(R), p)
array([  1.,   1.])