0Pricing
R Academy · Lektion

SVD-, QR- und Cholesky-Zerlegungen

Wenden Sie svd(), qr() und chol() zur Dimensionsreduktion und Faktorisierung an

SVD-, QR- und Cholesky-Zerlegungen ist eine kostenlose R Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des R Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum Matrixzerlegungen?

Matrixzerlegungen faktorisieren A in Produkte einfacherer Matrizen. Sie machen verborgene Strukturen (Rang, Kondition) sichtbar, ermöglichen effiziente Berechnungen und bilden das Fundament von PCA, Regression und Optimierung in Statistik und maschinellem Lernen.

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

Die Singulärwertzerlegung (SVD) faktorisiert jede m×n-Matrix als A = U D V', wobei U und V orthogonal sind und D diagonal ist und nichtnegative Singulärwerte in absteigender Reihenfolge enthält.

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-Rekonstruktion

Rekonstruieren Sie A aus der SVD als A = U %*% diag(d) %*% t(V). Approximationen niedrigen Rangs behalten nur die k größten Singulärwerte und -vektoren — dies bildet die Grundlage für Bildkompression und Rauschreduzierung.

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: Pseudoinverse und Rang

Die SVD liefert die Pseudoinverse A⁺ = V D⁺ U', wobei D⁺ jeden von null verschiedenen Singulärwert durch seinen Kehrwert ersetzt. Damit lässt sich Ax = b im Sinne der kleinsten Quadrate lösen, auch wenn A nicht quadratisch ist oder keinen vollen Rang besitzt.

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-Zerlegung: qr()

Die QR-Zerlegung faktorisiert A = QR, wobei Q orthogonal ist (Q'Q = I) und R eine obere Dreiecksmatrix ist. Sie wird bei der linearen Regression, zur Berechnung von Eigenwerten (QR-Algorithmus) und bei der Gram-Schmidt-Orthogonalisierung verwendet.

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

QR für Regression

Das Lösen der Normalgleichungen der linearen Regression mittels QR ist numerisch überlegen. Da Q'Q = I gilt, werden die Normalgleichungen A'Ax = A'b zu R'Q'QRx = R'Q'b und vereinfachen sich zu Rx = Q'b, das durch Rückwärtssubstitution gelöst wird.

# 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-Zerlegung: chol()

Die Cholesky-Zerlegung faktorisiert eine symmetrisch positiv definite Matrix als A = L L', wobei L eine untere Dreiecksmatrix ist. R's chol() gibt den oberen Dreiecksfaktor U zurück (also 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)
)

Mit Cholesky lösen

Für symmetrisch positiv definite Systeme (etwa Kovarianzmatrizen) ist das Lösen mithilfe der Cholesky-Zerlegung doppelt so schnell wie mit LU. Verwenden Sie chol2inv(), um die Inverse zu berechnen, oder backsolve/forwardsolve mit dem Cholesky-Faktor.

# 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 in PCA

PCA mittels SVD: Zentrieren Sie die Datenmatrix X und berechnen Sie anschließend die SVD der zentrierten Matrix X. Die rechten Singulärvektoren V sind die Richtungen der Hauptkomponenten; die Singulärwerte d hängen mit der erklärten Varianz zusammen (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))

Matrixrang mittels SVD

Der Rang einer Matrix entspricht der Anzahl nicht vernachlässigbarer Singulärwerte. Die SVD bietet die numerisch zuverlässig­ste Möglichkeit, den Rang zu bestimmen — zählen Sie einfach die d-Werte oberhalb eines Schwellenwerts (typischerweise 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

Cholesky zur Erzeugung multivariat normalverteilter Stichproben

Um aus einer multivariaten Normalverteilung N(μ, Σ) zu ziehen, berechnen Sie den Cholesky-Faktor U von Σ und transformieren Sie anschließend standardnormalverteilte Werte: X = μ + Z %*% U. So arbeitet MASS::mvrnorm() intern.

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

Kurzer Test

Testen Sie Ihr Verständnis von SVD-, QR- und Cholesky-Zerlegungen in R.

Zusammenfassung: SVD, QR und Cholesky

Wichtigste Erkenntnisse: SVD (svd()) gibt d, u, v zurück — für PCA, Rangbestimmung, Pseudoinverse und Approximationen niedrigen Rangs. QR (qr()) gibt eine orthogonale Matrix Q und eine obere Dreiecksmatrix R zurück — für Regression und Stabilität. Cholesky (chol()) gibt die obere Dreiecksmatrix U zurück, für die A = t(U)%*%U gilt — am schnellsten bei positiv definiten Systemen. Alle rekonstruieren A exakt und dienen unterschiedlichen Berechnungszwecken.

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

Häufig gestellte Fragen

Ist die Lektion „SVD-, QR- und Cholesky-Zerlegungen“ kostenlos?

Ja — der vollständige Text von „SVD-, QR- und Cholesky-Zerlegungen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des R Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „SVD-, QR- und Cholesky-Zerlegungen“?

Wenden Sie svd(), qr() und chol() zur Dimensionsreduktion und Faktorisierung an Du übst R Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um R Academy zu starten?

Keine Vorkenntnisse erforderlich. R Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „SVD-, QR- und Cholesky-Zerlegungen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser R Academy-Lektion Code schreiben und ausführen?

Ja. Jede R Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Matrixmultiplikation und Determinanten
  2. Lineare Gleichungssysteme mit solve() lösen
  3. Eigenwerte und Eigenvektoren
  4. SVD-, QR- und Cholesky-Zerlegungen
← Zurück zu R Academy