การแยกเมทริกซ์ SVD, QR และ Cholesky
ใช้ svd(), qr() และ chol() เพื่อลดมิติและแยกตัวประกอบ
การแยกเมทริกซ์ SVD, QR และ Cholesky เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงต้องแยกเมทริกซ์
การแยกเมทริกซ์จะแยก A ออกเป็นผลคูณของเมทริกซ์ที่ง่ายกว่า ช่วยเผยโครงสร้างที่ซ่อนอยู่ (อันดับ, สภาพของระบบ) ทำให้คำนวณได้อย่างมีประสิทธิภาพ และเป็นพื้นฐานของ PCA การถดถอย และการหาค่าเหมาะที่สุดในสถิติและการเรียนรู้ของเครื่อง
# 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()
การแยกค่าเอกฐาน (SVD) แยกเมทริกซ์ A ขนาด m×n ใด ๆ เป็น A = U D V' โดย U และ V เป็นเมทริกซ์ตั้งฉาก และ D เป็นเมทริกซ์แนวทแยงที่มีค่าเอกฐานไม่เป็นลบและเรียงจากมากไปน้อย
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
สร้าง A กลับจาก SVD ด้วย A = U %*% diag(d) %*% t(V) การประมาณค่าแบบอันดับต่ำจะเก็บไว้เฉพาะค่าเอกฐานและเวกเตอร์เอกฐาน k อันดับแรก ซึ่งเป็นพื้นฐานของการบีบอัดภาพและการลดสัญญาณรบกวน
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: เมทริกซ์ผกผันเสมือนและอันดับ
SVD ให้เมทริกซ์ผกผันเสมือน A⁺ = V D⁺ U' โดย D⁺ แทนที่ค่าเอกฐานที่ไม่เป็นศูนย์แต่ละค่าด้วยส่วนกลับ วิธีนี้แก้ Ax = b ในความหมายของกำลังสองน้อยที่สุดได้ แม้ A จะไม่ใช่เมทริกซ์จัตุรัสหรือมีอันดับไม่เต็ม
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 resultการแยกเมทริกซ์ QR: qr()
การแยกเมทริกซ์ QR แยก A = QR โดย Q เป็นเมทริกซ์ตั้งฉาก (Q'Q = I) และ R เป็นเมทริกซ์สามเหลี่ยมบน ใช้ในการถดถอยเชิงเส้น การคำนวณค่าไอเกน (ขั้นตอนวิธี QR) และการทำให้ตั้งฉากแบบแกรม–ชมิดต์
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) # TRUEQR สำหรับการถดถอย
การแก้สมการปกติของการถดถอยเชิงเส้นด้วย QR มีความเหนือกว่าในเชิงตัวเลข เนื่องจาก Q'Q = I สมการปกติ A'Ax = A'b จึงกลายเป็น R'Q'QRx = R'Q'b และลดรูปเป็น Rx = Q'b ซึ่งแก้ได้ด้วยการแทนค่าจากด้านหลัง
# 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')การแยกเมทริกซ์โชเลสกี: chol()
การแยกแบบโชเลสกีแยกเมทริกซ์สมมาตรกำหนดบวก A = L L' โดย L เป็นเมทริกซ์สามเหลี่ยมล่าง ส่วน chol() ของ R คืนตัวประกอบสามเหลี่ยมบน U (ดังนั้น 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)
)การแก้ระบบด้วยโชเลสกี
สำหรับระบบสมมาตรกำหนดบวก (เช่น เมทริกซ์ความแปรปรวนร่วม) การแก้ระบบโดยใช้โชเลสกีเร็วกว่า LU สองเท่า ใช้ chol2inv() เพื่อคำนวณเมทริกซ์ผกผัน หรือใช้ backsolve/forwardsolve ร่วมกับตัวประกอบโชเลสกี
# 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))SVD ใน PCA
PCA ด้วย SVD: จัดข้อมูลในเมทริกซ์ X ให้อยู่กึ่งกลาง จากนั้นคำนวณ SVD ของ X ที่จัดกึ่งกลางแล้ว เวกเตอร์เอกฐานด้านขวา V คือทิศทางขององค์ประกอบหลัก ส่วนค่าเอกฐาน d สัมพันธ์กับความแปรปรวนที่อธิบายได้ (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
อันดับของเมทริกซ์เท่ากับจำนวนค่าเอกฐานที่ไม่เล็กจนถือว่าเป็นศูนย์ SVD เป็นวิธีที่น่าเชื่อถือทางตัวเลขมากที่สุดในการหาอันดับ เพียงนับค่า d ที่สูงกว่าเกณฑ์ (โดยทั่วไปคือ max(d) * tol)
# 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โชเลสกีสำหรับการสุ่มตัวอย่างปกติหลายตัวแปร
หากต้องการสุ่มตัวอย่างจากการแจกแจงปกติหลายตัวแปร N(μ, Σ) ให้คำนวณตัวประกอบโชเลสกี U ของ Σ แล้วแปลงค่าปกติมาตรฐาน: X = μ + Z %*% U วิธีนี้เป็นวิธีที่ MASS::mvrnorm() ใช้ภายใน
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 muตรวจสอบอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับการแยกเมทริกซ์ SVD, QR และโชเลสกีใน R
สรุป: SVD, QR และโชเลสกี
ประเด็นสำคัญ: SVD (svd()) คืนค่า d, u, v — ใช้สำหรับ PCA การหาอันดับ เมทริกซ์ผกผันเสมือน และการประมาณค่าแบบอันดับต่ำ QR (qr()) คืนค่า Q ที่ตั้งฉากและ R ที่เป็นสามเหลี่ยมบน — ใช้สำหรับการถดถอยและเสถียรภาพ โชเลสกี (chol()) คืนค่า U ที่เป็นสามเหลี่ยมบน โดย A = t(U)%*%U — เร็วที่สุดสำหรับระบบ SPD ทั้งหมดสามารถสร้าง A กลับคืนได้อย่างแม่นยำ และแต่ละวิธีเหมาะกับจุดประสงค์ด้านการคำนวณที่แตกต่างกัน
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 samplingคำถามที่พบบ่อย
บทเรียน “การแยกเมทริกซ์ SVD, QR และ Cholesky” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การแยกเมทริกซ์ SVD, QR และ Cholesky” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การแยกเมทริกซ์ SVD, QR และ Cholesky”
ใช้ svd(), qr() และ chol() เพื่อลดมิติและแยกตัวประกอบ คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การแยกเมทริกซ์ SVD, QR และ Cholesky” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม
ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การคูณเมทริกซ์และดีเทอร์มิแนนต์
- การแก้ระบบสมการเชิงเส้นด้วย solve()
- ค่าเอกลักษณ์และเวกเตอร์เอกลักษณ์
- การแยกเมทริกซ์ SVD, QR และ Cholesky