Python3 k-邻近算法(KNN)
1 # -*- coding: utf-8 -*- 2 """ 3 Created on Fri Dec 29 13:13:44 2017 4 5 @author: markli 6 """ 7 import numpy as np; 8 #两点之间的距离采用欧式几何距离 9 ''' 10 采用欧式距离进行K最小临近分类 11 x 未知分类点 m*1 向量 12 y n个测试样本点 m*n 维向量 13 ''' 14 def ComputeDistance(x,y): 15 m = len(x); #获取维度数量 16 #print(m); 17 tempeye = -np.eye(m); 18 tempone = np.ones((1,m)); 19 C = np.vstack((tempone,tempeye));#中间过渡矩阵 m+1 * m 按列合并,列数不变扩张行 20 translateMatrix = np.hstack((x,y)); #按行合并,行数不变,扩张列 21 tempresult = np.dot(translateMatrix,C); 22 result = np.multiply(tempresult,tempresult); 23 #result = [d**2 for d in np.array(tempresult)]; 24 result = np.sum(result,axis=0) 25 distance = [pow(d,1/m) for d in np.array(result)]; 26 return distance; 27 28 ''' 29 k 选取点的个数 30 distance 带预测点与每个样本点的距离 31 labels 每个样本点的类别标记 32 return 返回距离最近的k的样本点的类别标记 33 ''' 34 def KNN(k,distance,labels): 35 dis_label = []; 36 for i in range(len(labels)): 37 tup = (distance[i],labels[i]); 38 dis_label.append(tup); 39 dis_label = sorted(dis_label,lambda x:x[0]); 40 Kmin = []; 41 for i in range(k-1): 42 label = dis_label[i][1]; 43 if label not in Kmin: 44 Kmin.append(label); 45 return Kmin; 46 47 48 49 #sklearn 中的KNN 50 # -*- coding: utf-8 -*- 51 """ 52 Created on Sat Dec 30 09:36:18 2017 53 54 @author: markli 55 """ 56 from sklearn import neighbors; 57 from sklearn import datasets; 58 import numpy as np; 59 import matplotlib.pyplot as plt; 60 61 KNN = neighbors.KNeighborsClassifier(n_neighbors=5,weights='distance'); 62 iris = datasets.load_iris(); 63 64 #print(iris); 65 66 KNN.fit(iris.data,iris.target); 67 x = [0.2,0.4,0.3,0.5]; 68 y = KNN.predict(np.array(x).reshape((1,4))); 69 print(iris.target_names[y]); 70 71 #k = neighbors.NearestNeighbors(); 72 #A = k.kneighbors_graph(iris.data,n_neighbors=5,mode='distance');