Various Ways for Least Square Estimation
Purpose - To work out Exercise 11.3
> library(RColorBrewer) > cols <- brewer.pal(4, "Set1") > A <- matrix(data = 0, nrow = 50, ncol = 12) > x.t <- seq(0, 1, length.out = 50) > for (i in 1:12) { + A[, i] <- x.t^(i - 1) + } > b <- cos(4 * x.t) |
NORMAL EQUATIONS
Error in solve.default(t(A)times A) : system is computationally singular: reciprocal condition number
QR Factorization
> Q <- qr.Q(qr(A)) > b_prime <- t(Q) %*% b > R <- qr.R(qr(A)) > x <- solve(R, b_prime) > x1 <- x > plot(10^8 * (A %*% x1 - cos(4 * x.t))) |
SVD Factorization
> U <- svd(A)$u > d <- diag(svd(A)$d) > V <- svd(A)$v > b_prime <- t(U) %*% b > x <- V %*% solve(d, b_prime) > x2 <- x > plot(10^8 * (A %*% x2 - cos(4 * x.t))) |
Compare the 12 coefficient list
> cbind(x1, x2) [,1] [,2] [1,] 1.000000000996605e+00 1.000000000996604e+00 [2,] -4.227428691202565e-07 -4.227430102352229e-07 [3,] -7.999981235689559e+00 -7.999981235685077e+00 [4,] -3.187631876893836e-04 -3.187632430210450e-04 [5,] 1.066943079560576e+01 1.066943079597327e+01 [6,] -1.382028678074381e-02 -1.382028825931538e-02 [7,] -5.647075630590243e+00 -5.647075626774281e+00 [8,] -7.531601862032665e-02 -7.531602508485076e-02 [9,] 1.693606956958508e+00 1.693606964113136e+00 [10,] 6.032113428498480e-03 6.032108446974022e-03 [11,] -3.742417053440816e-01 -3.742417033639870e-01 [12,] 8.804057640437810e-02 8.804057606180213e-02 |
One can use
- Classic Gram Schmidt
- Improved Gram Schmidt
- SVD
- QR Triangular Decomposition
- QR by Householder Orthogonal decomposition
One must keep in mind operation count, numerical stability accuracy issues to decide on the algo to be used.