Skip to content
Home DSA Eigenvalues and Eigenvectors — Explained with Applications

Eigenvalues and Eigenvectors — Explained with Applications

Where developers are forged. · Structured learning · Free forever.
📍 Part of: Linear Algebra → Topic 4 of 5
Learn eigenvalues and eigenvectors — what they mean geometrically, how to compute them, and why they underpin PCA, Google PageRank, vibration analysis, and quantum mechanics.
🔥 Advanced — solid DSA foundation required
In this tutorial, you'll learn
Learn eigenvalues and eigenvectors — what they mean geometrically, how to compute them, and why they underpin PCA, Google PageRank, vibration analysis, and quantum mechanics.
  • Av = λv: eigenvector v is unchanged in direction by A, scaled by eigenvalue λ.
  • Eigenvalues from characteristic polynomial det(A-λI)=0. Eigenvectors from null space of (A-λI).
  • PCA: eigenvectors of covariance matrix = principal components. Eigenvalues = variance explained.
✦ Plain-English analogy ✦ Real code with output ✦ Interview questions
Quick Answer
  • Eigenvector of a matrix A: a nonzero vector v such that Av = λv (only scaled, not rotated)
  • Eigenvalue λ: the scalar factor by which the eigenvector is stretched or shrunk
  • Compute: solve det(A — λI) = 0 for λ, then (A - λI)v = 0 for v
  • Real symmetric matrices: always have real eigenvalues and orthogonal eigenvectors — use numpy.linalg.eigh
  • Power iteration: repeated Av / ‖Av‖ converges to dominant eigenvector — original PageRank algorithm
  • Production trap: near-zero eigenvalues cause division‑by‑zero in PCA whitening and numerical instability in any downstream inversion
🚨 START HERE

Eigenvalue/Eigenvector Debug Cheat Sheet

Quick commands and fixes for common numerical issues with eigendecomposition in production.
🟡

Numpy returns complex eigenvalues for a real symmetric matrix

Immediate ActionVerify matrix symmetry: np.allclose(A, A.T). If not symmetric, use eigh which forces symmetric assumption.
Commands
np.linalg.eigh(A) # assumes symmetric, returns real eigenvalues
np.max(np.abs(A - A.T)) # check asymmetry magnitude
Fix NowIf asymmetry < 1e-12, force symmetry: A_sym = (A + A.T) / 2
🟡

Eigenvalues include tiny negative values (e.g., -1e-15) for a positive semi-definite matrix

Immediate ActionDo not use these eigenvalues directly in inversion or whitening. Clamp to zero.
Commands
eigvals = np.clip(eigvals, 0, None) # set negative to zero
condition_number = np.max(eigvals) / np.min(eigvals[eigvals > 1e-12])
Fix NowUse numpy.linalg.pinv with rcond=1e-10 instead of manual inverse based on eigenvalues.
Production Incident

Near‑Zero Eigenvalues Silently Break PCA Whitening in Production

A financial fraud detection model started producing infinite values after a data pipeline change. Root cause: a near‑zero eigenvalue in the covariance matrix caused division by zero during whitening.
SymptomModel output suddenly contains NaN or Inf values. PCA whitened features explode. The pipeline runs without errors because the division by zero happens inside a NumPy vectorized operation.
AssumptionEngineers assumed the covariance matrix was always full rank and well‑conditioned. They used a hard‑coded epsilon for pseudo‑inverse, but the new dataset introduced a feature with extremely low variance.
Root causeThe covariance matrix after feature scaling had an eigenvalue ~ 1e‑16. The whitening step divided by the square root of eigenvalues, causing overflow. No guard against near‑zero or negative eigenvalues due to floating‑point rounding.
FixReplace direct eigendecomposition with SVD (singular value decomposition) for the whitening step. Add a tolerance: set eigenvalues below 1e‑10 to a small positive value (e.g., 1e‑6) before inversion. Use numpy.linalg.pinv with rcond parameter instead of manual inverse.
Key Lesson
Never compute the inverse of a matrix based on eigendecomposition without checking the condition number.Always handle near‑zero eigenvalues by clamping or using SVD.Monitor the condition number of your covariance matrix in production. A condition number > 1e6 is a red flag.Use numpy.linalg.pinv or scipy.linalg.pinv for robust generalized inverses.
Production Debug Guide

Common failures in eigenvalue-related algorithms and their immediate fixes

PCA model returns NaN after training on new dataCheck condition number of covariance matrix. If > 1e6, reduce dimensionality or apply stronger regularization.
PageRank fails to converge within iteration limitVerify the link matrix is stochastic (columns sum to 1). Check for dangling nodes (zero columns). Add teleportation factor.
Vibration analysis shows imaginary frequencies for a symmetric stiffness matrixRe‑check matrix symmetry. Even tiny floating‑point asymmetry can produce small imaginary parts. Force symmetry: A = (A + A.T)/2 before eigendecomposition.
Eigenvector orthogonality check fails (dot product > 1e‑10)For symmetric matrices, use numpy.linalg.eigh (guarantees orthogonal eigenvectors). For general matrices, expect loss of orthogonality; use SVD instead.

Eigenvalues and eigenvectors are perhaps the most fundamental concept in applied linear algebra. Av = λv — a matrix A, when applied to its eigenvector v, produces the same vector scaled by eigenvalue λ. Finding the directions that a transformation preserves (up to scaling) reveals the essential structure of the transformation.

Google's original PageRank was the dominant eigenvector of the web's link matrix. PCA computes the eigenvectors of a covariance matrix to find principal components. Quantum states are eigenvectors of Hamiltonian operators. Structural resonant frequencies are eigenvalues of stiffness matrices. Understanding eigenvectors is understanding how to extract the 'essential directions' from a linear system.

Computing Eigenvalues and Eigenvectors

Eigenvalues: solve det(A - λI) = 0 (characteristic polynomial). Eigenvectors: for each λ, solve (A - λI)v = 0.

The characteristic polynomial of an n×n matrix is degree n. For large n, numerical methods (QR algorithm, power iteration) are used. Python's numpy.linalg.eig uses the LAPACK library, which applies the QR algorithm with shifts.

eigen.py · PYTHON
123456789101112131415
import numpy as np

A = np.array([[4,2],[1,3]], dtype=float)

# NumPy eigendecomposition
eigenvalues, eigenvectors = np.linalg.eig(A)
print('Eigenvalues:', eigenvalues)   # [5, 2]
print('Eigenvectors (columns):\n', eigenvectors)

# Verify: Av = λv
for i in range(len(eigenvalues)):
    v = eigenvectors[:, i]
    lam = eigenvalues[i]
    print(f'λ={lam:.1f}: Av={A@v}, λv={lam*v}')
    print(f'  Match: {np.allclose(A@v, lam*v)}')
▶ Output
Eigenvalues: [5. 2.]
Eigenvectors (columns):
[[0.894 0.707]
[0.447 -0.707]]
λ=5.0: Av=[4.472 2.236], λv=[4.472 2.236]
Match: True
λ=2.0: Av=[1.414 -1.414], λv=[1.414 -1.414]
Match: True
📊 Production Insight
For n > 1000, computing all eigenvalues is O(n³). Use sparse methods (scipy.sparse.linalg.eigs) when only a few eigenpairs are needed.
If the matrix is nearly defective (almost non-diagonalizable), the algorithm may produce inaccurate eigenvectors. Check residual ‖Av - λv‖.
Always use eigh for symmetric matrices — it's twice as fast and guarantees real eigenvalues.
🎯 Key Takeaway
Eigenvalues from det(A - λI) = 0, eigenvectors from nullspace of (A - λI).
Use numpy.linalg.eig for general matrices, eigh for symmetric.
Residual ‖Av - λv‖ should be near machine epsilon; if not, suspect numerical trouble.

Power Iteration — Finding the Dominant Eigenvector

Power iteration finds the largest eigenvalue by repeatedly multiplying by A and normalising. This is the algorithm behind original PageRank.

Algorithm: initialize random v, then loop v = A v / ‖A v‖. Convergence rate depends on the ratio |λ₂/λ₁| — closer to 1 means slower convergence. Rayleigh quotient λ = vᵀAv / vᵀv gives eigenvalue estimate.

power_iteration.py · PYTHON
12345678910111213141516171819
def power_iteration(A, n_iter=100, tol=1e-10):
    """Find dominant eigenvector (largest eigenvalue)."""
    import numpy as np
    n = len(A)
    v = np.random.rand(n)
    v /= np.linalg.norm(v)
    for _ in range(n_iter):
        v_new = A @ v
        eigenvalue = np.dot(v_new, v)  # Rayleigh quotient
        v_new /= np.linalg.norm(v_new)
        if np.linalg.norm(v_new - v) < tol:
            return eigenvalue, v_new
        v = v_new
    return eigenvalue, v

A = np.array([[4,2],[1,3]], dtype=float)
lam, v = power_iteration(A)
print(f'Dominant eigenvalue: {lam:.4f}')  # 5.0
print(f'Dominant eigenvector: {v}')
▶ Output
Dominant eigenvalue: 5.0000
Dominant eigenvector: [0.894 0.447]
📊 Production Insight
Power iteration is the core of PageRank — but PageRank's link matrix is not necessarily symmetric, so eigenvectors may not be orthogonal.
If the dominant eigenvalue is not well separated (|λ₁| ≈ |λ₂|), convergence slows dramatically. Use shifted power iteration or Arnoldi methods.
Rayleigh quotient iteration can converge to any eigenvector if initial guess is close — useful for structural engineering mode shapes.
🎯 Key Takeaway
Power iteration: Av → dominant eigenvector.
Convergence rate |λ₂/λ₁| — poor separation = slow.
Rayleigh quotient gives eigenvalue estimate for free.

Geometric Intuition: What Does Av = λv Mean?

An eigenvector points in a direction that is invariant under the transformation A — it only gets stretched (or shrunk, or reversed) by λ. This is the 'natural axis' of the matrix.

Example: A = [[2,0],[0,3]]. The eigenvectors are [1,0]ᵀ (λ=2) and [0,1]ᵀ (λ=3). Multiply any point: x-coordinate doubles, y-coordinate triples — the axes are scaled independently. If you pick any other direction, the point rotates AND scales.

For a symmetric matrix, eigenvectors are orthogonal — they form a perfect coordinate system. For a non‑symmetric matrix, eigenvectors are not orthogonal, and the transformation can shear.

geometric_demo.py · PYTHON
1234567891011121314
import numpy as np
import matplotlib.pyplot as plt

# Diagonal matrix – eigenvectors are axes
A = np.array([[2,0],[0,3]])
v1 = np.array([1,0])
v2 = np.array([0,1])
print("Eigenvectors are standard axes:", A@v1, A@v2)  # [2,0] and [0,3]

# Shear matrix – eigenvectors not orthogonal
B = np.array([[1,1],[0,1]])
eigvals, eigvecs = np.linalg.eig(B)
print("Shear eigenvalues (both 1):", eigvals)
print("Only one eigenvector (not span):", eigvecs[:,0])
📊 Production Insight
Eigenvector orthogonality matters in PCA: non‑orthogonal components mean variance is shared across components. Always check symmetry of the covariance matrix.
A defective matrix (like the shear example) does not have a complete set of eigenvectors — numerical algorithms may fail silently.
When eigenvectors are nearly parallel, the matrix is ill‑conditioned and any inversion is risky.
🎯 Key Takeaway
Eigenvector = direction unchanged by A.
Symmetric → orthogonal eigenvectors.
Defective matrices have incomplete eigenvector sets — use SVD instead.

Real‑World Applications: Where Eigenvalues Matter in Production

Eigenvalues and eigenvectors are not just theoretical. They power critical algorithms:

  • PCA (Principal Component Analysis): eigenvectors of the covariance matrix = principal components; eigenvalues = variance explained. Used for dimensionality reduction, noise filtering, and anomaly detection.
  • PageRank: the dominant eigenvector of the web's transition matrix gives page importance. Google solved this for billions of pages using iterative methods.
  • Structural Engineering: eigenvalues of the stiffness matrix = natural frequencies. If a bridge's frequency matches wind gust frequency, resonance can collapse it (Tacoma Narrows).
  • Quantum Mechanics: eigenstates of the Hamiltonian operator are the possible energy levels. The Schrödinger equation is an eigenvalue problem.
  • Graph Theory: eigenvalues of the adjacency matrix indicate community structure, connectivity, and node centrality (spectral clustering).
Mental Model
Eigenvalues as 'Fingerprints' of a Matrix
Think of eigenvalues as the DNA of a linear transformation — they encode the essential scaling behavior without the rotation details.
  • Eigenvalues are the roots of the characteristic polynomial — they capture the 'stretch factors' along invariant directions.
  • The spectral radius (largest |λ|) determines stability of dynamical systems: if > 1, the system diverges.
  • The condition number (max λ / min λ) tells you how close the matrix is to singular.
  • For symmetric matrices, eigenvalues are real and the eigenvectors form an orthonormal basis — the matrix can be 'diagonalized' perfectly.
📊 Production Insight
In ML pipelines, eigenvalues are used for feature scaling: if eigenvalues drop sharply after a few components, you can save memory and computation by truncating.
Never hard‑code the number of PCA components — use eigenvalue ratio threshold (e.g., keep 95% variance).
For real‑time PageRank, use an incremental algorithm (e.g., PageRank on evolving graphs) to avoid recomputing the full eigenvector each time.
🎯 Key Takeaway
Eigenvalues appear everywhere: PCA (variance), PageRank (importance), structures (frequencies), quantum (energy).
Always validate that eigenvalues make physical sense before deploying.
Use the spectral gap (λ₁ - λ₂) to decide if a rank‑1 approximation is sufficient.

Numerical Stability and Production Gotchas

  • Near‑zero eigenvalues cause division by zero in whitening or matrix functions.
  • Round‑off asymmetry: a matrix that is theoretically symmetric may have tiny asymmetry due to floating‑point ops, leading to complex eigenvalues.
  • Defective matrices: not all matrices have a full set of eigenvectors — numpy.linalg.eig still returns a result, but the eigenvectors may be linearly dependent or wildly inaccurate.
  • Condition number: if the condition number (max|λ|/min|λ|) is huge (e.g., > 10¹²), small changes in A cause large changes in eigenvectors. The problem is ill‑posed.
Best practices
  • Always check residual ‖Av
  • λv‖.
  • Use numpy.linalg.eigh when symmetry is guaranteed.
  • For ill‑conditioned cases, switch to SVD (singular value decomposition), which is more stable for any matrix.
  • When computing matrix functions (sqrt, inverse, exp) via eigendecomposition, use scipy.linalg.sqrtm, inv, expm which handle stability internally.
numerical_safety.py · PYTHON
1234567891011121314
import numpy as np
from io.thecodeforge.linalg import safe_eigen # hypothetical robust wrapper

# Ill‑conditioned matrix (nearly singular)
A = np.array([[1, 1], [1, 1 + 1e-12]])
eigvals, eigvecs = np.linalg.eig(A)
print("Eigenvalues (should be ~2 and ~1e-12):", eigvals)
# Residual check
v = eigvecs[:,0]
lam = eigvals[0]
print("Residual norm:", np.linalg.norm(A@v - lam*v))
# Use safe decomposition instead
U, S, Vt = np.linalg.svd(A)
print("Singular values:", S)  # More stable
📊 Production Insight
Use numpy.linalg.eigh for symmetric matrices — it's 2x faster and avoids spurious complex eigenvalues.
If you must invert via eigendecomposition, set a tolerance: keep only eigenvalues above max(|λ|) * 1e-12.
Consider using eigsh (scipy.sparse.linalg) for large sparse matrices — it's the default for PageRank and PCA on big datasets.
🎯 Key Takeaway
Always check matrix symmetry before eigendecomposition.
Avoid inverting matrices with near‑zero eigenvalues — use SVD or pinv.
Residual check ‖Av - λv‖ < 1e-10 is mandatory in production.
🗂 Eigendecomposition vs SVD — When to Use Which
Both decompose a matrix, but they differ in applicability and stability.
PropertyEigendecomposition (A = QΛQ⁻¹)SVD (A = UΣVᵀ)
Applicable matricesSquare onlyAny matrix (rectangular too)
Requires diagonalizabilityYes – A must have n linearly independent eigenvectorsAlways exists
Numerical stabilityLower – sensitive to near‑zero eigenvaluesHigher – more robust for ill‑conditioned matrices
Orthogonal factorsOnly if A is symmetric (Q orthogonal)Always U and V are orthogonal
PerformanceFaster for symmetric (eigh)Slightly slower but more general
Inverse / pseudo‑inverseA⁻¹ = QΛ⁻¹Q⁻¹ (fragile)A⁺ = VΣ⁺Uᵀ (stable via threshold)
Common use casePCA, PageRank, vibration modes (square matrices)Recommendation systems, data compression, any linear least squares

🎯 Key Takeaways

  • Av = λv: eigenvector v is unchanged in direction by A, scaled by eigenvalue λ.
  • Eigenvalues from characteristic polynomial det(A-λI)=0. Eigenvectors from null space of (A-λI).
  • PCA: eigenvectors of covariance matrix = principal components. Eigenvalues = variance explained.
  • Power iteration: repeated A×v/‖Av‖ converges to dominant eigenvector — PageRank's original algorithm.
  • Symmetric matrices always have real eigenvalues and orthogonal eigenvectors — numpy.linalg.eigh for symmetric.
  • Never use eigendecomposition for inversion without checking condition number — use SVD or pinv instead.

⚠ Common Mistakes to Avoid

    Using eigendecomposition instead of SVD for rectangular matrices
    Symptom

    You attempt to compute eigenvalues of a non‑square matrix (e.g., feature matrix in ML). numpy.linalg.eig raises LinAlgError: Last 2 dimensions of the array must be square.

    Fix

    Use numpy.linalg.svd for rectangular matrices. If you need eigenvalues, consider the square Gram matrix AᵀA, but be aware that squaring worsens condition number.

    Assuming all matrices have a full set of eigenvectors (diagonalizable)
    Symptom

    You compute eigenvalues of a defective matrix (e.g., a shear). The eigenvectors returned by numpy.linalg.eig may be linearly dependent or inaccurate. Inversion or matrix power using decomposition produces nonsense.

    Fix

    Check the condition number of the eigenvector matrix: if cond(Q) > 1e6, the matrix is nearly defective. Switch to SVD or Jordan canonical form (rarely needed).

    Forgetting to handle negative eigenvalues in covariance matrix due to numeric noise
    Symptom

    PCA whitening produces NaN because eigenvalue is slightly negative (e.g., -1e-15) and you take sqrt.

    Fix

    Clamp eigenvalues to a small positive value (e.g., 1e-10) before taking square root. Use numpy.clip(eigvals, 0, None). Better yet, use SVD for whitening.

    Using numpy.linalg.eig on a symmetric matrix with tiny asymmetry
    Symptom

    Eigenvalues come out complex (small imaginary parts) even though matrix should be real‑symmetric.

    Fix

    Force symmetry: A = (A + A.T) / 2 before calling eigh. Use eigh instead of eig for any matrix that is theoretically symmetric.

Interview Questions on This Topic

  • QWhat is an eigenvector geometrically?JuniorReveal
    An eigenvector of a matrix A is a non‑zero vector v that, when multiplied by A, only changes by a scalar factor λ (Av = λv). Geometrically, it's a direction that the transformation does _not_ rotate — it only stretches, shrinks, or reverses. For symmetric matrices, eigenvectors are orthogonal and align with the principal axes of the transformation.
  • QHow is PageRank related to eigenvectors?Mid-levelReveal
    PageRank models the web as a directed graph where pages are nodes and links are edges. The transition matrix M (column‑stochastic) describes the probability of moving from one page to another. The PageRank vector is the dominant eigenvector of M, satisfying M·p = p. Google computed this iteratively using the power method, which works because the dominant eigenvalue is 1 and the gap between first and second eigenvalues ensures convergence.
  • QWhy do symmetric matrices have real eigenvalues?SeniorReveal
    Complex eigenvalues come from non‑symmetric matrices because the characteristic polynomial can have complex roots. For symmetric matrices, A = Aᵀ, the eigenvalues are real. Proof: for any eigenvalue λ and eigenvector v, λ‖v‖² = vᵀAv. Since Av = λv, vᵀAv = λvᵀv = λ‖v‖². But (vᵀAv) is real because A is symmetric and vᵀAv = (vᵀAv)ᵀ = vᵀAᵀv = vᵀAv, so λ must be real. Also, eigenvectors corresponding to distinct eigenvalues are orthogonal.
  • QHow does PCA use eigenvectors?Mid-levelReveal
    PCA finds the directions of maximum variance in the data. Compute the covariance matrix C of the centered data. The eigenvectors of C are the principal components (directions), and the eigenvalues are the variance explained by each component. Sort eigenvalues descending, keep the top k eigenvectors to project the data into a lower‑dimensional space. This is formally a eigen decomposition of C, which is symmetric positive semi‑definite, so all eigenvalues are real and non‑negative.
  • QWhat's the difference between eigendecomposition and SVD?SeniorReveal
    Eigendecomposition requires a square matrix that is diagonalizable: A = QΛQ⁻¹. SVD works for any matrix (square or rectangular): A = UΣVᵀ, where U and V are orthogonal and Σ is diagonal with singular values. SVD is more numerically stable and general. For example, to invert a rectangular matrix, you must use SVD (pseudo‑inverse). For symmetric positive definite matrices, eigendecomposition and SVD coincide (singular values = eigenvalues, U = V).

Frequently Asked Questions

What is eigendecomposition vs SVD?

Eigendecomposition A = QΛQ⁻¹ requires A to be square and diagonalisable. SVD A = UΣVᵀ works for any matrix (including non‑square, rank‑deficient). SVD is more numerically stable and general. For rectangular matrices (overdetermined systems, data matrices in ML), always use SVD.

Can a matrix have zero as an eigenvalue?

Yes. Zero eigenvalues appear when a matrix is singular (determinant zero). In PCA, a zero eigenvalue means that dimension has no variance. In physical systems, zero eigenvalues correspond to rigid‑body modes (no restoring force). Be careful when using such matrices in inversion — they are not invertible.

How are eigenvalues of a large matrix computed in practice?

The QR algorithm is the workhorse behind LAPACK's dgeev for dense matrices (O(n³)). For sparse matrices (up to millions of dimensions), use iterative methods: Arnoldi (scipy.sparse.linalg.eigs) or Lanczos (for symmetric). These find a few extreme eigenvalues efficiently. For PageRank, a tailored power iteration is used because the matrix is huge but we only need the dominant eigenvector.

What does it mean if eigenvalue λ = 1?

It means the eigenvector is a fixed point: the transformation does not change it at all. PageRank's dominant eigenvalue is exactly 1 (because the transition matrix is stochastic). In Markov chains, λ = 1 corresponds to the stationary distribution.

🔥
Naren Founder & Author

Developer and founder of TheCodeForge. I built this site because I was tired of tutorials that explain what to type without explaining why it works. Every article here is written to make concepts actually click.

← PreviousLU DecompositionNext →Singular Value Decomposition — SVD
Forged with 🔥 at TheCodeForge.io — Where Developers Are Forged