قراية
وضع الحكايات

الـ dimensionality reduction (تقليل الأبعاد)

~20 دقيقة قراية الدرس 3 من 3 في الوحدة 5

لعنة الأبعاد

البيانات اللي أبعادها عالية خدّاعة. dataset فيها ألف feature ممكن تبان مليانة معلومات، بس كل ما الأبعاد تزيد، حجم الفضاء بيكبر بسرعة رهيبة، والبيانات بتبقى متناثرة في كل حتة تقريبًا. ومقاييس المسافة بتفقد معناها — في الأبعاد العالية جدًا، الفرق بين أقرب نقطة وأبعد نقطة من أي نقطة بيقرّب من بعض، وده بيبوّظ البحث عن أقرب جيران والـ clustering. ودي الـ curse of dimensionality (لعنة الأبعاد).

والـ dimensionality reduction (تقليل الأبعاد) بيعالج المشكلة دي بإنه يعمل projection للبيانات من فضاء أبعاده عالية لتمثيل أبعاده أقل محافظ على أكبر قدر ممكن من البنية. والأهداف عملية: تدريب أسرع، وgeneralization أحسن، واستهلاك memory أقل، والأهم — إنك تقدر ترسم بيانات البني آدم مكانش هيقدر يشوفها بأي طريقة تانية.

فيه استراتيجيتين أساسيتين: الطرق الخطية اللي بتلاقي projections أبعادها قليلة عن طريق تحويلات خطية، والطرق غير الخطية اللي بتتعلّم الـ manifolds المنحنية اللي البيانات ماشية عليها. الـ principal component analysis (PCA) هو الطريقة الخطية الكلاسيكية؛ وt-SNE وUMAP هما الطريقتين غير الخطيتين المسيطرين.

الـ principal component analysis (PCA)

الـ PCA (تحليل المكونات الرئيسية) بيلاقي الاتجاهات اللي فيها أكبر variance في البيانات ويعمل projection للبيانات عليها. كل اتجاه هو principal component (مكوّن رئيسي) — محور متعامد في فضاء الـ features الأصلي. أول component بيمسك أكبر قدر من الـ variance، والتاني (المتعامد على الأول) بيمسك اللي بعده، وهكذا.

الـ principal components هي الـ eigenvectors (متجهات الأيغن) بتاعة الـ covariance matrix للبيانات، مترتّبة على حسب الـ eigenvalues بتاعتها. والـ eigenvalue بتاعة كل component بتقولك بيمسك variance قد إيه. وعشان تقلّل الأبعاد، بتحتفظ بأعلى k components بس وتعمل projection للبيانات على الـ subspace اللي أبعاده k.

الـ projection بتاع PCA
\mathbf{Z} = \mathbf{X}\mathbf{W}_k
matrix البيانات X (n عيّنة × d feature) بيتعملها projection على W_k، الـ matrix بتاعة أعلى k eigenvectors للـ covariance matrix C = (1/n) XᵀX. والناتج Z شكله n × k. واختيار k بحيث أول components يفسّروا ≥ 95% من الـ variance قاعدة تقريبية مشهورة.

الـ PCA بيتحسب عن طريق الـ singular value decomposition (SVD) (تحليل القيم المفردة) لـ matrix البيانات بعد ما تتعمل centering، وده أثبت عدديًا من إنك تكوّن الـ covariance matrix صراحةً. والنتيجة مظبوطة وحتمية.

نسبة الـ explained variance

ارسم نسبة الـ explained variance التراكمية وإنت بتزوّد principal components. المنحنى بيطلع جامد في الأول وبعدين بيفرد. اختار k عند "الكوع" — النقطة اللي الـ components الزيادة بعدها بتجيب فايدة بتقل. وللرسم، k = 2 أو k = 3 هو الهدف دايمًا.

الـ PCA أداة preprocessing قوية. بيشيل الـ features المترابطة، وبيقلّل الـ noise (الـ components اللي الـ eigenvalues بتاعتها صغيرة كتير بتمسك noise مش signal)، وبيسرّع الـ algorithms اللي بعده. وقيده الأساسي إنه خطي: مبيقدرش يمسك البنية المنحنية وغير الخطية في البيانات.

الـ t-SNE: رسم غير خطي

الـ t-SNE (t-distributed Stochastic Neighbor Embedding) بيمشي بطريقة مختلفة من الأساس. بيعمل modeling للتشابه بين النقط كاحتمالات — أزواج النقط اللي شبه بعض في الفضاء العالي الأبعاد لازم تفضل قريبة في الـ embedding اللي أبعاده قليلة؛ والنقط اللي مش شبه بعض بتتزق بعيد. وبعدين بيقلّل عدم التطابق بين توزيعات الاحتمال في الفضاءين.

في الفضاء العالي الأبعاد، الـ t-SNE بيستخدم Gaussian kernel عشان يعرّف توزيع احتمالي P على أزواج النقط على حسب مسافاتهم. وفي الـ embedding اللي أبعاده قليلة، بيستخدم توزيع Student-t ديله أتقل بدرجة حرية واحدة (توزيع كوشي). والديول التقيلة بتسمح إن النقط اللي على مسافة متوسطة تتبعد أكتر في الـ embedding، وده بيخفّف مشكلة الزحمة اللي بتصيب الطرق الـ Gaussian.

الـ cost function بتاعة t-SNE
C = \mathrm{KL}(P \| Q) = \sum_{i \neq j} p_{ij} \log \frac{p_{ij}}{q_{ij}}
الـ t-SNE بيقلّل الـ Kullback-Leibler divergence (تباعد كولباك-لايبلر) بين التوزيع الاحتمالي P في الفضاء العالي الأبعاد والتوزيع Q في الفضاء اللي أبعاده قليلة. والـ gradient descent (النزول التدرجي) بيحرّك نقط الـ embedding y_i عشان يقلّل الفرق ده، فبيشد النقط اللي شبه بعض لبعض ويزق اللي مش شبه بعض بعيد.
تفسير الـ t-SNE

الـ t-SNE للرسم بس — وعمره ما يتستخدم كـ preprocessing قبل algorithm تاني. مقياس المحاور مالوش معنى؛ ومبيتفسّرش غير انتماء الـ clusters. والمسافات بين الـ clusters مش محفوظة. شغّل t-SNE كذا مرة بـ random seeds مختلفة واستخدم initialization بالـ PCA عشان تضمن إن النتيجة تتكرّر. والـ parameter الـ perplexity (الحيرة) (عادةً 5–50) بيتحكم في العدد الفعلي للجيران اللي بيتحسبوا لكل نقطة.

الـ UMAP: أسرع وأمين أكتر

الـ UMAP (Uniform Manifold Approximation and Projection) طريقة أحدث مبنية على الهندسة الريمانية والطوبولوجيا الجبرية. زي t-SNE بيحافظ على البنية المحلية، بس أسرع بكتير، وبيكبر لـ datasets أكبر، وبيحافظ (على عكس t-SNE) على البنية العامة أحسن — الأماكن النسبية للـ clusters ليها معنى أكبر في رسم UMAP منها في t-SNE.

الـ UMAP بيبني تمثيل طوبولوجي fuzzy للبيانات العالية الأبعاد وبعدين بيحسّن embedding أبعاده قليلة عشان يطابقه. وأهم الـ parameters هما n_neighbors (بيتحكم في البنية المحلية قصاد العامة، شبه الـ perplexity في t-SNE) وmin_dist (النقط بتقرّب من بعض قد إيه في الـ embedding).

الـ UMAP هو المعيار الحالي لرسم البيانات العالية الأبعاد. بيشتغل في وقت شبه خطي (قصاد O(n² log n) لـ t-SNE)، ويقدر يعمل embedding لنقط جديدة بعد التدريب (t-SNE مبيقدرش)، وبيطلّع embeddings ثابتة أكتر بين التشغيلات المختلفة.

اختيار الطريقة المناسبة

الـ PCA هو الاختيار الافتراضي للـ preprocessing واستكشاف البنية الخطية. استخدمه الأول دايمًا. سريع وحتمي وسهل تفسّره وبيكبر لملايين النقط. وطبّقه قبل t-SNE أو UMAP عشان تنزّل الأبعاد من الآلاف لـ ~50 feature قبل الخطوة غير الخطية التقيلة.

الـ t-SNE بيلمع في كشف الـ clusters المتلزّقة والمنفصلة كويس في datasets صغيرة لمتوسطة (لحد ~100,000 نقطة). وهو الأداة المعتادة في الجينوميات وبيولوجيا الخلية الواحدة، اللي فيها اكتشاف الأنواع الفرعية في ملامح الخلايا العالية الأبعاد مهم جدًا. وضعفه السرعة وإنه مبيقدرش يعمل embedding لنقط جديدة.

الـ UMAP هو الاختيار المفضّل للـ datasets الأكبر، أو لما البنية العامة تبقى مهمة، أو لما تحتاج تعمل embedding لبيانات جديدة بعد التدريب. أسرع وبيكبر أحسن، وبقى أكتر وأكتر المعيار لتحليل embeddings الـ NLP، والـ recommendation systems، ورسم features الصور.

الـ explained variance (PCA)
r_j = \frac{\lambda_j}{\displaystyle\sum_{l=1}^{d} \lambda_l}
نسبة الـ explained variance للـ component رقم j هي الـ eigenvalue بتاعته λ_j مقسومة على مجموع كل الـ eigenvalues. والمجموع التراكمي على أعلى k components بيدّي نسبة الـ variance الكلي اللي فضل في الـ embedding اللي أبعاده k.
أهم اللي اتعلمته
  • الـ curse of dimensionality بتخلّي البيانات العالية الأبعاد متناثرة ومقاييس المسافة مش موثوقة — الـ dimensionality reduction ضرورة مالهاش بديل.
  • الـ PCA بيلاقي الاتجاهات اللي فيها أكبر variance عن طريق eigenvectors الـ covariance matrix؛ خطي وسريع وسهل تفسّره.
  • نسبة الـ explained variance بتقولك تحتفظ بكام component؛ ورسم الكوع بيوجّه الاختيار.
  • الـ t-SNE بيحافظ على بنية الجيرة المحلية للرسم؛ المحاور مالهاش معنى ومينفعش تقارن الـ clusters على طول بين تشغيلات مختلفة.
  • الـ UMAP أسرع وبيحافظ على بنية عامة أكتر من t-SNE؛ يقدر يعمل embedding لنقط جديدة وهو المعيار الحالي للرسم على نطاق واسع.
  • خطوات الشغل: طبّق PCA الأول لـ ~50 بُعد، وبعدين t-SNE أو UMAP للرسم في بُعدين أو تلاتة.
  • الـ dimensionality reduction للفهم والـ preprocessing — مش بديل عن الـ feature engineering.
اللي فات الـ clustering الهرمي والكثافي (التجميع الهرمي والكثافي) نظرة عامة اللي بعده الـ perceptron (البيرسبترون)