تحليل المكونات الرئيسية وتخفيض الأبعاد
“إيجاد اتجاهات التباين الأقصى — ضغط المعلومات دون فقدانها”
تحليل المكونات الرئيسية من الصفر: التحليل الطيفي لمصفوفة التباين والتباين المُفسَّر واختيار المكونات ومقارنة t-SNE/UMAP.
المتطلبات الأساسية
المفاهيم المغطاة
∑الصيغ الرئيسية
التحلل الذاتي للتباين المشترك
تتحلل مصفوفة التباين المشترك إلى متجهات ذاتية V وقيم ذاتية Λ
إسقاط ACP
إسقاط البيانات الموسَّطة على أعلى k متجهات ذاتية — تمثيل k-بُعدي
التباين المُفسَّر
نسبة التباين الكلي الملتقَط بالمكوّن الرئيسي k
إعادة بناء ACP
إعادة بناء تقريب x من الرمز z منخفض الأبعاد — يقيس فقدان المعلومات
▶محاكاة تفاعلية
لعنة الأبعاد
مع 1000 ميزة، كل زوج من النقاط يكون شبه متساوي المسافة (ظاهرة 'تركيز القياس'). تنهار الخوارزميات القائمة على المسافة. تصوير البيانات عالية الأبعاد مستحيل. يستغرق التدريب وقتاً طويلاً والنماذج تُفرط في التعلم. تحل ACP هذا بإيجاد فضاء جزئي منخفض الأبعاد يلتقط معظم التباين — يُزيل الضوضاء ويُزيل ترابط الميزات ويُتيح التصور. صورة بـ10,000 بكسل غالباً تُضغط إلى 50 مكوناً ACP مع أقل من 5% خطأ إعادة بناء.
نتيجة 'فضاء الوجوه' الشهيرة: صور الوجوه البشرية تعيش في فضاء جزئي بـ~50 بُعداً ضمن فضاء من 50,000 بكسل. تجد ACP هذا الفضاء الجزئي.
المنظور الهندسي
تخيّل سحابة من النقاط تبدو كإهليلج ممتد. تجد ACP أطول محور للإهليلج (CP1 — اتجاه الحد الأقصى للتباين)، ثم المحور العمودي الأطول التالي (CP2)، وهكذا. بالإسقاط على المكونات الرئيسية الأولى، نحتفظ بالأبعاد الأكثر 'انتشاراً' ونتجاهل المتضامة (عادةً ضوضاء). المكونات الرئيسية هي المتجهات الذاتية لمصفوفة تباين البيانات، مرتبةً بقيمها الذاتية (= التباين في كل اتجاه).
التحلل الذاتي لمصفوفة التباين
توسيط البيانات: X̃ = X - μ. حساب مصفوفة التباين p×p Σ = (1/n)X̃ᵀX̃. التحليل الطيفي: Σ = VΛVᵀ حيث V متعامدة معيارية وΛ قطرية بقيم ذاتية λ₁≥λ₂≥…≥λₚ. المتجه الذاتي الأول v₁ هو اتجاه أقصى تباين. عملياً، يستخدم scikit-learn SVD مباشرةً على X̃ (أكثر استقراراً عددياً).
اختيار عدد المكونات
ارسم نسبة التباين التراكمي المُفسَّر. ترتفع المنحنى بسرعة أولاً ثم تتسطح. اختر k حيث تصل إلى 90-95% تباين تراكمي — هذا هو 'الكوع'. بديلاً، استخدم ACP كمعالجة مسبقة لنموذج لاحق: اضبط k كمعامل فائق بالتحقق المتقاطع. للتصور، استخدم دائماً k=2 أو k=3 بصرف النظر عن التباين المُفسَّر.
حساب explained_variance_ratio_ لكل مكوّن
رسم المجموع التراكمي — إيجاد k حيث cumsum ≥ 0.95
للتبييض (إزالة الترابط + تباين وحدوي): تعيين whiten=True
للمجموعات الكبيرة: استخدام IncrementalPCA (ميني-دفعة) أو TruncatedSVD (متفرق)
لا تطبق ACP قبل تقسيم التدريب/الاختبار — اضبط على بيانات التدريب فقط
خوارزمية ACP
توسيط البيانات: X̃ = X - mean(X, axis=0)
حساب SVD: X̃ = UΣVᵀ (مكافئ: التحليل الطيفي لـX̃ᵀX̃)
ترتيب المتجهات الذاتية بالقيم الذاتية تنازلياً
اختيار أعلى k متجهات ذاتية: V_k = V[:, :k]
الإسقاط: Z = X̃ @ V_k → تمثيل k-بُعدي
إعادة البناء: X̂ = Z @ V_k.T + mean → قياس خطأ إعادة البناء
ACP مع scikit-learn
from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split import numpy as np import matplotlib.pyplot as plt class="tok-comment"># ── Sample data ──────────────────────────────────────────────────────── X_raw, y = make_classification(n_samples=class="tok-num">400, n_features=class="tok-num">20, n_informative=class="tok-num">8, random_state=class="tok-num">42) X_train, X_test, _, _ = train_test_split(X_raw, y, test_size=class="tok-num">0.2, random_state=class="tok-num">42) class="tok-comment"># ── Fit PCA ──────────────────────────────────────────────────────── scaler = StandardScaler() X_scaled = scaler.fit_transform(X_train) class="tok-comment"># Fit full PCA first to inspect variance pca_full = PCA().fit(X_scaled) cumvar = np.cumsum(pca_full.explained_variance_ratio_) k = np.argmax(cumvar >= class="tok-num">0.95) + class="tok-num">1 print(fclass="tok-str">"{k} components explain ≥class="tok-num">95% variance") class="tok-comment"># Final PCA with chosen k pca = PCA(n_components=k, random_state=class="tok-num">42) X_pca = pca.fit_transform(X_scaled) class="tok-comment"># fit on train only X_test_pca = pca.transform(scaler.transform(X_test)) class="tok-comment"># ── Reconstruction error ─────────────────────────────────────────── X_reconstructed = pca.inverse_transform(X_pca) recon_err = np.mean((X_scaled - X_reconstructed)**class="tok-num">2) print(fclass="tok-str">"Reconstruction MSE: {recon_err:.4f}") class="tok-comment"># ── 2D visualisation ─────────────────────────────────────────────── pca2 = PCA(n_components=class="tok-num">2) X_2d = pca2.fit_transform(X_scaled) plt.scatter(X_2d[:,class="tok-num">0], X_2d[:,class="tok-num">1], c=y, cmap=class="tok-str">'viridis', alpha=class="tok-num">0.7) plt.xlabel(fclass="tok-str">"PC1 ({pca2.explained_variance_ratio_[class="tok-num">0]:.class="tok-num">1%})") plt.ylabel(fclass="tok-str">"PC2 ({pca2.explained_variance_ratio_[class="tok-num">1]:.class="tok-num">1%})")
مزالق ACP
ACP طريقة خطية — لا تلتقط التشعبات غير الخطية. استخدم t-SNE أو UMAP لتقليل الأبعاد غير الخطي عند تصور البنى المعقدة. أيضاً: تُعظِّم ACP التباين لا التمييز — للتصنيف، غالباً تعطي التحليل التمييزي الخطي (LDA) فصلاً أفضل. أخيراً: المكونات الرئيسية غالباً غير قابلة للتفسير. إذا احتجت ميزات قابلة للتفسير، فضِّل ACP المتفرقة أو اختيار الميزات.
لا تضبط ACP على مجموعة البيانات الكاملة — اضبط على بيانات التدريب فقط وطبّق نفس التحويل على بيانات الاختبار. الضبط على المجموعة الكاملة يُسرِّب إحصائيات الاختبار إلى التدريب.
?اختبار المعرفة
يتم حفظ التقدم في متصفحك — لا حاجة لحساب.