تخطَّ إلى المحتوى

🧮 شرح هياكل البيانات والخوارزميات

أقرب الجيران K (K-Nearest Neighbors)

الدرس 31 من 32· ⏱ 2 دقائق قراءة

الفكرة: "احكم عليّ من رفاقي"

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 الساذج على بيانات ضخمة جدًا بدون تحسين — بطيء جدًا وقت التصنيف الفعلي (وقت التدريب شبه معدوم لكن وقت التصنيف مرتفع، عكس معظم خوارزميات التعلّم الآلي الأخرى).

🎯 التالي: الخلاصة الشاملة لمسار هياكل البيانات والخوارزميات.

شرح أقرب الجيران K (K-Nearest Neighbors) — هياكل البيانات والخوارزميات بالعربي
أقرب الجيران K (K-Nearest Neighbors)هياكل البيانات والخوارزميات بالعربي · The Code Fix

📚 لمزيد من التعمّق في هياكل البيانات والخوارزميات، راجِع هياكل البيانات على ويكيبيديا.

هل كان هذا الدرس مفيدًا؟