Logo
تعلم الآلة (2026-2027) - التصنيف بخوارزمية أقرب الجيران (KNN)

في نافذة الطباعة اختر «حفظ كملف PDF» كوجهة.

تعلم الآلة، الأسبوع 5

التصنيف بخوارزمية أقرب الجيران (KNN)

صنف عينة جديدة بسؤال أقرب K من جيرانها، ثم ابن النموذج وقيمه واضبطه باستخدام scikit-learn.

الأهداف

  • شرح كيف تتنبأ خوارزمية أقرب الجيران (KNN) بالصنف: المسافة، ثم أقرب K من الصفوف، ثم التصويت بالأغلبية (majority vote)
  • حساب المسافات الإقليدية (Euclidean distances) وتنبؤ KNN يدويا عند K = 1 و3 و5
  • تحجيم (scaling) الخصائص (features) باستخدام StandardScaler، وبيان سبب حاجة المسافة إليه
  • تدريب KNeighborsClassifier، ثم قراءة مصفوفة الالتباس (confusion matrix) والدقة (accuracy) والضبط (precision) والاستدعاء (recall)
  • اختيار K بطريقة الكوع (elbow method)
  • بناء نموذج KNN واستخدامه على مجموعة بيانات iris، وتطبيقه على مشروعك

الأسبوع 5 من الخطة

موقع الدرس من المقرر

  • دفتران (notebooks): KNN_Classification (مجموعة بيانات من 1000 صف فيها 10 خصائص مجهولة الاسم) وNearest Neighbors (أزهار iris)
  • سيناريو من الواقع: نموذج تعلم موجه (supervised learning) بسيط على مجموعة بيانات iris الشهيرة، وفيها 150 عينة من ثلاثة أنواع
  • مرحلة المشروع (project milestone) هذا الأسبوع: تنفيذ نموذج تعلم الآلة (Machine Learning Model Implementation)

خطة الساعتين

الجزءما نفعلهالزمن
1الفكرة، ومثال محلول يدويا30 دقيقة
2الدفتر 1: التحجيم، والتدريب، والتقييم25 دقيقة
3اختيار K بطريقة الكوع10 دقائق
4الدفتر 2 على iris، والأخطاء، ومشروعك20 دقيقة
5تمارين مع الإجابات، ثم الخلاصة35 دقيقة

الجزء 1

فكرة KNN

المدخلات المتشابهة لها تسميات متشابهة

ما خوارزمية أقرب الجيران؟

خوارزمية أقرب الجيران (K-nearest neighbors)
خوارزمية تعلم موجه بسيطة تتنبأ بالنتيجة بتحديد نقاط البيانات الأقرب إلى بيانات الإدخال.

المصطلحات على بيانات iris

المصطلحفي بيانات iris
الخصائص Xطول السبلة (sepal)، وعرض السبلة، وطول البتلة (petal)، وعرض البتلة (سم)
التسمية (label) yالنوع: 0 setosa، و1 versicolor، و2 virginica
مجموعة التدريب (training set)الأزهار التي يخزنها النموذج
نقطة الاستعلام (query)زهرة جديدة نريد معرفة نوعها
Kعدد الجيران الذين يصوتون، وهو n_neighbors في scikit-learn

الخوارزمية في أربع خطوات

  1. خزن صفوف التدريب وتسمياتها (وهذا كل ما يحتاج fit إلى فعله)
  2. احسب المسافة من نقطة الاستعلام إلى كل صف تدريب
  3. رتب المسافات واحتفظ بأصغر K منها
  4. احسب عدد كل تسمية بين هذه الصفوف الـK: تسمية الأغلبية هي التنبؤ

قياس القرب: المسافة الإقليدية

d = √((x1 − q1)2 + (x2 − q2)2 + ... + (xn − qn)2)
  • x صف تدريب، وq نقطة الاستعلام، وn عدد الخصائص
  • اطرح خاصية بخاصية، ثم ربع، ثم اجمع، ثم خذ الجذر التربيعي
  • الترتيب حسب مربع المسافة (squared distance) يعطي الترتيب نفسه، لذا يمكنك يدويا تأجيل الجذر حتى النهاية

يدويا

مثال محلول: زهرة جديدة واحدة

تسع أزهار iris حقيقية، وخاصيتان: طول البتلة وعرض البتلة بوحدة سم. الزهرة الجديدة هي (4.7, 1.7).

الزهرةالنوع(الطول، العرض)
F1setosa(1.4, 0.2)
F2versicolor(4.7, 1.6)
F3versicolor(5.0, 1.7)
F4versicolor(5.1, 1.6)
F5versicolor(4.9, 1.5)
الزهرةالنوع(الطول، العرض)
F6virginica(4.9, 1.8)
F7virginica(4.8, 1.8)
F8virginica(5.0, 1.5)
F9virginica(5.1, 1.8)

الخطوة 1: مربعات المسافات، من F1 إلى F5

الفرق = الزهرة ناقص نقطة الاستعلام، للطول وللعرض

الزهرةالفروقمربع المسافة
F1-3.30, -1.5010.89 + 2.25 = 13.14
F20, -0.100 + 0.01 = 0.01
F3+0.30, 00.09 + 0 = 0.09
F4+0.40, -0.100.16 + 0.01 = 0.17
F5+0.20, -0.200.04 + 0.04 = 0.08

الخطوة 1: مربعات المسافات، من F6 إلى F9

الزهرةالفروقمربع المسافة
F6+0.20, +0.100.04 + 0.01 = 0.05
F7+0.10, +0.100.01 + 0.01 = 0.02
F8+0.30, -0.200.09 + 0.04 = 0.13
F9+0.40, +0.100.16 + 0.01 = 0.17

الخطوة 2: الترتيب وأخذ الجذور

الترتيبالزهرةالنوعالمسافة d
1F2versicolor√0.01 = 0.100
2F7virginica√0.02 = 0.141
3F6virginica√0.05 = 0.224
4F5versicolor√0.08 = 0.283
5F3versicolor√0.09 = 0.300

الخطوة 3: التصويت عند K = 1

K = 1: 1 versicolor ⇒ versicolor

الخطوة 3: التصويت عند K = 3

K = 3: 2 virginica, 1 versicolor ⇒ virginica

الخطوة 3: التصويت عند K = 5

K = 5: 3 versicolor, 2 virginica ⇒ versicolor

جرب بنفسك: المثال المحلول تفاعليا

قيمة K اختيار، والتعادل وارد

  • لا تتعلم الخوارزمية قيمة K من البيانات: أنت تختارها، ثم تتحقق منها على بيانات الاختبار (الجزء 3)
  • قيمة K الصغيرة تتبع الصف الأقرب وحده، حتى لو كان صفا شاذا
  • قيمة K الأكبر تصغي إلى صفوف أكثر، فيقل أثر الصف الشاذ الواحد
  • مع قيمة K زوجية قد يتعادل التصويت، مثل 1 مقابل 1 عند K = 2

الجزء 2

الدفتر 1: بيانات Classified Data

التحجيم، والتقسيم، والتدريب، والتقييم

افتح الدفتر في Colab

text
https://colab.research.google.com/github/
tirthajyoti/Machine-Learning-with-Python/blob/
master/Classification/KNN_Classification.ipynb
اجمع الأسطر الثلاثة في عنوان واحد، أو اضغط رابط "افتح KNN_Classification في Colab" في صفحة الدرس.

تحميل البيانات وفحصها

python
import pandas as pd
import numpy as np

url = ("https://raw.githubusercontent.com/"
       "tirthajyoti/Machine-Learning-with-Python/"
       "master/Datasets/Classified%20Data")
df = pd.read_csv(url, index_col=0)
df.info()
  • 1000 صف، و10 أعمدة خصائص بأسماء مختلقة (WTT، PTI، ...)
  • عمود تسمية واحد، TARGET CLASS، وقيمه 0 و1
  • بيانات متوازنة: 500 صف من كل صنف
  • يرسم الدفتر مخطط صندوق (boxplot) لكل خاصية، مقسما حسب الصنف، لنرى أي الخصائص تفصل بين الصنفين

لماذا تحتاج KNN إلى خصائص محجمة

  • المسافة تجمع مربعات فروق كل الخصائص
  • الخاصية المقيسة على مقياس أكبر تضيف أرقاما أكبر، فتتحكم وحدها فيمن يعد "قريبا"
  • يعيد StandardScaler تحجيم كل خاصية إلى متوسط 0 (mean) وانحراف معياري 1 (standard deviation)، فيصبح لكل خاصية صوت عادل
z = x − μσ

مثال محلول: تحجيم قيمة واحدة

الصف 0 من WTT: x = 0.913917، والمتوسط 0.949682، والانحراف المعياري 0.289490

z = 0.913917 − 0.9496820.289490 ≈ -0.12354

تحجيم الخصائص

python
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(df.drop('TARGET CLASS', axis=1))
scaled_features = scaler.transform(df.drop('TARGET CLASS', axis=1))

df_feat = pd.DataFrame(scaled_features, columns=df.columns[:-1])
df_feat.head()

التقسيم والتدريب والتنبؤ

python
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
    scaled_features, df['TARGET CLASS'], test_size=0.50, random_state=101)

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)
pred = knn.predict(X_test)

مصفوفة الالتباس عند K = 1

print(confusion_matrix(y_test, pred))

التنبؤ 0التنبؤ 1
الفعلي 023317
الفعلي 124226

الدقة ونسبة الخطأ

accuracy = 233 + 226500 = 0.918
error rate = 17 + 24500 = 0.082

الضبط والاستدعاء من المصفوفة نفسها

ضبط الصنف
من بين الصفوف التي تنبأ النموذج بأنها من هذا الصنف، نسبة ما ينتمي إليه فعلا.
استدعاء الصنف
من بين الصفوف التي تنتمي فعلا إلى هذا الصنف، نسبة ما وجدناه منها.
P0 = 233233 + 24 = 0.907
R0 = 233233 + 17 = 0.932

الجزء 3

اختيار K

طريقة الكوع

حلقة الكوع

python
error_rate = []

for i in range(1, 60):
    knn = KNeighborsClassifier(n_neighbors=i)
    knn.fit(X_train, y_train)
    pred_i = knn.predict(X_test)
    error_rate.append(np.mean(pred_i != y_test))
  • درب نموذجا لكل قيمة K، من 1 إلى 59
  • سجل نسبة الخطأ (error rate) على بيانات الاختبار لكل نموذج
  • ارسم الخطأ مقابل K وابحث عن الانحناءة التي يستوي بعدها المنحنى

ما تجده الحلقة

نسبة الخطأ على 500 صف اختبار

Kنسبة الخطأالصفوف الخاطئة
10.08241
20.09447
50.05427
110.04824
240.04623

جرب بنفسك: شغل حلقة الكوع

الجزء 4

الدفتر 2: أزهار iris

150 عينة، وثلاثة أنواع

تحميل iris في DataFrame

python
from sklearn.datasets import load_iris

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['class'] = iris.target
df['class name'] = iris.target_names[iris['target']]
df.head()

sns.pairplot(df)
  • 150 زهرة، و50 من كل نوع
  • 4 خصائص، كلها بوحدة سم
  • مضمنة في scikit-learn: لا حاجة إلى تنزيل شيء
  • يبين مخطط الأزواج (pair plot) أن خاصيتي البتلة تفصلان بين الأنواع أفضل من غيرهما

التقسيم والتدريب وحساب النتيجة

python
x_train, x_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size=0.2, random_state=0)

model = KNeighborsClassifier()
model.fit(x_train, y_train)
model.score(x_test, y_test)

التنبؤ بزهرة لم يرها النموذج من قبل

python
predicted_class = model.predict([[5.6, 4.4, 1.2, 0.4]])
print(predicted_class)
print(iris.target_names[predicted_class[0]])

لماذا setosa؟ الجيران الخمسة

يسردهم model.kneighbors: الخمسة كلهم من setosa، والتصويت 5 مقابل 0

الجارالنوعالمسافة
(5.7, 4.4, 1.5, 0.4)setosa0.3162
(5.8, 4, 1.2, 0.2)setosa0.4899
(5.2, 4.1, 1.5, 0.1)setosa0.6557
(5.4, 3.9, 1.7, 0.4)setosa0.7348
(5.7, 3.8, 1.7, 0.3)setosa0.7937
d1 = √((5.6 − 5.7)2 + 0 + (1.2 − 1.5)2 + 0) = √0.1 = 0.3162

أين يخطئ نموذج iris

confusion_matrix(y_test, model.predict(x_test))

التنبؤ setosaالتنبؤ versicolorالتنبؤ virginica
setosa1100
versicolor0121
virginica006

استكشف: أزهار iris الـ150 كلها

قبل التمارين

الأخطاء الشائعة

  • نسيان التحجيم قبل نموذج يعتمد على المسافة
  • تمرير قائمة مسطحة واحدة إلى predict: فهي تحتاج إلى [[...]]
  • قراءة "Classified Data" في Colab من مجلد لا يحتويه
  • الحكم على النموذج بصفوف التدريب بدلا من صفوف الاختبار
  • تتويج قيمة K بسبب فرق صف أو صفين من صفوف الاختبار
  • استخدام قيمة K زوجية مع صنفين والوقوع في التعادل

مشروع فريقك

مرحلة المشروع: تنفيذ النموذج

  1. خذ الخصائص والهدف (target) اللذين اخترتهما في الأسبوع 4
  2. حجم الخصائص، ثم قسمها إلى مجموعتي تدريب واختبار
  3. درب KNeighborsClassifier وتنبأ بمجموعة الاختبار
  4. اعرض مصفوفة الالتباس وclassification_report
  5. شغل حلقة الكوع، واختر K، واكتب سبب اختيارك

الجزء 5

التمارين: دورك

نحو 30 دقيقة، والإجابات تلي كل مهمة

نحو 10 دقائق

التمرين 1: زهرة جديدة ثانية

  • استخدم الأزهار التسع نفسها من F1 إلى F9 (طول البتلة، عرض البتلة)
  • الزهرة الجديدة هي (5.1, 1.75)
  • احسب مربع المسافة إلى كل زهرة ورتب الأزهار
  • تنبأ بالنوع عند K = 1 وK = 3 وK = 5

الإجابات

التمرين 1: الإجابة، الترتيب

الترتيبالزهرةالنوعمربع المسافة
1F9virginica0.0025
2F3versicolor0.0125
3F4versicolor0.0225
4F6virginica0.0425
5F8virginica0.0725

الإجابات

التمرين 1: الإجابة، الأصوات

K = 1: 1 virginica ⇒ virginica
K = 3: 2 versicolor, 1 virginica ⇒ versicolor
K = 5: 3 virginica, 2 versicolor ⇒ virginica

نحو 5 دقائق

التمرين 2: قراءة مصفوفة الالتباس

التنبؤ 0التنبؤ 1
الفعلي 023812
الفعلي 112238
accuracy = 238 + 238500 = 0.952, error = 0.048
P1 = 238238 + 12 = 0.952, R1 = 238238 + 12 = 0.952

نحو 5 دقائق

التمرين 3: التقييس (standardization) يدويا

لخاصية واحدة القيم الخمس 4, 6, 8, 10, 12

μ = 8, σ = √16 + 4 + 0 + 4 + 165 = √8 = 2.8284
z = -1.4142, -0.7071, 0, 0.7071, 1.4142

نحو 10 دقائق

التمرين 4: في Colab، على iris

  1. شغل الدفتر 2 حتى model.score(x_test, y_test)
  2. تنبأ بالزهرة [[6.0, 2.9, 4.5, 1.5]] واطبع اسم نوعها
  3. استدع model.kneighbors عليها: كيف صوت جيرانها الخمسة؟
  4. مر على قيم K من 1 إلى 15 في حلقة على التقسيم نفسه، واطبع كل نتيجة

الإجابات

التمرين 4: الإجابة

السؤالالإجابة
نوع [6.0, 2.9, 4.5, 1.5]versicolor
الجيران الخمسة4 versicolor، و1 virginica
أقرب جار(6.1, 3, 4.6, 1.4)، والمسافة 0.2000
النتيجة 1.0 عند K =1 و4، ومن 6 إلى 15
النتيجة 0.9667 عند K =2 و3 و5

الخلاصة

  1. تتنبأ KNN بالتصويت بالأغلبية بين صفوف التدريب الـK الأقرب إلى نقطة الاستعلام
  2. القرب هو المسافة الإقليدية، لذا يجب أن تكون الخصائص على المقياس نفسه
  3. قد يتغير صنف نقطة الاستعلام نفسها مع تغير K: فقيمة K إعداد تختاره أنت
  4. قيم النموذج على بيانات الاختبار بمصفوفة الالتباس والدقة والضبط والاستدعاء
  5. اختر K بطريقة الكوع، ولا تلاحق فروقا من صف أو صفين

افتح هذا الدرس

Mahmoud Abasالتصنيف بخوارزمية أقرب الجيران (KNN)