الفكرة: "احكم عليّ من رفاقي"
KNN خوارزمية تصنيف بسيطة جدًا مبدئيًا: لتصنيف عنصر جديد، انظر لأقرب K عنصر له بالبيانات الموجودة سلفًا، وصنّفه حسب الأغلبية بينهم. لا "تدريب" معقّد — فقط قياس مسافة ومقارنة.
مثال: تصنيف فاكهة جديدة (حسب الوزن والحجم) بناءً على فواكه معروفة سلفًا
🍊 🍊 🍎 (فاكهة جديدة، غير معروف نوعها)
🍊 ?
🍇 🍇
لو K=3: أقرب 3 فواكه للعنصر الجديد هي 🍊🍊🍊 → نُصنّفها كبرتقالة
قياس المسافة
الأشيع: المسافة الإقليدية (كنظرية فيثاغورس بأبعاد متعددة):
import math
def euclidean_distance(point1, point2):
return math.sqrt(sum((a - b) ** 2 for a, b in zip(point1, point2)))
distance_a_b = euclidean_distance([1, 2], [4, 6])
print(distance_a_b) # 5.0
تنفيذ KNN من الصفر
from collections import Counter
def knn_classify(training_data, new_point, k=3):
# training_data: [(features, label), ...]
distances = []
for features, label in training_data:
dist = euclidean_distance(features, new_point)
distances.append((dist, label))
distances.sort(key=lambda x: x[0]) # الأقرب أولًا
nearest_labels = [label for _, label in distances[:k]] # أقرب K تصنيف
most_common = Counter(nearest_labels).most_common(1)
return most_common[0][0] # التصنيف الأكثر تكرارًا
training_data = [
([170, 65], "لاعب كرة قدم"),
([180, 90], "لاعب كرة سلة"),
([175, 70], "لاعب كرة قدم"),
([195, 100], "لاعب كرة سلة"),
]
result = knn_classify(training_data, [178, 68], k=3)
print(result) # "لاعب كرة قدم" على الأغلب
اختيار قيمة K المناسبة
| قيمة K | التأثير |
|---|---|
| صغيرة جدًا (K=1) | حسّاسة جدًا للضوضاء، عنصر شاذ واحد يغيّر النتيجة |
| كبيرة جدًا | تُضعف التمييز بين الفئات، قد "تُغرق" الإشارة الحقيقية بالضجيج |
| القاعدة الشائعة | جرّب قيمًا فردية (لتفادي تعادل الأصوات) وقيّم الدقة عمليًا |
التعقيد والتحدي الحقيقي
الأسلوب الساذج (Brute-force) يقيس المسافة لكل نقطة تدريب — O(n) لكل تصنيف جديد، بطيء جدًا مع بيانات ضخمة. حلول متقدّمة (KD-Tree، Ball Tree) تسرّع البحث عن أقرب الجيران دون فحص كل نقطة، لكنها تتجاوز نطاق هذا الدرس التمهيدي.
علاقتها بهياكل البيانات
KNN مثال ممتاز على كيف تلتقي الخوارزميات بمشاكل العالم الحقيقي (توصيات منتجات، كشف بريد مزعج، تصنيف صور بسيط) — وتوضّح أن "التعلّم الآلي" بجوهره غالبًا عمليات حسابية ومقارنات بسيطة مبنية فوق هياكل بيانات ومفاهيم تعرفها سلفًا (فرز، مسافات، عدّ تكرارات).
أخطاء شائعة
- عدم توحيد مقياس الميزات (Feature Scaling) قبل حساب المسافة — ميزة بمدى قيم كبير (مثل الراتب) تطغى على ميزة بمدى صغير (مثل العمر) بشكل غير عادل.
- اختيار K زوجي بمسألة تصنيف ثنائية (فئتين فقط) — يسبب تعادلًا محتملًا بالأصوات.
- استخدام KNN الساذج على بيانات ضخمة جدًا بدون تحسين — بطيء جدًا وقت التصنيف الفعلي (وقت التدريب شبه معدوم لكن وقت التصنيف مرتفع، عكس معظم خوارزميات التعلّم الآلي الأخرى).
🎯 التالي: الخلاصة الشاملة لمسار هياكل البيانات والخوارزميات.