SVD, QR ve Cholesky Ayrışımları
Boyut indirgeme ve çarpanlara ayırma için svd(), qr() ve chol() işlevlerini uygulayın.
SVD, QR ve Cholesky Ayrışımları, CoddyKit'te ücretsiz bir R Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, R Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. R Academy kursu toplamda 4 dersten oluşur.
Matris Ayrıştırmaları Neden Kullanılır?
Matris ayrıştırmaları A'yı daha basit matrislerin çarpımlarına ayırır. Gizli yapıyı (rank, koşulluluk) ortaya çıkarır, verimli hesaplamayı mümkün kılar ve istatistik ile makine öğrenmesinde PCA, regresyon ve optimizasyonun temelini oluşturur.
# Three fundamental decompositions:
# 1. SVD: A = U D V' (any matrix)
# 2. QR: A = Q R (any matrix)
# 3. Cholesky: A = L L' (symmetric positive definite)
# Each serves a purpose:
# SVD -> PCA, pseudoinverse, rank, image compression
# QR -> linear regression, Gram-Schmidt, eigenvalues
# Cholesky -> fast solve for SPD systems, simulation
A <- matrix(c(4, 3, 2,
3, 6, 1,
2, 1, 5), nrow = 3, byrow = TRUE)
cat('Matrix ready for decomposition')
print(A)SVD: svd() İşlevi
Tekil Değer Ayrıştırması (SVD), her m×n boyutlu A matrisini A = U D V' biçiminde çarpanlarına ayırır; burada U ve V ortogonal, D ise azalmayan tekil değerleri içeren köşegen matristir.
A <- matrix(c(1, 2, 3,
4, 5, 6), nrow = 2, byrow = TRUE)
# Compute SVD
svd_result <- svd(A)
# Components:
svd_result$d # singular values (decreasing)
svd_result$u # left singular vectors (2x2)
svd_result$v # right singular vectors (3x2)
cat('Singular values:', svd_result$d, '\n')
cat('Rank of A:', sum(svd_result$d > 1e-10), '\n')SVD ile Yeniden Oluşturma
A'yı SVD'den A = U %*% diag(d) %*% t(V) biçiminde yeniden oluşturun. Düşük ranklı yaklaşımlar yalnızca en büyük k tekil değerleri veya vektörleri korur — bu, görüntü sıkıştırma ve gürültü azaltmanın temelidir.
A <- matrix(c(1, 2, 3,
4, 5, 6,
7, 8, 9), nrow = 3, byrow = TRUE)
res <- svd(A)
U <- res$u; d <- res$d; V <- res$v
# Full reconstruction: A = U diag(d) V'
A_reconstructed <- U %*% diag(d) %*% t(V)
all.equal(A, A_reconstructed) # TRUE
# Rank-1 approximation (best rank-1 approx by Eckart-Young)
A_rank1 <- d[1] * U[, 1] %*% t(V[, 1])
print(round(A_rank1, 2))
# Frobenius error of rank-1 approx
sqrt(sum((A - A_rank1)^2))SVD: Sözde Ters ve Rank
SVD, sözde tersi A⁺ = V D⁺ U' biçiminde verir; burada D⁺, sıfır olmayan her tekil değerin karşılığını tersiyle değiştirir. A kare veya tam ranklı olmasa bile Ax = b denklemini en küçük kareler anlamında çözer.
A <- matrix(c(1, 2, 3,
4, 5, 6), nrow = 2, byrow = TRUE)
# Pseudoinverse via SVD
svd_res <- svd(A)
tol <- 1e-10
# Invert nonzero singular values
d_inv <- ifelse(svd_res$d > tol, 1/svd_res$d, 0)
A_pinv <- svd_res$v %*% diag(d_inv) %*% t(svd_res$u)
print(A_pinv) # 3x2 pseudoinverse
# Least-squares solution: x = A+ b
b <- c(7, 8)
x_ls <- A_pinv %*% b
print(x_ls)
# Compare with MASS::ginv
# MASS::ginv(A) should give the same resultQR Ayrıştırması: qr()
QR ayrıştırması A = QR olacak şekilde çarpanlara ayırır; burada Q ortogonal (Q'Q = I), R ise üst üçgenseldir. Doğrusal regresyonda, özdeğer hesaplamada (QR algoritması) ve Gram-Schmidt ortogonalleştirmesinde kullanılır.
A <- matrix(c(1, 2,
3, 4,
5, 6), nrow = 3, byrow = TRUE)
# Compute QR decomposition
qr_res <- qr(A)
# Extract Q and R
Q <- qr.Q(qr_res) # 3x2 orthogonal
R <- qr.R(qr_res) # 2x2 upper triangular
cat('Q is orthogonal: Q\'Q = I\n')
print(round(t(Q) %*% Q, 10)) # Identity
cat('R is upper triangular:\n')
print(round(R, 6))
# Reconstruct A = Q %*% R
all.equal(A, Q %*% R) # TRUERegresyon için QR
Doğrusal regresyonun normal denklemlerini QR ile çözmek sayısal olarak daha üstündür. Q'Q = I olduğundan A'Ax = A'b normal denklemleri R'Q'QRx = R'Q'b biçimine dönüşür ve Rx = Q'b biçiminde sadeleşir; bu denklem geri yerine koyma ile çözülür.
# Generate regression data
set.seed(7)
n <- 20
x1 <- rnorm(n); x2 <- rnorm(n)
y <- 1 + 2*x1 - 0.5*x2 + rnorm(n, sd = 0.5)
# Design matrix
X <- cbind(intercept = 1, x1 = x1, x2 = x2)
# QR solve: numerically stable
beta_qr <- qr.solve(X, y)
print(beta_qr) # ~c(1, 2, -0.5)
# Compare with lm()
beta_lm <- coef(lm(y ~ x1 + x2))
all.equal(beta_qr, beta_lm, check.names = FALSE) # TRUE
# The qr.solve internals use backsolve on R
cat('QR regression is lm()\'s default method')Cholesky Ayrıştırması: chol()
Cholesky, simetrik pozitif belirli bir matrisi A = L L' biçiminde çarpanlarına ayırır; burada L alt üçgenseldir. R'nin chol() işlevi üst üçgensel U çarpanını döndürür (dolayısıyla A = t(U) %*% U).
# Symmetric positive definite matrix
A <- matrix(c(4, 2,
2, 3), nrow = 2, byrow = TRUE)
# Cholesky decomposition: A = t(U) %*% U
U <- chol(A)
print(U)
# Note: chol() returns UPPER triangular in R
# Reconstruct
all.equal(A, t(U) %*% U) # TRUE
# Attempting Cholesky on non-PD matrix throws error
# Catch it:
result <- tryCatch(
chol(matrix(c(1, 3, 3, 2), nrow = 2)),
error = function(e) cat('Error:', e$message)
)Cholesky ile Çözüm
Simetrik pozitif belirli sistemlerde (kovaryans matrisleri gibi) Cholesky tabanlı çözüm, LU'dan iki kat daha hızlıdır. Tersi hesaplamak için chol2inv() kullanın veya Cholesky çarpanıyla backsolve/forwardsolve kullanın.
# SPD system: typical in statistics (covariance matrices)
set.seed(1)
X <- matrix(rnorm(30), nrow = 10, ncol = 3)
A <- crossprod(X) # X'X is always SPD
b <- c(1, 2, 3)
# Cholesky factor
U <- chol(A) # Upper triangular
# Solve A x = b using two triangular solves
# A = t(U) %*% U -> solve t(U) y = b, then U x = y
y <- forwardsolve(t(U), b)
x <- backsolve(U, y)
print(x)
# Verify
all.equal(as.vector(A %*% x), b)
# Or: inverse via chol2inv
A_inv <- chol2inv(U)
all.equal(x, as.vector(A_inv %*% b))PCA'da SVD
SVD ile PCA: veri matrisi X'i merkezleyin, ardından merkezlenmiş X'in SVD'sini hesaplayın. Sağ tekil vektörler V, temel bileşen yönleridir; tekil değerler d, açıklanan varyansla ilişkilidir (d²/(n-1)).
set.seed(42)
n <- 50; p <- 3
X <- matrix(rnorm(n * p), nrow = n)
# Add correlation
X[, 2] <- 0.8 * X[, 1] + 0.6 * X[, 2]
# Center
X_c <- scale(X, center = TRUE, scale = FALSE)
# SVD of centered data
svd_res <- svd(X_c)
# Variance explained by each PC
var_explained <- svd_res$d^2 / (n - 1)
prop_var <- var_explained / sum(var_explained)
cat('Proportion of variance explained:\n')
print(round(prop_var, 3))
# Compare with prcomp
pc <- prcomp(X)
all.equal(prop_var, pc$sdev^2 / sum(pc$sdev^2))SVD ile Matris Rankı
Bir matrisin rankı, göz ardı edilemeyecek tekil değerlerin sayısına eşittir. SVD, rankı belirlemenin sayısal açıdan en güvenilir yolunu sağlar — bir eşikten (genellikle max(d) * tol) büyük d değerlerini saymanız yeterlidir.
# Full-rank matrix (rank 3)
A <- matrix(c(1, 0, 0,
0, 2, 0,
0, 0, 3), nrow = 3)
svd(A)$d # c(3, 2, 1) - all nonzero -> rank 3
# Rank-deficient matrix (rank 2)
B <- matrix(c(1, 2, 3,
2, 4, 6, # row 2 = 2 * row 1
0, 1, 1), nrow = 3, byrow = TRUE)
svd(B)$d # Third value is ~0
# Rank function using SVD
matrix_rank <- function(M, tol = 1e-10) {
d <- svd(M)$d
sum(d > tol * d[1]) # relative tolerance
}
matrix_rank(B) # 2Çok Değişkenli Normal Dağılımdan Örnekleme için Cholesky
Çok değişkenli normal N(μ, Σ) dağılımından örnek almak için Σ'nın Cholesky çarpanı U'yu hesaplayın, ardından standart normalleri dönüştürün: X = μ + Z %*% U. MASS::mvrnorm() dahili olarak bu şekilde çalışır.
set.seed(99)
# Covariance matrix
Sigma <- matrix(c(4, 2,
2, 3), nrow = 2)
mu <- c(1, 5)
n_samples <- 500
# Cholesky factor
U <- chol(Sigma)
# Sample standard normals
Z <- matrix(rnorm(n_samples * 2), nrow = n_samples)
# Transform: X ~ N(mu, Sigma)
X <- sweep(Z %*% U, 2, mu, FUN = '+')
# Check empirical covariance
print(round(cov(X), 2)) # Should be close to Sigma
print(round(colMeans(X), 2)) # Should be close to muHızlı Kontrol
R'de SVD, QR ve Cholesky ayrıştırmalarını anlayıp anlamadığınızı test edin.
Özet: SVD, QR ve Cholesky
Temel çıkarımlar: SVD (svd()) d, u ve v döndürür — PCA, rank, sözde ters ve düşük ranklı yaklaşım için kullanılır. QR (qr()) ortogonal bir Q ve üst üçgensel bir R döndürür — regresyon ve kararlılık için kullanılır. Cholesky (chol()), A = t(U)%*%U olacak şekilde üst üçgensel U döndürür — SPD sistemleri için en hızlı yöntemdir. Hepsi A'yı tam olarak yeniden oluşturur ve farklı hesaplama amaçlarına hizmet eder.
A <- matrix(c(4, 2, 2, 3), nrow = 2)
# SVD
res <- svd(A)
all.equal(A, res$u %*% diag(res$d) %*% t(res$v)) # TRUE
# QR (on a design matrix)
X <- cbind(1, c(1,2,3,4,5))
qr_res <- qr(X)
all.equal(X, qr.Q(qr_res) %*% qr.R(qr_res)) # TRUE
# Cholesky
U <- chol(A)
all.equal(A, t(U) %*% U) # TRUE
# Use cases:
# svd() -> PCA, rank, pseudoinverse
# qr() -> regression, stability
# chol()-> SPD solve, MVN samplingSıkça Sorulan Sorular
“SVD, QR ve Cholesky Ayrışımları” dersi ücretsiz mi?
Evet — “SVD, QR ve Cholesky Ayrışımları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve R Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. R Academy kursu toplamda 4 dersten oluşur.
“SVD, QR ve Cholesky Ayrışımları” dersinde ne öğreneceğim?
Boyut indirgeme ve çarpanlara ayırma için svd(), qr() ve chol() işlevlerini uygulayın. R Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
R Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te R Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“SVD, QR ve Cholesky Ayrışımları” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu R Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her R Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Matris Çarpımı ve Determinantlar
- solve() ile Doğrusal Sistemleri Çözme
- Özdeğerler ve Özvektörler
- SVD, QR ve Cholesky Ayrışımları