Этот вопрос связан с этим и этот один
У меня есть две матрицы полного ранга A1, A2, каждая из которых имеет размерность p x p и p-вектор y.
Эти матрицы тесно связаны в том смысле, что матрица A2 является обновлением первого ранга матрицы A1.
Меня интересует вектор
β2 | (β1, д, A1, A2, А1-1})
куда
β2 = (A2' A2)-1 (A2'y)
и
β1 = (A1' A1)-1 (A1' г)
Теперь, в предыдущем вопросе здесь мне посоветовали оценить β2 с помощью подхода Холецкого, поскольку разложение Холецкого легко обновить с помощью функций R, таких как chud()
в пакете SamplerCompare.
Ниже приведены две функции для решения линейных систем в R, первая использует функцию solve()
, а вторая использует подход Холески (вторую я могу эффективно обновить).
fx01 <- function(ll,A,y) chol2inv(chol(crossprod(A))) %*% crossprod(A,y)
fx03 <- function(ll,A,y) solve(A,y)
p <- 5
A <- matrix(rnorm(p^2),p,p)
y <- rnorm(p)
system.time(lapply(1:1000,fx01,A=A,y=y))
system.time(lapply(1:1000,fx03,A=A,y=y))
Мой вопрос: для p small обе функции кажутся сопоставимыми (на самом деле fx01
даже быстрее). Но по мере увеличения p fx01
становится все медленнее, так что при p = 100 fx03
в три раза быстрее, чем fx01
.
Что вызывает ухудшение производительности fx01
и можно ли это улучшить/решить (может быть, моя реализация Choleski слишком наивна? Не следует ли мне использовать функции созвездия Choleski, такие как backsolve
, и если да, то как?
A %*% B
- это жаргон R для матричного умножения A на B.crossprod(A,B)
— это жаргон R для A' B (т. е. транспонировать матрицу A, умножив матрицу/вектор B).solve(A,b)
решает для x линейную систему A x=b.chol(A)
— это разложение Холецкого PSD-матрицы A.chol2inv
вычисляет (X' X)-1 из (R части) QR-разложения X.