0Pricing
R Academy · 강의

고유값과 고유벡터

eigen()으로 고유분해를 계산하고 결과를 해석합니다.

고유값과 고유벡터은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

고유값이란 무엇인가요?

행렬 A의 고유벡터 v는 A를 곱했을 때 회전하지 않고 크기만 변하는 0이 아닌 벡터입니다. 즉 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(고유벡터를 열로 갖는 행렬)가 포함된 목록을 반환합니다. 고유벡터는 길이가 1이 되도록 정규화됩니다.

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가 사실상 0인지 확인하세요. 부동소수점 연산을 사용하므로 정확한 등식을 검사하기보다 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 행렬은 가역이며 촐레스키 분해를 가집니다.

# 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)))

자주 묻는 질문

“고유값과 고유벡터” 강의는 무료인가요?

네 — “고유값과 고유벡터” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“고유값과 고유벡터”에서 뭘 배우나요?

eigen()으로 고유분해를 계산하고 결과를 해석합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“고유값과 고유벡터” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 행렬 곱셈과 행렬식
  2. solve()로 연립 선형 방정식 풀기
  3. 고유값과 고유벡터
  4. SVD, QR 및 촐레스키 분해
← R Academy(으)로 돌아가기