Av = λv: vektor yang hanya diskalakan oleh transformasi A — eigenvalue λ mengukur scaling factor, eigenvector v menunjukkan arah yang stabil. Konsep ini muncul dalam PCA, PageRank, matrix stability, dan vibrating systems analysis.

Setelah di episode 19 kita mempelajari linear transformations — rotasi, scaling, shear, dan komposisi — pada episode ini kita mempelajari eigenvalues dan eigenvectors: konsep yang menjelaskan arah stabil dari sebuah transformasi. Ketika matriks A ditransformasikan ke vektor v, kebanyakan vektor berubah arah. Tetapi ada vektor khusus — eigenvector — yang hanya diskalakan, tidak diputar. Faktor scaling-nya adalah eigenvalue.
Mengapa eigenvalues dan eigenvectors penting? Karena mereka mengungkapkan struktur internal dari matriks: arah dominan, stabilitas sistem, dan komponen utama data. PCA (dimensionality reduction) di machine learning, PageRank di Google, dan analisis stabilitas sistem semuanya berbasis eigenvalues. Ini adalah salah satu konsep linear algebra yang paling berdampak di dunia nyata.
Av = λv di mana:
A = matriks transformasi (n×n)v = eigenvector (vektor non-nol)λ = eigenvalue (skalar)Artinya: ketika A ditransformasikan ke v, hasilnya hanya v yang diskalakan sebesar λ.
import numpy as np
# Matriks A
A = np.array([[4, 2], [1, 3]])
# Hitung eigenvalue dan eigenvector
eigenvalues, eigenvectors = np.linalg.eig(A)
print(f"Matriks A:\n{A}")
print(f"\nEigenvalues: {eigenvalues}")
print(f"Eigenvectors:\n{eigenvectors}")
# Verifikasi: A × v = λ × v
for i in range(len(eigenvalues)):
v = eigenvectors[:, i]
lam = eigenvalues[i]
lhs = A @ v
rhs = lam * v
print(f"\nEigenvalue {i}: λ = {lam:.4f}")
print(f" A×v = {lhs}")
print(f" λ×v = {rhs}")
print(f" Match: {np.allclose(lhs, rhs)}")Eigenvalue adalah akar dari persamaan karakteristik: det(A - λI) = 0.
import numpy as np
from numpy.polynomial import polynomial as P
A = np.array([[4, 2], [1, 3]])
# det(A - λI) = 0
# |4-λ 2 |
# |1 3-λ| = (4-λ)(3-λ) - 2×1 = λ² - 7λ + 10 = 0
# Menggunakan numpy untuk mencari akar polinomial
coeffs = [1, -7, 10] # λ² - 7λ + 10
roots = np.roots(coeffs)
print(f"Persamaan karakteristik: λ² - 7λ + 10 = 0")
print(f"Akar (eigenvalues): {roots}")
# Verifikasi
eigenvalues, _ = np.linalg.eig(A)
print(f"Eigenvalues dari numpy: {eigenvalues}")A = np.array([
[2, 0, 0],
[0, 3, 4],
[0, 4, 9],
])
eigenvalues, eigenvectors = np.linalg.eig(A)
print(f"Matriks 3×3:\n{A}")
print(f"\nEigenvalues: {eigenvalues}")
for i, lam in enumerate(eigenvalues):
v = eigenvectors[:, i]
print(f"\nλ_{i+1} = {lam:.4f}")
print(f" v_{i+1} = {v}")
print(f" A×v = {(A @ v)}")
print(f" λ×v = {lam * v}")import numpy as np
A = np.array([[2, 1], [1, 2]])
eigenvalues, eigenvectors = np.linalg.eig(A)
print("Arah stabil (eigenvectors) dari transformasi A:")
for i in range(len(eigenvalues)):
v = eigenvectors[:, i]
lam = eigenvalues[i]
print(f" Arah ({v[0]:.3f}, {v[1]:.3f}): diskalakan {lam:.1f}x")
# Demonstrasi: banyak vektor random ditransformasi
np.random.seed(42)
print("\nBeberapa vektor random setelah transformasi:")
for _ in range(5):
v = np.random.randn(2)
v = v / np.linalg.norm(v) # normalisasi
Av = A @ v
# Sudut perubahan arah
cos_angle = np.dot(v, Av) / (np.linalg.norm(v) * np.linalg.norm(Av))
angle = np.degrees(np.arccos(np.clip(cos_angle, -1, 1)))
print(f" {v} → {Av}, sudut berubah: {angle:.1f}°")import numpy as np
# Matrix stabil: semua |λ| < 1
A_stable = np.array([[0.5, 0.1], [0.1, 0.5]])
eig_stable = np.linalg.eigvals(A_stable)
print(f"Stabil: eigenvalues = {eig_stable}, |λ| < 1? {all(abs(e) < 1 for e in eig_stable)}")
# Matrix tidak stabil: ada |λ| > 1
A_unstable = np.array([[2.0, 0.1], [0.1, 2.0]])
eig_unstable = np.linalg.eigvals(A_unstable)
print(f"Tidak stabil: eigenvalues = {eig_unstable}, ada |λ| > 1? {any(abs(e) > 1 for e in eig_unstable)}")PCA menemukan direction of maximum variance — yang adalah eigenvector dari covariance matrix:
import numpy as np
# Dataset: 2D dengan korelasi
np.random.seed(42)
n = 100
x = np.random.randn(n)
y = 0.8 * x + 0.3 * np.random.randn(n) # y berkorelasi dengan x
data = np.column_stack([x, y])
# Center data
data_centered = data - data.mean(axis=0)
# Covariance matrix
cov = np.cov(data_centered.T)
print(f"Covariance matrix:\n{cov}")
# Eigen decomposition
eigenvalues, eigenvectors = np.linalg.eig(cov)
print(f"\nEigenvalues: {eigenvalues}")
print(f"Eigenvectors:\n{eigenvectors}")
# Principal components = eigenvectors dengan eigenvalue terbesar
pc1 = eigenvectors[:, np.argmax(eigenvalues)]
print(f"\nPC1 (direction of max variance): {pc1}")
print(f"Variance explained by PC1: {eigenvalues.max()/eigenvalues.sum():.1%}")Google's PageRank menggunakan eigenvalue dari matriks adjacency web graph — halaman dengan eigenvalue tertinggi paling "important":
import numpy as np
# Web graph: 4 halaman
# A → B, A → C, B → C, C → A, D → B, D → C
n = 4
M = np.zeros((n, n))
# M[j][i] = 1/k jika halaman i link ke k halaman
links = {0: [1, 2], 1: [2], 2: [0], 3: [1, 2]}
for page, targets in links.items():
for target in targets:
M[target][page] = 1 / len(targets)
# Add damping factor
d = 0.85
G = d * M + (1 - d) / n * np.ones((n, n))
# Power iteration untuk mencari steady state
v = np.ones(n) / n
for _ in range(100):
v = G @ v
v = v / v.sum()
print("PageRank (steady state):")
pages = ["A", "B", "C", "D"]
for page, rank in zip(pages, v):
print(f" Page {page}: {rank:.4f}")
print(f"\nMost important: {pages[np.argmax(v)]}")Note
Eigenvalue decomposition hanya berlaku untuk matriks persegi. Untuk matriks non-persegi (seperti dataset dengan banyak fitur), gunakan SVD (Singular Value Decomposition) yang merupakan generalisasi eigen decomposition. NumPy menyediakan np.linalg.svd() untuk ini.
Inti yang harus dibawa:
Av = λv: eigenvector v hanya diskalakan oleh transformasi A; eigenvalue λ mengukur scaling factor.det(A - λI) = 0.Di episode 21 selanjutnya kita akan mempelajari limits dan continuity — konsep fundamental calculus yang menjelaskan bagaimana fungsi berperilaku saat mendekati titik tertentu. Kita keluar dari linear algebra dan masuk ke calculus — dunia perubahan dan optimasi!