KNN算法--python實現


鄰近算法

或者說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

 

理論:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM