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.])