Pandas & NumPy Academy · درس

نظرة عامة على القيم الذاتية وSVD

احسب القيم والمتجهات الذاتية باستخدام np.linalg.eig، وافهم كيف يشكّل SVD أساس تقليل الأبعاد باستخدام PCA

الدرس 4 من 413 خطوة

نظرة عامة على القيم الذاتية وSVD درس مجاني في Pandas & NumPy Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Pandas & NumPy Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.

ما القيم الذاتية والمتجهات الذاتية؟

المتجه الذاتي لمصفوفة مربعة A هو متجه غير صفري v يحقق A @ v = lambda * v — أي إن الضرب في A لا يغيّر اتجاه v، بل يغيّر مقياسه فقط. ويُسمّى العدد scalar lambda القيمة الذاتية الموافقة لـ v. تكشف القيم الذاتية عن «عوامل التمديد» الجوهرية لتحويل خطي: فالقيمة الذاتية 2 تعني أن المصفوفة تضاعف الأطوال في اتجاه المتجه الذاتي، بينما تقلب القيمة الذاتية السالبة الاتجاه.

import numpy as np

A = np.array([[3.0, 1.0],
              [0.0, 2.0]])

eigenvalues, eigenvectors = np.linalg.eig(A)
print('Eigenvalues:', eigenvalues)
print('Eigenvectors (columns):')
print(eigenvectors)

حساب القيم الذاتية باستخدام np.linalg.eig()

تعيد np.linalg.eig(A) صفًا من الشكل (eigenvalues, eigenvectors). وتكون القيم الذاتية في مصفوفة أحادية البعد، أما المتجهات الذاتية فتكون في مصفوفة ثنائية الأبعاد، بحيث يكون كل عمود متجهًا ذاتيًا. بالنسبة إلى المصفوفات الحقيقية المتماثلة، مثل مصفوفات التغاير، تكون القيم الذاتية حقيقية دائمًا، وتكون المتجهات الذاتية متعامدة — استخدموا np.linalg.eigh(A) للمصفوفات المتماثلة لأنه أسرع ويضمن إرجاع نتائج حقيقية.

import numpy as np

# Symmetric matrix -> use eigh for efficiency and real eigenvalues
A = np.array([[4.0, 2.0],
              [2.0, 3.0]])

vals, vecs = np.linalg.eigh(A)
print('Eigenvalues (real):', vals)
print('Eigenvectors (orthonormal columns):')
print(vecs)

# Verify: A @ v = lambda * v for each eigenvector
for i in range(len(vals)):
    lhs = A @ vecs[:, i]
    rhs = vals[i] * vecs[:, i]
    print(f'v{i} check:', np.allclose(lhs, rhs))

القيم الذاتية وخصائص المصفوفات

تعبّر القيم الذاتية عن خصائص مهمة للمصفوفة. يساوي المحدد حاصل ضرب جميع القيم الذاتية: det(A) = product(eigenvalues). ويساوي الأثر، أي مجموع عناصر القطر، مجموع القيم الذاتية: trace(A) = sum(eigenvalues). وتكون المصفوفة موجبة التعريف، أي تكون جميع قيمها الذاتية أكبر من 0، إذا وفقط إذا كانت جميع القيم الذاتية موجبة — وهذه خاصية أساسية لمصفوفات التغاير الصحيحة ولمسائل التحسين المحدب.

import numpy as np

A = np.array([[4.0, 2.0],
              [2.0, 3.0]])

vals, _ = np.linalg.eigh(A)
print('Eigenvalues:', vals)
print('Product (should = det):', np.prod(vals))
print('np.linalg.det:', np.linalg.det(A))
print('Sum (should = trace):', np.sum(vals))
print('np.trace:', np.trace(A))
print('Positive definite:', np.all(vals > 0))

نظرة عامة على تحليل القيم المفردة (SVD)

يحلّل تحليل القيم المفردة (SVD) أي مصفوفة A، وليس المصفوفات المربعة فقط، إلى الصورة A = U @ S @ V.T، حيث إن U وV مصفوفتان متعامدتان، وS مصفوفة قطرية تحتوي على قيم مفردة غير سالبة على قطرها. ويُعد SVD أكثر تحليلات المصفوفات عمومية واستقرارًا عدديًا. وهو أساس PCA وضغط الصور وأنظمة التوصية وحساب المعكوس الكاذب. تعيد np.linalg.svd(A) القيم U وs، وهي القيم المفردة في مصفوفة أحادية البعد، وVh، أي منقول V.

import numpy as np

A = np.array([[1.0, 2.0, 3.0],
              [4.0, 5.0, 6.0]])

U, s, Vh = np.linalg.svd(A, full_matrices=False)
print('U shape:', U.shape)
print('s (singular values):', s)
print('Vh shape:', Vh.shape)

# Reconstruct A
A_reconstructed = U @ np.diag(s) @ Vh
print('Reconstruction correct:', np.allclose(A, A_reconstructed))

القيم المفردة ورتبة المصفوفة

تكون القيم المفردة، الموجودة على قطر S، غير سالبة دائمًا، وتُرتّب تقليديًا ترتيبًا تنازليًا. ويساوي عدد القيم المفردة غير الصفرية رتبة المصفوفة. وتشير القيم المفردة القريبة من الصفر إلى شبه اعتماد خطي بين الصفوف أو الأعمدة. وتعطي أكبر قيمة مفردة المعيار الطيفي للمصفوفة، بينما تكون نسبة أكبر قيمة مفردة إلى أصغر قيمة مفردة غير صفرية هي عدد الشرط المستخدم لقياس الاستقرار العددي.

import numpy as np

# Full-rank matrix
A = np.random.rand(5, 3)
U, s, Vh = np.linalg.svd(A, full_matrices=False)
print('Singular values:', np.round(s, 4))
print('Rank (non-zero sv):', np.linalg.matrix_rank(A))
print('Condition number:', s[0] / s[-1])

# Rank-deficient matrix
B = np.array([[1.0, 2.0], [2.0, 4.0], [3.0, 6.0]])
_, sb, _ = np.linalg.svd(B, full_matrices=False)
print('Rank-deficient sv:', np.round(sb, 8))

SVD وPCA: الصلة بينهما

يمكن تنفيذ تحليل المكونات الرئيسية (PCA) مباشرةً باستخدام SVD. بعد توسيط مصفوفة البيانات X، أي طرح متوسطات الأعمدة، تكون المتجهات المفردة اليمنى في Vh هي المكونات الرئيسية، وتكون مربعات القيم المفردة مقسومة على n-1 هي التباينات المفسَّرة. ويستخدم Sklearn هذا الأسلوب نفسه تمامًا. يتيح لكم فهم هذه الصلة تنفيذ PCA أو تخصيصه من الصفر لتقليل الأبعاد.

import numpy as np

np.random.seed(0)
X = np.random.randn(100, 4)

# Center the data
X_centered = X - X.mean(axis=0)

# SVD-based PCA
U, s, Vh = np.linalg.svd(X_centered, full_matrices=False)

# Variance explained by each component
var_explained = (s ** 2) / (X.shape[0] - 1)
total_var = var_explained.sum()
print('Variance explained ratio:', np.round(var_explained / total_var, 3))

# Project onto top 2 principal components
X_pca = X_centered @ Vh[:2].T
print('Reduced shape:', X_pca.shape)

التقريب منخفض الرتبة باستخدام SVD

يتيح SVD إجراء تقريب منخفض الرتبة للمصفوفة: إذ تحتفظون بأكبر k من القيم والمتجهات المفردة، ثم تعيدون بناء تقريب للمصفوفة الأصلية. وهذا هو الأساس لضغط الصور والترشيح التعاوني في أنظمة التوصية. ويعطي SVD المبتور U[:, :k] @ np.diag(s[:k]) @ Vh[:k, :] أفضل تقريب من الرتبة k وفق معيار المربعات الصغرى، وذلك بحسب مبرهنة إيكارت-يونغ.

import numpy as np

np.random.seed(1)
A = np.random.rand(20, 15)

U, s, Vh = np.linalg.svd(A, full_matrices=False)

# Rank-3 approximation
k = 3
A_approx = U[:, :k] @ np.diag(s[:k]) @ Vh[:k, :]

error = np.linalg.norm(A - A_approx, 'fro')
total = np.linalg.norm(A, 'fro')
print(f'Approximation error: {error/total:.3f} (fraction of total)')
print(f'Top-3 singular values capture {(s[:3]**2).sum()/(s**2).sum():.1%} of variance')

التحليل الذاتي مقابل SVD: متى نستخدم كلًّا منهما؟

استخدموا التحليل الذاتي (np.linalg.eig أو eigh) عندما تكون لديكم مصفوفة مربعة متماثلة وترغبون في فهم محاورها الرئيسية — مثل مصفوفة التغاير في PCA أو مصفوفات انتقال ماركوف. واستخدموا SVD (np.linalg.svd) عندما تكون المصفوفة مستطيلة أو عندما تحتاجون إلى أقصى قدر من الاستقرار العددي. يوجد SVD دائمًا، بينما قد ينتج التحليل الذاتي أعدادًا مركبة للمصفوفات غير المتماثلة.

import numpy as np

# Non-symmetric matrix: eigenvalues may be complex
A = np.array([[0.0, -1.0],
              [1.0,  0.0]])
vals, _ = np.linalg.eig(A)
print('Eigenvalues (complex for rotation):', vals)

# SVD always gives real singular values
_, s, _ = np.linalg.svd(A)
print('Singular values (always real):', s)

المبرهنة الطيفية للمصفوفات المتماثلة

تنص المبرهنة الطيفية على إمكانية تحليل كل مصفوفة حقيقية متماثلة A إلى الصورة A = Q @ diag(eigenvalues) @ Q.T، حيث Q متعامدة، أي Q.T = Q⁻¹. وهذا يعني أن المصفوفات المتماثلة قابلة دائمًا للتحويل إلى صورة قطرية بقيم ذاتية حقيقية ومتجهات ذاتية متعامدة. وتكون مصفوفات التغاير ومصفوفات النواة في SVMs ومصفوفة هسيان في مسائل التحسين متماثلة جميعًا، ما يجعل هذه المبرهنة مفيدة على نحو عام في نظرية تعلّم الآلة.

import numpy as np

A = np.array([[5.0, 2.0, 1.0],
              [2.0, 3.0, 0.0],
              [1.0, 0.0, 4.0]])

vals, Q = np.linalg.eigh(A)
print('Eigenvalues:', np.round(vals, 4))

# Reconstruct A = Q @ diag(vals) @ Q.T
A_reconstructed = Q @ np.diag(vals) @ Q.T
print('Reconstruction correct:', np.allclose(A, A_reconstructed))
print('Q is orthogonal:', np.allclose(Q.T @ Q, np.eye(3)))

عملي: التكرار بالقوة لإيجاد أكبر قيمة ذاتية

عندما تحتاجون فقط إلى أكبر قيمة ذاتية ومتجهها الذاتي، يكون التكرار بالقوة أكثر كفاءة بكثير من حساب جميع القيم الذاتية. ابدؤوا بمتجه عشوائي، واضربوه مرارًا في A مع تطبيـع الناتج، وسيتقارب إلى المتجه الذاتي السائد. هكذا عملت خوارزمية PageRank الأصلية من Google. ويجعل NumPy كل تكرار عملية ضرب واحدة لمصفوفة في متجه باستخدام @.

import numpy as np

A = np.array([[4.0, 1.0, 2.0],
              [1.0, 3.0, 0.0],
              [2.0, 0.0, 2.0]])

v = np.random.rand(3)
for _ in range(50):
    v = A @ v
    v = v / np.linalg.norm(v)

eigenvalue_approx = v @ A @ v
print('Dominant eigenvector:', np.round(v, 4))
print('Approx eigenvalue:', round(eigenvalue_approx, 4))

# Verify with eigh
vals, vecs = np.linalg.eigh(A)
print('True max eigenvalue:', round(vals[-1], 4))

استخدام np.linalg.svd في مسارات البيانات الفعلية

يُستخدم SVD في مسارات البيانات الفعلية من أجل تقليل الضوضاء وضغط البيانات. بعد تدريب SVD على بيانات التدريب، تحتفظون فقط بأعلى k من المكونات التي تفسّر 95% من التباين. ويقلل ذلك أبعاد البيانات الجديدة قبل تمريرها إلى مصنّف أو نموذج انحدار، مما يسرّع التدريب وغالبًا ما يحسّن قابلية التعميم بإزالة الأبعاد المشوشة. احرصوا دائمًا على تدريب SVD باستخدام بيانات التدريب فقط، ثم طبّقوا التحويل نفسه على بيانات الاختبار.

import numpy as np

np.random.seed(7)
X_train = np.random.randn(200, 50)
X_test = np.random.randn(40, 50)

# Fit on training data
X_mean = X_train.mean(axis=0)
X_centered = X_train - X_mean
U, s, Vh = np.linalg.svd(X_centered, full_matrices=False)

# Choose k to capture 90% variance
cumvar = np.cumsum(s**2) / (s**2).sum()
k = np.searchsorted(cumvar, 0.9) + 1
print(f'Components to capture 90% variance: {k}')

# Transform test data using the same Vh
X_test_reduced = (X_test - X_mean) @ Vh[:k].T
print('Reduced test shape:', X_test_reduced.shape)

تحقق سريع

اختبروا مدى فهمكم لمفاهيم تحليل البيانات الواردة في هذا الدرس.

مراجعة الدرس

تعلمتم في هذا الدرس أن: np.linalg.eig()/eigh() يحسبان القيم والمتجهات الذاتية التي تكشف اتجاهات التمديد الجوهرية للمصفوفة، وأن np.linalg.svd() يحلّل أي مصفوفة إلى U والقيم المفردة وVh، مما يتيح PCA والتقريب منخفض الرتبة، وأن القيم المفردة تقيس التباين الذي يلتقطه كل مكوّن وتحدد رتبة المصفوفة. بعد ذلك، سنتناول التعامل مع مجموعات البيانات الكبيرة من خلال قراءة ملفات CSV على دفعات.

البدء مجانًا

تعلم Python مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
30
الدروس
120

الأسئلة الشائعة

هل درس «نظرة عامة على القيم الذاتية وSVD» مجاني؟

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

ماذا ستتعلم في «نظرة عامة على القيم الذاتية وSVD»؟

احسب القيم والمتجهات الذاتية باستخدام np.linalg.eig، وافهم كيف يشكّل SVD أساس تقليل الأبعاد باستخدام PCA تتمرن على Pandas & NumPy Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «نظرة عامة على القيم الذاتية وSVD»؟

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

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

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

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

  1. ضرب المصفوفات باستخدام np.matmul و@
  2. المحددات والمعكوسات والمنقولات
  3. حل الأنظمة الخطية
  4. نظرة عامة على القيم الذاتية وSVD
← العودة إلى Pandas & NumPy Academy