Algo Comparison for Least Squares
Prepare A and b matrix for testing various Algos
> m <- 100 > n <- 15 > t <- seq(0, (m - 1))/(m - 1) > A <- matrix(data = 0, nrow = m, ncol = n) > for (j in 1:n) { + A[, j] <- t^(j - 1) + } > b <- exp(sin(4 * t)) > b <- b/2006.78745308021 |
Use HouseHolder Triangularization
> HHT <- function(A) { + A.bkup <- A + m <- dim(A)[1] + n <- dim(A)[2] + norm2 <- function(x) { + sqrt(sum(x^2)) + } + Q <- matrix(data = 0, nrow = (n * m), ncol = m) + k <- 1 + for (k in 1:n) { + Qt <- diag(m) + x <- A[k:m, k] + e1 <- c(1, rep(0, (length(x) - 1))) + Vk <- sign(x[1]) * norm2(x) * e1 + x + Vk <- Vk/norm2(Vk) + Qt[k:m, k:m] <- diag(length(x)) - 2 * Vk %*% t(Vk) + A[k:m, k:n] <- A[k:m, k:n] - 2 * Vk %*% t(Vk) %*% A[k:m, + k:n] + start.ind <- k * m - m + 1 + end.ind <- k * m + Q[start.ind:end.ind, ] <- Qt + } + Q.f <- diag(m) + for (i in 1:n) { + start.ind <- i * m - m + 1 + end.ind <- i * m + Q.f <- Q.f %*% Q[start.ind:end.ind, ] + } + result <- list(A = A.bkup, A.t = A, Q = Q.f) + } > HHResult <- HHT(A) > b.new <- t(HHResult$Q) %*% b > R <- HHResult$A.t > x <- backsolve(R, b.new) > print(x[15], digits = 15) [1] 1.00000012504902 > print(paste("relative error - hht", x[15] - 1)) [1] "relative error - hht 1.25049022692281e-07" |
GramSchmidt
> gs.mod <- function(A) { + m <- dim(A)[1] + n <- dim(A)[2] + Q <- matrix(data = 0, nrow = m, ncol = n) + R <- matrix(data = 0, nrow = m, ncol = n) + V <- A + j <- 1 + for (i in 1:n) { + rii <- sqrt(sum(V[, i]^2)) + R[i, i] <- rii + Q[, i] <- V[, i]/rii + if (i < n) { + for (j in (i + 1):n) { + rij <- t(Q[, i]) %*% V[, j] + V[, j] <- V[, j] - rij * Q[, i] + R[i, j] <- rij + } + } + } + result <- list(Q = Q, R = R) + return(result) + } > Q <- gs.mod(A)$Q > R <- gs.mod(A)$R > b.new <- t(Q) %*% b > x <- backsolve(R, b.new) > print(x[15], digits = 15) [1] 0.969854877113548 > print(paste("relative error - hht", x[15] - 1)) [1] "relative error - hht -0.0301451228864515" |
Normal Equations via cholesky
Tried everything that I had known earlier but it was useless as it was a rank deficient matrix
Using SVD
> U <- svd(A)$u > V <- svd(A)$v > d <- diag(svd(A)$d) > b.new <- t(U) %*% b > w <- backsolve(d, b.new) > x <- V %*% w > print(x[15], digits = 15) [1] 1.00000013199462 > print(paste("relative error - hht", x[15] - 1)) [1] "relative error - hht 1.31994622343257e-07" |
Somehow empirically I am finding that HHT is better than SVD.
But the book says the opposite!!!