WEEK 4 • Machine Learning

K-Nearest Neighbors

أقرب K جيران

إيه هو KNN؟

🏘️ الفكرة الأساسية

📖 تشبيه الجيران

تخيل إنك واقف في منطقة جديدة ومش عارف ده حي راقي ولا شعبي:

  • • بص على أقرب K بيت حواليك
  • • لو أغلبهم راقية → الحي ده غالباً راقي
  • • لو أغلبهم شعبية → الحي ده غالباً شعبي

"قولي مين جيرانك، أقولك إنت مين!" 😄

🎯 الخطوات

1 احسب المسافة من النقطة الجديدة لكل النقط الموجودة
2 رتب المسافات واختار أقرب K نقط
3 شوف أغلبية الـ K دول يصوتوا لأي class

📐 المسافة (Euclidean Distance)

d = √[(x₂-x₁)² + (y₂-y₁)²]

زي ما بتحسب المسافة على الخريطة!

اختيار K

قيمة K مهمة جداً!

K = 1

صغير جداً

⚠️ حساس جداً للـ noise والـ outliers

K = 5-7

متوازن ✓

✓ عادة اختيار كويس للبداية

K = n

كبير جداً

⚠️ هيختار الـ class الأكثر عموماً (underfitting)

💡 نصيحة:

  • • دايماً اختار K فردي عشان تتجنب التعادل في التصويت
  • • جرب قيم مختلفة وشوف أيها أحسن (Cross-validation)
INTERACTIVE

KNN Demo

3
Class A
Class B
Unknown

Click to place unknown point

Click on the plot to place a point, then classify it.

استخدامات KNN

Classification

  • 📧تصنيف الإيميلات (spam أو مش spam)
  • 🖼️التعرف على الصور
  • 🏥تشخيص الأمراض

Regression

  • 🏠تقدير سعر البيت
  • 🎬توقع تقييم فيلم
  • 📊التنبؤ بالمبيعات

مميزات وعيوب

مميزات

  • ✓ بسيط ومفهوم
  • ✓ No training needed (lazy learner)
  • ✓ بيشتغل كويس مع data صغير

عيوب

  • ✗ بطيء مع data كتير (O(n) للتصنيف)
  • ✗ حساس للـ features scale
  • ✗ Curse of dimensionality

Implementation

knn.js
function knn(data, query, k) {
  // 1. Calculate distances
  const distances = data.map(point => ({
    label: point.label,
    dist: Math.sqrt(
      (point.x - query.x) ** 2 +
      (point.y - query.y) ** 2
    )
  }));
  
  // 2. Sort by distance
  distances.sort((a, b) => a.dist - b.dist);
  
  // 3. Get K nearest
  const kNearest = distances.slice(0, k);
  
  // 4. Vote!
  const votes = {};
  kNearest.forEach(n => {
    votes[n.label] = (votes[n.label] || 0) + 1;
  });
  
  // Return majority vote
  return Object.entries(votes)
    .sort((a, b) => b[1] - a[1])[0][0];
}

شرح الكود 📖

سطر 3-8: احسب المسافة لكل نقطة
سطر 11: رتب حسب المسافة (الأقرب الأول)
سطر 14: خد أول K نقط
سطر 17-20: عدّ أصوات كل class
سطر 23-24: رجّع الـ class اللي كسب التصويت