English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

KNN-Klassifikationsalgorithmus mit Python implementieren

Dieser Artikel teilt Beispielskripte des Python KNN-Klassifikatoralgoritms mit Ihnen, um Ihnen zur Referenz zu dienen, der Inhalt ist wie folgt

Der KNN-Klassifikator ist wahrscheinlich einer der einfachsten Klassifikationsalgorithmen in der maschinellen Lernung, wobei KNN für K steht-Der NearestNeighbor (K der nächsten benachbarten Beispielknoten). Bevor der KNN-Klassifikator eine Klassifizierung durchführt, liest er eine große Anzahl von Beispielsätzen mit Klassifikationstags als Referenzdaten für die Klassifizierung. Wenn er eine Klasse unbekannten Beispielsatzes klassifiziert, berechnet er den Unterschied zwischen dem aktuellen Beispiel und allen Referenzmustern; dieser Unterschied wird durch den Abstand der Datenpunkte im mehrdimensionalen räumlichen Raum der Beispielmerkmale gemessen, d.h., je näher zwei Beispielknoten im mehrdimensionalen räumlichen Raum ihrer Merkmalsdaten sind, desto geringer ist der Unterschied zwischen ihnen, und desto größer ist die Wahrscheinlichkeit, dass sie derselben Klasse angehören. Der KNN-Klassifikator nutzt diese grundlegende Erkenntnis, indem er den Abstand zwischen dem zu klassifizierenden Beispielknoten und allen Knoten im Referenzmustersatz berechnet und die K nächsten benachbarten Referenzknoten findet, die am nächsten am Beispielknoten liegen, und die Klasse, die in diesen am häufigsten vorkommt, als Vorhersageergebnis festlegt.

Das Modell von KNN ist sehr einfach, es betrifft nicht die Modelltraining, und für jede Vorhersage muss die Distanz zu allen bekannten Punkten berechnet werden, daher nimmt mit der Anzahl der Referenzmustersammlungen der Berechnungsaufwand des KNN-Klassifikators proportional zu. KNN ist nicht geeignet für Sammlungen mit sehr wenigen Mustern. Nachdem KNN vorgeschlagen wurde, haben viele Menschen viele verbesserte Algorithmen vorgeschlagen, die aus beiden Richtungen, der Erhöhung der Geschwindigkeit und der Genauigkeit der Algorithmen, basierend auf dem Prinzip "Je näher der Abstand, desto größer die Möglichkeit der Ähnlichkeit" stammen. Hier wurde die ursprüngliche Version des KNN-Algorithmus in Python implementiert, der Datensatz ist die Iris-Datenbank, die sehr oft in den Kursen des maschinellen Lernens verwendet wird. Darüber hinaus habe ich dem ursprünglichen Datensatz einige kleine Stördaten hinzugefügt, um die Robustheit des KNN-Algorithmus zu testen.

Der Datensatz verwendet die Iris-Datenbank.Download-Adresse.

Der Datensatz enthält90 Daten (Trainingsdaten), unterteilt in2Klasse, jede Klasse45Anzahl der Daten, jede Daten4Anzahl der Attribute 

Sepal.Length (Blütenblattlänge), Einheit ist cm;
Sepal.Width (Blütenblattbreite), Einheit ist cm;
Petal.Length (Blütenblattlänge), Einheit ist cm;
Petal.Width (Blütenblattbreite), Einheit ist cm;

Klassifizierungstypen: Iris Setosa (Bergiris), Iris Versicolour (Verschiedenfarbiger Iris)
Bisher habe ich mich auf C konzentriert++In letzter Zeit habe ich Python gelernt, und heute möchte ich die Implementierung von KNN üben, daher werde ich den Code zeigen:

#coding=utf-8
import math
#定义鸢尾花的数据类
class Iris:
 data=[]
 label=[]
 pass
#定义一个读取莺尾花数据集的函数
def load_dataset(filename="Iris_train.txt"):
 f=open(filename)
 line=f.readline().strip()
 propty=line.split(',')#属性名
 dataset=[]#保存每一个样本的数据信息
 label=[]#保存样本的标签
 while line:
 line=f.readline().strip()
 if(not line):
 break
 temp=line.split(',')
 content=[]
 for i in temp[0:-1]:
 content.append(float(i))
 dataset.append(content)
 label.append(temp[-1])
 total=Iris()
 total.data=dataset
 total.label=label
 return total # return the dataset
# define a Knn classifier class
class KnnClassifier:
 def __init__(self,k,type="Euler"): # define positive integer K and distance calculation method when initializing
 self.k=k
 self.type=type
 self.dataloaded=False
 def load_traindata(self,traindata): # load the dataset
 self.data=traindata.data
 self.label=traindata.label
 self.label_set=set(traindata.label)
 self.dataloaded=True # mark whether to load the dataset
 def Euler_dist(self,x,y): # Euler distance calculation method, x, y are vectors
 sum=0
 for i,j in zip(x,y):
 sum+=math.sqrt((i-j)**2)
 return sum
 def Manhattan_dist(self,x,y): # Manhattan distance calculation method, x, y are vectors
 sum=0
 for i,j in zip(x,y):
 sum+=abs(i-j)
 return sum
 def predict(self,temp): # prediction function, read in the data of a prediction sample, temp is a vector
 if(not self.dataloaded): # judge if there is training data
 print "No train_data load in"
 return
 distance_and_label=[]
 if(self.type=="Euler"): # judge the distance calculation method, Euler distance or Manhattan distance
 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 "Fehler bei der Typauswahl"
 # Erhalt der Distanzen und Klassenbezeichnungen der K nächsten Beispiele
 neighborhood=sorted(distance_and_label,cmp=lambda x,y : cmp(x[0],y[0]))[0:self.k]
 neighborhood_class=[]
 for i in neighborhood:
 neighborhood_class.append(i[1])
 class_set=set(neighborhood_class)
 neighborhood_class_count=[]
 print "In den k nächsten Nachbarschaften:"
 # Zählung der Anzahl der Klassen in den K nächsten Nachbarn
 for i in 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#Rückgabe der vorhergesagten Klassen
if __name__ == '__main__':
 traindata=load_dataset()#training data
 testdata=load_dataset("Iris_test.txt")#testing data
 # Erstellung eines neuen KNN-Klassifikators mit K20, Standardwert für die Euklidische Distanzberechnung
 kc=KnnClassifier(20)
 kc.load_traindata(traindata)
 predict_result=[]
 # Vorhersage der Ergebnisse aller zu vorherzusagenden Beispiele im Testdatensatz testdata
 for i,j in zip(testdata.data,testdata.label):
 predict_result.append([i,kc.predict(i),j])
 correct_count=0
 #Vergleichen Sie die Vorhersageergebnisse mit den richtigen Ergebnissen, um die Genauigkeit dieser Vorhersage zu berechnen
 for i in predict_result:
 if(i[1==i[2]:
 correct_count+=1
 ratio=float(correct_count)/len(predict_result)
 print "korrekte Vorhersagerate", ratio

Im Testset11Klassifikationsergebnisse von Punkten, die auf die zu testenden Punkte zutreffen:

In den k nächsten Nachbarn:
Klasse: Iris-setosa Anzahl: 20
Ergebnis: Iris-setosa
In den k nächsten Nachbarn:
Klasse: Iris-setosa Anzahl: 20
Ergebnis: Iris-setosa
In den k nächsten Nachbarn:
Klasse: Iris-setosa Anzahl: 20
Ergebnis: Iris-setosa
In den k nächsten Nachbarn:
Klasse: Iris-setosa Anzahl: 20
Ergebnis: Iris-setosa
In den k nächsten Nachbarn:
Klasse: Iris-setosa Anzahl: 20
Ergebnis: Iris-setosa
In den k nächsten Nachbarn:
Klasse: Iris-versicolor Anzahl: 20
Ergebnis: Iris-versicolor
In den k nächsten Nachbarn:
Klasse: Iris-versicolor Anzahl: 20
Ergebnis: Iris-versicolor
In den k nächsten Nachbarn:
Klasse: Iris-versicolor Anzahl: 20
Ergebnis: Iris-versicolor
In den k nächsten Nachbarn:
Klasse: Iris-versicolor Anzahl: 20
Ergebnis: Iris-versicolor
In den k nächsten Nachbarn:
Klasse: Iris-versicolor Anzahl: 20
Ergebnis: Iris-versicolor
In den k nächsten Nachbarn:
Klasse: Iris-setosa Anzahl: 18
Klasse: Iris-versicolor Anzahl: 2
Ergebnis: Iris-setosa
korrekte Vorhersagerate 0.909090909091

Es gibt viele Methoden zur Berechnung der Entfernung in KNN, die für verschiedene Datensätze unterschiedlich geeignet sind. In diesem Code wurden nur die beiden Berechnungsmethoden Euklidische Distanz und Manhattan-Distanz implementiert; die Daten im Testset wurden aus dem ursprünglichen Datensatz extrahiert und die Datenmenge ist nicht groß. Die Ergebnisse können die Leistung von KNN nicht gut widerspiegeln, daher sind die Ergebnisse der Programmausführung nur als Referenz zu betrachten.

Das ist der gesamte Inhalt dieses Artikels. Wir hoffen, dass er Ihnen bei Ihrem Lernen hilft und dass Sie die Anleitung weiterempfehlen.

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet bezogen und gehört dem Urheberrechtinhaber. Der Inhalt wurde von Internetbenutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine rechtlichen Verantwortlichkeiten. Wenn Sie urheberrechtlich geschützte Inhalte entdecken, freuen wir uns über eine E-Mail an: notice#oldtoolbag.com (Bitte ersetzen Sie # durch @, wenn Sie eine E-Mail senden, um eine Meldung zu machen, und fügen Sie relevante Beweise bei. Sobald nachgewiesen, wird diese Website die fraglichen urheberrechtlichen Inhalte sofort löschen.)

Vermutlich mögen Sie