English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
تشارك هذه المقالة رمز خوارزمية تصنيف KNN في Python، للاستعانة به، وتفاصيله كالتالي
يُعتبر خوارزمية تصنيف KNN من أكثر خوارزميات التصنيف البسيطة في تعلم الآلة، حيث يُعرف KNN بك-أقرب جار (K-NearestNeighbor). قبل القيام بالتصنيف، يقرأ معالج KNN كمية كبيرة من بيانات العينات المزودة بتسميات تصنيفية كبيانات مرجعية للتصنيف، وعندما يقوم بتصنيف عينة غير معروفة، يحسب حجم الاختلاف بين العينة الحالية وبين جميع العينات المرجعية؛ يتم قياس هذا الاختلاف عن طريق مسافة النقطة البيانية في الفضاء المتعدد للخصائص للعينة، مما يعني أن كلما كانت نقاط العينة في مساحة بياناتها المتعددة الأبعاد أقرب، كان الاختلاف بين هذه النقاط أقل، وكانت إمكانية أن تنتمي إلى نفس الفئة أكبر. يستخدم خوارزمية تصنيف KNN هذه المعرفة الأساسية، من خلال حساب مسافة النقطة العينية مع جميع العينات في المساحة المرجعية، والبحث عن K العينة المرجعية الأقرب، وتحليل الأغلبية في هذه العينات الأقرب، ويتم اختيار هذا الفئة كنتيجة التنبؤ.
نموذج KNN بسيط جدًا، لا يتضمن تدريب النموذج، ويجب حساب مسافة النقطة الحالية من جميع النقاط المعروفة في كل تنبؤ، لذا مع زيادة عدد العينات المرجعية، يزيد أيضًا تكلفة حساب مصفوفة KNN، وKNN غير مناسب للعينات القليلة. وبعد تقديم KNN، قدم الكثير من الباحثين العديد من الخوارزميات المعدلة، من زيادة سرعة الخوارزمية وتحسين دقتها، ولكن جميعها تعتمد على المبدأ "كلما كانت المسافة أقصر، كلما كانت الأنسبية أكبر". هنا تم تنفيذ خوارزمية النسخ الأصلية لـ KNN باستخدام Python، وتم استخدام مجموعة بيانات الياسمين التي تستخدمها بشكل شائع في دورات التعلم الآلي، كما أضفت بعض البيانات الملوثة إلى مجموعة البيانات الأصلية لاختبار قابلية النموذج KNN للتحمل.
مجموعة البيانات تستخدم مجموعة بيانات الياسمين،رابط التحميل.
المجموعة تحتوي على 90 بيانات (مجموعة التدريب)، مقسمة إلى 2 فئة، 45 بيانات لكل فئة، كل بيانة تحتوي على 4 خصائص
Sepal.Length (طول البوق)، الوحدة هي cm;
Sepal.Width (عرض البوق)، الوحدة هي cm;
Petal.Length (طول البتلة)، الوحدة هي cm;
Petal.Width (عرض البتلة)، الوحدة هي cm;
أنواع الفئات: Iris Setosa (الصنوبر)、Iris Versicolour (الصنوبر المتعدد الألوان)
لقد كنت أعمل على C++، ولكن مؤخرًا تعلمت Python، وأريد اليوم أن أجرب تنفيذ KNN لتدريب يدي، لذا سأقدم لك الكود الآن:
#coding=utf-8 import math #تحديد فئة بيانات الياسمين فئة Iris: data=[] label=[] pass #تحديد دالة لقراءة مجموعة بيانات الياسمين def load_dataset(filename="Iris_train.txt"): f=open(filename) line=f.readline().strip() propty=line.split(',')#أسماء الخصائص dataset=[]#حفظ معلومات كل عينة label=[]#حفظ علامات العينات بينما line: line=f.readline().strip() إذا (not line): الخروج temp=line.split(',') content=[] للمقارنة في temp[0:-1]: content.append(float(i)) dataset.append(content) label.append(temp[-1]) total=Iris() total.data=dataset total.label=label return total#返回数据集 #定义一个Knn分类器类 class KnnClassifier: def __init__(self,k,type="Euler"):#初始化的时候定义正整数K和距离计算方式 self.k=k self.type=type self.dataloaded=False def load_traindata(self,traindata):#加载数据集 self.data=traindata.data self.label=traindata.label self.label_set=set(traindata.label) self.dataloaded=True#是否加载数据集的标记 def Euler_dist(self,x,y):# 欧拉距离计算方法,x、y都是向量 sum=0 for i,j in zip(x,y): sum+=math.sqrt((i-j)**2) return sum def Manhattan_dist(self,x,y):#曼哈顿距离计算方法,x、y都是向量 sum=0 for i,j in zip(x,y): sum+=abs(i-j) return sum def predict(self,temp):#预测函数,读入一个预测样本的数据,temp是一个向量 if(not self.dataloaded):#判断是否有训练数据 print "No train_data load in" return distance_and_label=[] if(self.type=="Euler"):#判断距离计算方式,欧拉距离或者曼哈顿距离 for i,j in zip(self.data,self.label): dist=self.Euler_dist(temp,i) distance_and_label.append([dist,j]) else: if(self.type=="Manhattan"): for i,j in zip(self.data,self.label): dist=self.Manhattan_dist(temp,i) distance_and_label.append([dist,j]) else: print "type choice error" #الحصول على مسافات العينات الأقرب وأعمدة الفئات neighborhood=sorted(distance_and_label,cmp=lambda x,y : cmp(x[0],y[0]))[0:self.k] neighborhood_class=[] لـ i في neighborhood: neighborhood_class.append(i[1]) class_set=set(neighborhood_class) neighborhood_class_count=[] print "In k nearest neighborhoods:" #حساب عدد الفئات في K العينات الأقرب لـ i في class_set: a=neighborhood_class.count(i) neighborhood_class_count.append([i,a]) print "class: ",i," count: ",a result=sorted(neighborhood_class_count,cmp=lambda x,y : cmp(x[1],y[1]))[-1][0] print "result: ",result return result#إرجاع الفئة المتنبؤة if __name__ == '__main__': traindata=load_dataset()#بيانات التدريب testdata=load_dataset("Iris_test.txt")#data للاختبار #إنشاء مستشهد Knn جديد بك=20،بافتراض طريقة حساب المسافة الأوروبية kc=KnnClassifier(20) kc.load_traindata(traindata) predict_result=[] #تنبؤ نتائج جميع العينات التي يجب تنبيؤها في مجموعة الاختبار testdata لـ i,j في zip(testdata.data,testdata.label): predict_result.append([i,kc.predict(i),j]) correct_count=0 #مقارنة نتائج التنبؤ والنتائج الصحيحة لتحديد دقة التنبؤ لهذه المرة لـ i في predict_result: if(i[1]==i[2]): correct_count+=1 ratio=float(correct_count)/len(predict_result) print "نسبة التنبؤ الصحيحة",ratio
نتائج تصنيف 11 نقطة من عينات الاختبار في مجموعة الاختبار:
في جوارب الأقرباء الـ k: فئة: Iris-setosa عدد: 20 نتيجة: Iris-setosa في جوارب الأقرباء الـ k: فئة: Iris-setosa عدد: 20 نتيجة: Iris-setosa في جوارب الأقرباء الـ k: فئة: Iris-setosa عدد: 20 نتيجة: Iris-setosa في جوارب الأقرباء الـ k: فئة: Iris-setosa عدد: 20 نتيجة: Iris-setosa في جوارب الأقرباء الـ k: فئة: Iris-setosa عدد: 20 نتيجة: Iris-setosa في جوارب الأقرباء الـ k: فئة: Iris-versicolor عدد: 20 نتيجة: Iris-versicolor في جوارب الأقرباء الـ k: فئة: Iris-versicolor عدد: 20 نتيجة: Iris-versicolor في جوارب الأقرباء الـ k: فئة: Iris-versicolor عدد: 20 نتيجة: Iris-versicolor في جوارب الأقرباء الـ k: فئة: Iris-versicolor عدد: 20 نتيجة: Iris-versicolor في جوارب الأقرباء الـ k: فئة: Iris-versicolor عدد: 20 نتيجة: Iris-versicolor في جوارب الأقرباء الـ k: فئة: Iris-setosa عدد: 18 فئة: Iris-versicolor عدد: 2 نتيجة: Iris-setosa نسبة التنبؤ الصحيحة 0.909090909091
هناك العديد من طرق حساب المسافة في KNN، وتطبيقها يختلف بناءً على مجموعة البيانات المختلفة، وقد تم تنفيذ طريقتين فقط من حساب المسافة في هذا الكود: مسافة Euler و مسافة Manhattan؛ يتم استخراج بيانات مجموعة الاختبار من مجموعة البيانات الأصلية، وعدد البيانات ليس كبيرًا، لذا لا يمكن أن يعكس أداء KNN بشكل جيد، لذا يمكن اعتبار نتائج تشغيل البرنامج كمرجع فقط.
هذا هو محتوى المقال الكامل، نأمل أن يساعدكم هذا في تعلمكم، ونأمل أن تدعموا تعليمات الصراخ بشكل كبير.
البيان: محتويات هذا المقال تم جمعها من الإنترنت، وتحمل حقوق الملكية لمالكها الأصلي، تم جمع المحتويات من قبل المستخدمين على الإنترنت بطرقهم الخاصة، ويتمتع هذا الموقع بلا ملكية، ولا يتم تعديل المحتويات بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية تتعلق بذلك. إذا اكتشفتم محتويات مشبوهة بحقوق النسخ، فيرجى إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # ب @) لتقديم الشكوى، وقدموا الأدلة ذات الصلة، وسيتم حذف المحتويات المشبوهة الخاصة بالحقوق الملكية فور التحقق منها.