English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Questo articolo condivide l'esempio di codice dell'algoritmo di classificazione KNN in Python per riferimento, i contenuti specifici sono come segue
L'algoritmo di classificazione KNN dovrebbe essere considerato uno dei più semplici algoritmi di classificazione nel campo dell'apprendimento automatico, dove KNN sta per K-NearestNeighbor (K vicini più prossimi). Prima di effettuare la classificazione, il classificatore KNN legge una grande quantità di dati di campione con etichette di classificazione come dati di riferimento per la classificazione. Quando classifica campioni sconosciuti, calcola la differenza di distanza tra il campione corrente e tutti i campioni di riferimento; questa differenza di distanza viene misurata attraverso la distanza tra i punti dati in uno spazio multidimensionale delle caratteristiche dei campioni. Questo significa che se due punti di campione sono più vicini nello spazio multidimensionale delle loro caratteristiche, la differenza tra questi due punti di campione è più piccola, e la probabilità che appartengano alla stessa categoria è maggiore. L'algoritmo di classificazione KNN utilizza questa conoscenza di base, calcolando la distanza tra il punto campione da prevedere e tutti i campioni nello spazio di riferimento, trovando i K campioni di riferimento più vicini a questo punto campione, contando la percentuale di campioni più vicini tra questi K campioni e assegnando la categoria più presente come risultato di previsione.
Il modello KNN è molto semplice, non è necessario addestrare il modello, ogni volta che si fa una previsione, è necessario calcolare la distanza tra il punto e tutti i punti conosciuti, quindi man mano che aumenta il numero di campioni di riferimento, l'overhead del classificatore KNN aumenta proporzionalmente e KNN non è adatto per set di campioni molto piccoli. E dopo che KNN è stato proposto, molte persone hanno proposto molti algoritmi di miglioramento, che si concentrano su migliorare la velocità e l'accuratezza dell'algoritmo, ma tutti si basano sul principio che "più vicini sono i punti, maggiore è la probabilità di somiglianza". Quindi, qui ho implementato l'algoritmo originale di KNN utilizzando Python, il set di dati utilizzato è il set di dati di Iris utilizzato molto spesso nei corsi di machine learning, e ho aggiunto una piccola quantità di rumore ai dati originali del set di dati per testare la robustezza dell'algoritmo KNN.
Il set di dati utilizzato è il set di dati di Iris.Indirizzo di scaricamento.
Il set di dati contiene 90 dati (set di addestramento), divisi in 2 classi, con 45 dati per classe, ciascun dato con 4 attributi
Lunghezza Sepalo (lunghezza sepalo), unità in cm;
Larghezza Sepalo (larghezza sepalo), unità in cm;
Lunghezza Petala (lunghezza petalo), unità in cm;
Larghezza Petala (larghezza petalo), unità in cm;
Tipi di classificazione: Iris Setosa (Iris Setosa), Iris Versicolour (Iris Versicolour)
In precedenza ho lavorato con C++, ma di recente ho iniziato a studiare Python, oggi voglio usare KNN per esercitarmi, ecco il codice:
#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#返回数据集 #定义一个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 "errore di scelta di tipo" #Ottieni la distanza e il tag della classe dei K campioni più vicini 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 "Nei k vicini più vicini:" #Controlla il numero di classi nei K punti più vicini 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#Restituisce la classe prevista if __name__ == '__main__': traindata=load_dataset()#data di addestramento testdata=load_dataset("Iris_test.txt")#data di test #Crea un classificatore Knn con K=20, metodo di calcolo predefinito di distanza euclidea kc=KnnClassifier(20) kc.load_traindata(traindata) predict_result=[] #Prevedi i risultati per tutti i campioni da prevedere nel set di test testdata for i,j in zip(testdata.data,testdata.label): predict_result.append([i,kc.predict(i),j]) correct_count=0 #Confronta i risultati delle previsioni con i risultati corretti e calcola l'accuratezza di questa previsione for i in predict_result: if(i[1]==i[2]): correct_count+=1 ratio=float(correct_count)/len(predict_result) print "correct predicting ratio",ratio
Risultati di classificazione di 11 punti di campione nel set di test:
In k nearest neighborhoods: class: Iris-setosa count: 20 result: Iris-setosa In k nearest neighborhoods: class: Iris-setosa count: 20 result: Iris-setosa In k nearest neighborhoods: class: Iris-setosa count: 20 result: Iris-setosa In k nearest neighborhoods: class: Iris-setosa count: 20 result: Iris-setosa In k nearest neighborhoods: class: Iris-setosa count: 20 result: Iris-setosa In k nearest neighborhoods: class: Iris-versicolor count: 20 result: Iris-versicolor In k nearest neighborhoods: class: Iris-versicolor count: 20 result: Iris-versicolor In k nearest neighborhoods: class: Iris-versicolor count: 20 result: Iris-versicolor In k nearest neighborhoods: class: Iris-versicolor count: 20 result: Iris-versicolor In k nearest neighborhoods: class: Iris-versicolor count: 20 result: Iris-versicolor In k nearest neighborhoods: class: Iris-setosa count: 18 class: Iris-versicolor count: 2 result: Iris-setosa correct predicting ratio 0.909090909091
Ci sono molte metodi per calcolare la distanza in KNN, diversi metodi sono adatti a diversi set di dati, in questo codice sono state implementate solo due modalità di calcolo: distanza euclidea e distanza di Manhattan; i dati nel set di test sono stati estratti dal set di dati originale, la quantità di dati non è molto grande, i risultati non possono bene riflettere le prestazioni di KNN, quindi i risultati del programma sono solo per riferimento.
Questo è tutto il contenuto dell'articolo, speriamo che sia utile per la tua apprendimento, e speriamo che tutti possano sostenere il manuale urla.
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright è dell'autore originale, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non possiede il diritto di proprietà, non è stato elaborato manualmente e non assume alcuna responsabilità legale pertinente. Se trovi contenuti sospetti di violazione del copyright, invia un'e-mail a notice#oldtoolbag.com (sostituisci # con @ quando invii l'e-mail) per segnalare, fornendo prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.