English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Este artículo comparte el código específico del algoritmo de clasificación KNN en Python, a fin de que pueda referirse a él, el contenido específico es el siguiente
El algoritmo de clasificación KNN se considera uno de los algoritmos de clasificación más simples en el aprendizaje automático, y KNN significa K-El algoritmo NearestNeighbor (K puntos de muestra más cercanos). Antes de la clasificación, el clasificador KNN lee una gran cantidad de datos de muestra con etiquetas de clasificación como datos de referencia para la clasificación. Cuando clasifica muestras de clase desconocida, calcula la diferencia entre la muestra actual y todas las muestras de referencia; esta diferencia se mide a través de la distancia entre los puntos de datos en el espacio multidimensional de características de las muestras. Es decir, cuanto más cerca estén dos puntos de muestra en el espacio multidimensional de sus datos de características, menor será la diferencia entre ellos, y mayor será la probabilidad de que ambos puntos de muestra pertenezcan a la misma categoría. El algoritmo de clasificación KNN utiliza esta comprensión básica, calcula la distancia entre el punto de muestra a predecir y todos los puntos de muestra en el espacio de muestra de referencia, encuentra los K puntos de muestra más cercanos a este punto de muestra, y estadísticamente determina la categoría que representa la mayoría de estos K puntos de muestra más cercanos, y esta categoría se toma como el resultado de la predicción.
El modelo de KNN es muy simple, no implica el entrenamiento del modelo, cada vez que se realiza una predicción, es necesario calcular la distancia entre el punto y todos los puntos conocidos, por lo tanto, a medida que aumenta el número de conjuntos de puntos de referencia, el costo de cálculo del clasificador de KNN también aumenta proporcionalmente, y KNN no es adecuado para conjuntos de puntos de muestra muy pequeños. Además, después de que se propuso KNN, muchas personas propusieron muchos algoritmos de mejora, que se dirigen tanto a mejorar la velocidad del algoritmo como a mejorar la precisión del algoritmo, pero todos se basan en el principio de "cuanto más cerca, mayor es la probabilidad de similitud". Aquí se implementó el algoritmo más original de KNN utilizando Python, el conjunto de datos utiliza el conjunto de datos de la flor de iris que se utiliza muy a menudo en el curso de aprendizaje automático, y también agregué una pequeña cantidad de datos ruidosos al conjunto de datos original para probar la robustez del algoritmo KNN.
El conjunto de datos utiliza el conjunto de datos de la flor de iris,Enlace de descarga.
El conjunto de datos contiene90 datos (conjunto de entrenamiento), se dividen2clase, cada clase45datos, cada dato4propiedades
Sepal.Length (longitud del escapo floral), la unidad es cm;
Sepal.Width (ancho del escapo floral), la unidad es cm;
Petal.Length (longitud de pétalo), la unidad es cm;
Petal.Width (ancho de pétalo), la unidad es cm;
Tipos de clasificación: Iris Setosa (Iris de montaña), Iris Versicolour (Iris multicolor)
Antes dominaba C++Recientemente he aprendido Python, hoy quiero usarlo para implementar KNN y practicar, aquí está el código:
#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 "type choice error" #获取K个最邻近的样本的距离和类别标签 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 k nearest neighborhoods:" #统计该K个最邻近点中各个类别的个数 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#返回预测的类别 if __name__ == '__main__': traindata=load_dataset()#training data testdata=load_dataset("Iris_test.txt")#testing data #新建一个Knn分类器的K为20, por defecto, se usa la distancia de Euler kc=KnnClassifier(20) kc.load_traindata(traindata) predict_result=[] #预测测试集testdata中所有待预测样本的结果 for i,j in zip(testdata.data,testdata.label): predict_result.append([i,kc.predict(i),j]) correct_count=0 #Comparar los resultados de predicción y los resultados correctos, calcular la tasa de precisión de esta predicción for i in predict_result: if(i[1==i[2) correct_count+=1 ratio=float(correct_count)/len(predict_result) print "proporción de predicción correcta",ratio
en el conjunto de prueba11resultados de clasificación de los puntos de muestra pendientes de clasificar:
En los vecindarios más cercanos k: clase: Iris-cuenta de setosa: 20 resultado: Iris-setosa En los vecindarios más cercanos k: clase: Iris-cuenta de setosa: 20 resultado: Iris-setosa En los vecindarios más cercanos k: clase: Iris-cuenta de setosa: 20 resultado: Iris-setosa En los vecindarios más cercanos k: clase: Iris-cuenta de setosa: 20 resultado: Iris-setosa En los vecindarios más cercanos k: clase: Iris-cuenta de setosa: 20 resultado: Iris-setosa En los vecindarios más cercanos k: clase: Iris-cuenta de versicolor: 20 resultado: Iris-versicolor En los vecindarios más cercanos k: clase: Iris-cuenta de versicolor: 20 resultado: Iris-versicolor En los vecindarios más cercanos k: clase: Iris-cuenta de versicolor: 20 resultado: Iris-versicolor En los vecindarios más cercanos k: clase: Iris-cuenta de versicolor: 20 resultado: Iris-versicolor En los vecindarios más cercanos k: clase: Iris-cuenta de versicolor: 20 resultado: Iris-versicolor En los vecindarios más cercanos k: clase: Iris-cuenta de setosa: 18 clase: Iris-cuenta de versicolor: 2 resultado: Iris-setosa proporción de predicción correcta 0.909090909091
Hay muchas formas de calcular la distancia en KNN, diferentes métodos son aplicables a diferentes conjuntos de datos, este código solo ha implementado dos formas de cálculo: la distancia euclidiana y la distancia manhattan; los datos del conjunto de prueba se han extraído del conjunto de datos original, la cantidad de datos no es grande y los resultados no pueden reflejar bien el rendimiento de KNN, por lo que los resultados de ejecución del programa solo se pueden referir.
Esto es todo el contenido de este artículo, espero que ayude a su aprendizaje y que todos lo apoyen en el tutorial de clamor.
Declaración: El contenido de este artículo se ha obtenido de la red, pertenece a los autores originales, se ha cargado de manera autónoma por los usuarios de Internet y este sitio web no posee los derechos de propiedad. No se ha realizado una edición humana y no se asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @) para hacer una denuncia y proporcionar evidencia relevante. Una vez que se compruebe, este sitio eliminará inmediatamente el contenido sospechoso de infracción.