鄰近算法
或者說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:\pythonwork\practice_data\iris.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
理論: