0Pricing
R Academy · درس

تحليلات SVD وQR وتشولسكي

طبّق svd() وqr() وchol() لتقليل الأبعاد والتحليل إلى عوامل

تحليلات SVD وQR وتشولسكي درس مجاني في R Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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) أي مصفوفة 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)، وإجراء تعامد Gram-Schmidt.

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 للانحدار

يتميز حل المعادلات الطبيعية للانحدار الخطي باستخدام 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، وهو الأسرع للأنظمة الموجبة التعيين المتماثلة. وتعطي جميع هذه التحليلات إعادة بناء دقيقة لـ 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 وتشولسكي» مجاني؟

نعم — نص درس «تحليلات SVD وQR وتشولسكي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.

ماذا ستتعلم في «تحليلات SVD وQR وتشولسكي»؟

طبّق svd() وqr() وchol() لتقليل الأبعاد والتحليل إلى عوامل تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟

لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «تحليلات SVD وQR وتشولسكي»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟

نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ضرب المصفوفات والمحددات
  2. حل الأنظمة الخطية باستخدام solve()
  3. القيم الذاتية والمتجهات الذاتية
  4. تحليلات SVD وQR وتشولسكي
← العودة إلى R Academy