0Pricing
R Academy · 课时

特征值与特征向量

使用 eigen() 计算特征分解并解读结果

特征值与特征向量 是 CoddyKit 上的免费 R Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 R Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 R Academy 课程共包含 4 节课。

什么是特征值?

矩阵 A 的特征向量 v 是一个非零向量,与 A 相乘时只发生缩放而不发生旋转:Av = λv。标量 λ 就是特征值。特征值和特征向量揭示了矩阵固有的伸缩方向。

# Intuition: A simple scaling matrix
A <- matrix(c(3, 0,
              0, 2), nrow = 2, byrow = TRUE)

# The eigenvectors are the standard basis vectors
# A * c(1,0) = 3 * c(1,0)  -> eigenvalue 3
# A * c(0,1) = 2 * c(0,1)  -> eigenvalue 2

v1 <- c(1, 0)
A %*% v1  # c(3, 0) = 3 * v1

v2 <- c(0, 1)
A %*% v2  # c(0, 2) = 2 * v2

cat('Eigenvalues of a diagonal matrix are its diagonal entries')

eigen():计算特征值

eigen(A) 返回一个列表,其中 $values 是按绝对值降序排列的特征值,$vectors 是以列向量形式存储特征向量的矩阵。特征向量已归一化为单位长度。

A <- matrix(c(4, 1,
              2, 3), nrow = 2, byrow = TRUE)

# Compute eigendecomposition
eig <- eigen(A)

# Eigenvalues
eig$values
# [1] 5 2  (descending order)

# Eigenvectors (columns)
eig$vectors
#           [,1]       [,2]
# [1,] 0.7071068 -0.4472136
# [2,] 0.7071068  0.8944272

cat('Each column is one eigenvector (unit length)')

验证 Av = lambda * v

要进行验证,请检查 A %*% v - lambda * v 是否实质上为零。由于浮点运算,请使用 max(abs(...)),并检查结果是否接近机器精度,而不要测试严格相等。

A <- matrix(c(4, 1,
              2, 3), nrow = 2, byrow = TRUE)
eig <- eigen(A)

lambda1 <- eig$values[1]   # 5
v1      <- eig$vectors[, 1]

# Verify: Av - lambda*v should be ~0
residual <- A %*% v1 - lambda1 * v1
max(abs(residual))  # ~ 1e-16

# Check all eigenpairs at once
# A V = V diag(lambda) where V = eigenvectors matrix
V <- eig$vectors
Lambda <- diag(eig$values)
err <- A %*% V - V %*% Lambda
max(abs(err))  # near zero

对称矩阵:实特征值

对称矩阵(A = t(A))始终具有实特征值和正交特征向量。这就是谱定理,在统计学中非常重要(协方差矩阵是对称半正定矩阵)。

# Symmetric matrix
S <- matrix(c(4, 2, 2,
              2, 3, 1,
              2, 1, 5), nrow = 3, byrow = TRUE)

# All symmetric: A = t(A)
all.equal(S, t(S))  # TRUE

# Eigenvalues are real
eig <- eigen(S)
eig$values  # All real numbers
Im(eig$values)  # All zero

# Eigenvectors are orthogonal: V'V = I
V <- eig$vectors
round(t(V) %*% V, 10)  # Identity matrix
cat('Symmetric -> real eigenvalues, orthogonal eigenvectors')

非对称矩阵:复特征值

非对称矩阵可能具有复特征值(成对出现的共轭复数)。R 会将它们作为复数返回。实部决定增长或衰减,虚部决定旋转或振荡。

# Rotation-like matrix -> complex eigenvalues
A <- matrix(c(0, -1,
              1,  0), nrow = 2, byrow = TRUE)
# This is a 90-degree rotation matrix
eig <- eigen(A)
eig$values
# [1] 0+1i 0-1i  (pure imaginary!)

# Real part: zero -> neither grows nor decays
Re(eig$values)  # 0 0

# Imaginary part: indicates rotation
Im(eig$values)  # 1 -1

# Another example: stable spiral
B <- matrix(c(-1, -2,
               2, -1), nrow = 2, byrow = TRUE)
eigen(B)$values  # -1 +/- 2i

特征值分解 A = VLV^-1

可对角化矩阵 A 可以写成 A = V Λ V⁻¹,其中 V 是特征向量矩阵,Λ = diag(eigenvalues)。这种分解可以方便地计算矩阵幂:A^n = V Λ^n V⁻¹。

A <- matrix(c(4, 1,
              2, 3), nrow = 2, byrow = TRUE)
eig <- eigen(A)
V      <- eig$vectors
Lambda <- diag(eig$values)

# Reconstruct A = V %*% Lambda %*% solve(V)
A_reconstructed <- V %*% Lambda %*% solve(V)
all.equal(A, A_reconstructed)  # TRUE

# Matrix power A^3 using eigendecomposition
A_cubed_eig <- V %*% diag(eig$values^3) %*% solve(V)
A_cubed_direct <- A %*% A %*% A
all.equal(Re(A_cubed_eig), A_cubed_direct)  # TRUE

通过协方差特征值理解 PCA

主成分分析(PCA)使用协方差矩阵的特征值分解。特征向量给出方差最大的方向(主成分);特征值给出各方向上的方差。

set.seed(42)
# Correlated 2D data
x1 <- rnorm(100)
x2 <- 0.8 * x1 + 0.6 * rnorm(100)
X <- cbind(x1, x2)

# Covariance matrix
C <- cov(X)
print(round(C, 3))

# Eigendecomposition of covariance matrix
eig <- eigen(C)
cat('Eigenvalues (variance explained):\n')
print(eig$values)
cat('PC1 direction:\n')
print(eig$vectors[, 1])

# Variance explained by PC1
prop_var <- eig$values[1] / sum(eig$values)
cat('PC1 explains:', round(100 * prop_var, 1), '%')

谱半径

谱半径 ρ(A) = max|λᵢ| 是最大的特征值绝对值。它决定迭代算法的稳定性:如果 ρ < 1,迭代会收敛;如果 ρ > 1,迭代会发散。

spectral_radius <- function(A) {
  max(Mod(eigen(A)$values))
}

# Convergent matrix: spectral radius < 1
A_conv <- matrix(c(0.5, 0.2,
                   0.1, 0.3), nrow = 2, byrow = TRUE)
spectral_radius(A_conv)  # < 1 -> iterations converge

# Divergent matrix: spectral radius > 1
A_div <- matrix(c(2, 0.5,
                  0.3, 1.5), nrow = 2, byrow = TRUE)
spectral_radius(A_div)  # > 1 -> iterations diverge

# For positive definite A, spectral radius = max eigenvalue
cat('Spectral radius determines iterative stability')

通过特征值计算行列式和迹

行列式等于特征值的乘积,迹等于特征值的和。这些关系将代数性质与特征值联系起来,也可用于检查 eigen() 结果是否合理。

A <- matrix(c(5, 2,
              1, 4), nrow = 2, byrow = TRUE)
eig_vals <- eigen(A)$values

# det(A) = product of eigenvalues
det(A)
prod(eig_vals)  # Same!

# trace = sum of eigenvalues
sum(diag(A))
sum(eig_vals)  # Same!

# For numeric precision, use Re() on complex
A2 <- matrix(c(3, -1, 2, 5), nrow = 2, byrow = TRUE)
ev <- eigen(A2)$values
all.equal(det(A2), prod(Re(ev)), tolerance = 1e-10)
all.equal(sum(diag(A2)), sum(Re(ev)), tolerance = 1e-10)

正定矩阵

如果所有特征值都为正,则对称矩阵是正定(PD)矩阵。协方差矩阵是半正定的(特征值 ≥ 0)。PD 矩阵可逆,并且具有 Cholesky 分解。

# Check positive definiteness
is_positive_definite <- function(A) {
  # Symmetric check
  if (!isTRUE(all.equal(A, t(A)))) return(FALSE)
  all(eigen(A)$values > 0)
}

# Positive definite covariance matrix
S <- matrix(c(4, 2,
              2, 3), nrow = 2, byrow = TRUE)
is_positive_definite(S)  # TRUE
eigen(S)$values  # Both positive

# Not PD (one negative eigenvalue)
Q <- matrix(c(1, 3,
              3, 2), nrow = 2, byrow = TRUE)
is_positive_definite(Q)  # FALSE
eigen(Q)$values  # One negative

幂迭代求主特征值

对于大型矩阵,计算全部特征值的代价很高。幂迭代通过反复迭代寻找最大特征值,是 Google PageRank 算法的基础。反复与 A 相乘,然后进行归一化。

# Power iteration: finds dominant eigenvalue
power_iteration <- function(A, tol = 1e-10, max_iter = 1000) {
  n <- nrow(A)
  v <- rnorm(n); v <- v / sqrt(sum(v^2))  # random unit vector
  lambda_old <- 0
  for (i in seq_len(max_iter)) {
    w <- A %*% v
    lambda <- max(abs(w))
    v <- w / lambda
    if (abs(lambda - lambda_old) < tol) break
    lambda_old <- lambda
  }
  list(value = lambda, vector = v)
}

A <- matrix(c(4, 1, 2, 3), nrow = 2, byrow = TRUE)
result <- power_iteration(A)
result$value  # Should be ~5 (dominant eigenvalue)
eigen(A)$values[1]  # Compare

快速检查

请测试您对 R 中特征值和特征向量的理解。

回顾:特征值和特征向量

要点:eigen(A) 返回 $values 和 $vectors。使用 A %*% v - lambda*v ≈ 0 进行验证。对称矩阵具有实特征值和正交特征向量。非对称矩阵可能具有复特征值。det(A) = 特征值的乘积;迹 = 特征值的和。PCA 分解协方差矩阵。正定矩阵 ↔ 所有特征值 > 0。

A <- matrix(c(6, 2, 2, 3), nrow = 2)
eig <- eigen(A)

# Key eigen operations:
eig$values    # eigenvalues
eig$vectors   # eigenvectors (columns)

# Verify Av = lambda*v
v1 <- eig$vectors[, 1]
max(abs(A %*% v1 - eig$values[1] * v1))  # ~0

# Properties
all.equal(det(A), prod(eig$values))       # TRUE
all.equal(sum(diag(A)), sum(eig$values))  # TRUE

# Reconstruct A = V Lambda V^{-1}
V <- eig$vectors
all.equal(A, Re(V %*% diag(eig$values) %*% solve(V)))

常见问题解答

「特征值与特征向量」课时是免费的吗?

是的 — 「特征值与特征向量」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。

「特征值与特征向量」这节课中我会学到什么?

使用 eigen() 计算特征分解并解读结果 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 R Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 R Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「特征值与特征向量」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 R Academy 课中编写并运行代码吗?

能。每节 R Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 矩阵乘法与行列式
  2. 使用 solve() 求解线性系统
  3. 特征值与特征向量
  4. SVD、QR 与 Cholesky 分解
← 返回 R Academy