Этот вопрос относится к этому и этому одному
У меня есть две матрицы полного ранга A 1 , A 2 каждая с размером pxp и p-вектором y.
Эти матрицы тесно связаны в том смысле, что матрица A 2 является обновлением матрицы первого ранга A 1 .
Меня интересует вектор
β 2 |(β 1 , у, A 1 , A 2 , A 1 -1 })
где
β 2 = ( A 2 ' A 2 ) -1 ( A 2 ' y)
и
β 1 = ( A 1 ' A 1 ) -1 ( A 1 'y)
Теперь, в предыдущем вопрос здесь мне посоветовали оценить β 2 с помощью подхода Choleski, поскольку разложение Choleski легко обновить, используя функции 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 .