The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

Eigenvalues: Spectral Decomposition

Michael Friendly

2022-12-08

library(matlib)   # use the package

Setup

This vignette uses an example of a \(3 \times 3\) matrix to illustrate some properties of eigenvalues and eigenvectors. We could consider this to be the variance-covariance matrix of three variables, but the main thing is that the matrix is square and symmetric, which guarantees that the eigenvalues, \(\lambda_i\) are real numbers, and non-negative, \(\lambda_i \ge 0\).

A <- matrix(c(13, -4, 2, -4, 11, -2, 2, -2, 8), 3, 3, byrow=TRUE)
A
##      [,1] [,2] [,3]
## [1,]   13   -4    2
## [2,]   -4   11   -2
## [3,]    2   -2    8

Get the eigenvalues and eigenvectors using eigen(); this returns a named list, with eigenvalues named values and eigenvectors named vectors. We call these L and V here, but in formulas they correspond to a diagonal matrix, \(\mathbf{\Lambda} = diag(\lambda_1, \lambda_2, \lambda_3)\), and a (orthogonal) matrix \(\mathbf{V}\).

ev <- eigen(A)
# extract components
(L <- ev$values)
## [1] 17  8  7
(V <- ev$vectors)
##         [,1]    [,2]   [,3]
## [1,]  0.7454  0.6667 0.0000
## [2,] -0.5963  0.6667 0.4472
## [3,]  0.2981 -0.3333 0.8944

Matrix factorization

  1. Factorization of A: A = V diag(L) V’. That is, the matrix \(\mathbf{A}\) can be represented as the product \(\mathbf{A}= \mathbf{V} \mathbf{\Lambda} \mathbf{V}'\).
V %*% diag(L) %*% t(V)
##      [,1] [,2] [,3]
## [1,]   13   -4    2
## [2,]   -4   11   -2
## [3,]    2   -2    8
  1. V diagonalizes A: L = V’ A V. That is, the matrix \(\mathbf{V}\) transforms \(\mathbf{A}\) into the diagonal matrix \(\mathbf{\Lambda}\), corresponding to orthogonal (uncorrelated) variables.
diag(L)
##      [,1] [,2] [,3]
## [1,]   17    0    0
## [2,]    0    8    0
## [3,]    0    0    7
zapsmall(t(V) %*% A %*% V)
##      [,1] [,2] [,3]
## [1,]   17    0    0
## [2,]    0    8    0
## [3,]    0    0    7

Spectral decomposition

The basic idea here is that each eigenvalue–eigenvector pair generates a rank 1 matrix, \(\lambda_i \mathbf{v}_i \mathbf{v}_i '\), and these sum to the original matrix, \(\mathbf{A} = \sum_i \lambda_i \mathbf{v}_i \mathbf{v}_i '\).

A1 = L[1] * V[,1] %*% t(V[,1])
A1
##        [,1]   [,2]   [,3]
## [1,]  9.444 -7.556  3.778
## [2,] -7.556  6.044 -3.022
## [3,]  3.778 -3.022  1.511
A2 = L[2] * V[,2] %*% t(V[,2])
A2
##        [,1]   [,2]    [,3]
## [1,]  3.556  3.556 -1.7778
## [2,]  3.556  3.556 -1.7778
## [3,] -1.778 -1.778  0.8889
A3 = L[3] * V[,3] %*% t(V[,3])
A3
##      [,1] [,2] [,3]
## [1,]    0  0.0  0.0
## [2,]    0  1.4  2.8
## [3,]    0  2.8  5.6

Then, summing them gives A, so they do decompose A:

A1 + A2 + A3
##      [,1] [,2] [,3]
## [1,]   13   -4    2
## [2,]   -4   11   -2
## [3,]    2   -2    8
all.equal(A, A1+A2+A3)
## [1] TRUE

Further properties

  1. Sum of squares of A = sum of sum of squares of A1, A2, A3
sum(A^2)
## [1] 402
c( sum(A1^2), sum(A2^2), sum(A3^2) )
## [1] 289  64  49
sum( sum(A1^2), sum(A2^2), sum(A3^2) )
## [1] 402
#' same as tr(A' A)
tr(crossprod(A))
## [1] 402
  1. Each squared eigenvalue gives the sum of squares accounted for by the latent vector
L^2
## [1] 289  64  49
cumsum(L^2)   # cumulative
## [1] 289 353 402
  1. The first \(i\) eigenvalues and vectors give a rank \(i\) approximation to A
R(A1)
## [1] 1
R(A1 + A2)
## [1] 2
R(A1 + A2 + A3)
## [1] 3
# two dimensions
sum((A1+A2)^2)
## [1] 353
sum((A1+A2)^2) / sum(A^2)   # proportion
## [1] 0.8781

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.