邻近算法
或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
关于K最近邻算法,非常好的一篇文章:KNN算法理解; 另外一篇文章也值得参考:KNN最近邻Python实现
行业应用: 客户流失预测、欺诈侦测等(更适合于稀有事件的分类问题)
写在前面的:Python2.7
数据iris: http://pan.baidu.com/s/1bHuQ0A 测试数据集: iris的第1行数据; 训练数据: iris的2到150行数据
1 #coding:utf-8 2 import pandas as pd 3 import numpy as np 4 5 class KNNa(object): 6 7 #获取训练数据集 8 def getTrainData(self): 9 dataSet = pd.read_csv('C:pythonworkpractice_datairis.csv', header=None) 10 dataSetNP = np.array(dataSet[1:150]) 11 trainData = dataSetNP[:,0:dataSetNP.shape[1]-1] #获得训练数据 12 labels = dataSetNP[:,dataSetNP.shape[1]-1] #获得训练数据类别 13 return trainData,labels 14 #得到测试数据的类别 15 def classify(self, testData, trainData, labels, k): 16 #计算测试数据与训练数据之间的欧式距离 17 dist = [] 18 for i in range(len(trainData)): 19 td = trainData[i,:] #训练数据 20 dist.append(np.linalg.norm(testData - td)) #欧式距离 21 dist_collection = np.array(dist) #获得所有的欧氏距离,并转换为array类型 22 dist_index = dist_collection.argsort()[0:k] #按升序排列,获得前k个下标 23 k_labels = labels[dist_index] #获得对应下标的类别 24 25 #计算k个数据中,类别的数目 26 k_labels = list(k_labels) #转换为list类型 27 labels_count = {} 28 for i in k_labels: 29 labels_count[i] = k_labels.count(i) #计算每个类别出现的次数 30 testData_label = max(labels_count, key=labels_count.get) #次数出现最多的类别 31 return testData_label 32 33 34 if __name__ == '__main__': 35 kn = KNNa() 36 trainData,labels = kn.getTrainData() #获得训练数据集,iris从第2行到第150行的149条数据 37 testData = np.array([5.1, 3.5, 1.4, 0.2]) #取iris中的数据的第1行 38 k = 10 #最近邻数据数目 39 testData_label = kn.classify(testData,trainData,labels,k) #获得测试数据的分类类别 40 print '测试数据的类别:',testData_label
理论: