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');