1. 程式人生 > >Python實現KNN算法

Python實現KNN算法

都是 object array odin 決定 文件是否存在 line Coding .get

Python實現Knn算法

  關鍵詞:KNN、K-近鄰(KNN)算法、歐氏距離、曼哈頓距離

   KNN是通過測量不同特征值之間的距離進行分類。它的的思路是:如果一個樣本在特征空間中的k個最相似(即特征空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。K通常是不大於20的整數。KNN算法中,所選擇的鄰居都是已經正確分類的對象。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。

在KNN中,通過計算對象間距離來作為各個對象之間的非相似性指標,避免了對象之間的匹配問題,在這裏距離一般使用歐氏距離或曼哈頓距離:同時,KNN通過依據k個對象中占優的類別進行決策,而不是單一的對象類別決策。這兩點就是KNN算法的優勢。

KNN算法的思想總結:就是在訓練集中數據和標簽已知的情況下,輸入測試數據,將測試數據的特征與訓練集中對應的特征進行相互比較,找到訓練集中與之最為相似的前K個數據,則該測試數據對應的類別就是K個數據中出現次數最多的那個分類,其算法的描述為:

1)計算測試數據與各個訓練數據之間的距離;
2)按照距離的遞增關系進行排序;
3)選取距離最小的K個點;
4)確定前K個點所在類別的出現頻率;
5)返回前K個點中出現頻率最高的類別作為測試數據的預測分類。

#coding:utf-8
import requests, json, time, re, os, sys, time
import urllib2
import random import numpy as np #設置為utf-8模式 reload(sys) sys.setdefaultencoding( "utf-8" ) #讀取文本文件,構建二維數組 def readDataFile(filename,format): if format: pass else: format = , list = [] #去除首位空格 filename = filename.strip() #判斷數據文件是否存在 if os.path.isfile(filename):
pass file_object = open(filename,rb) lines = file_object.readlines() for line in lines: tmp = [] line = line.strip() for value in line.split(format)[:-1]: tmp.append(float(value)) tmp.append(line.split(format)[-1]) list.append(tmp) else: print "%s is not exists " % (filename) return list #讀取文本數據,拆分原始數據為特征和標簽,返回特征值和標簽值 def createData(filename,format=,): data_label = readDataFile(filename,format) if len(data_label) > 0: label = [] data = [] #data_label = [[1,100,123,‘A‘],[2,99,123,‘A‘],[100,1,12,‘B‘],[99,2,23,‘B‘]] for each in data_label: label.append(each[-1]) data.append(each[:-1]) return data,label #根據輸入數據和測試數據,進行分類 def calculateDistance(input,data,label,k): classes = Error if len(data[0])==0 or len(label) == 0: print data or label is null pass elif k > len(data) : print "k : %s is out of bounds" % (k) pass elif len(input) <> len(data[0]): print "特征變量值不夠,輸入變量特征個數為:%s,訓練特征變量個數為:%s" % (len(input),len(data[0])) pass else: result = [] length = len(input) for i in range(len(data)): sum = 0 for j in range(length): #pow(5,2) 標識5的平方為25,取兩點之間的距離的平方並累加 sum = sum + pow(input[j] - data[i][j],2) #取平方根 sum = pow(sum,0.5) result.append(sum) #print result result = np.array(result) #argsort()根據元素的值從小到大對元素進行排序,返回下標 sortedDistIndex = np.argsort(result) #統計前k個數中各個標簽的個數 classCount={} for i in range(k): voteLabel = label[sortedDistIndex[i]] ###對選取的K個樣本所屬的類別個數進行統計 #dict.get(key, default=None) 返回指定鍵的值,如果值不在字典中返回默認值None。 classCount[voteLabel] = classCount.get(voteLabel,0) + 1 ###選取出現的類別次數最多的類別 maxCount = 0 for key,value in classCount.items(): if value > maxCount: maxCount = value classes = key return classes filename = /home/shutong/jim/crawl/data.csv data,label = createData(filename) input = [1,20] k = 4 result = calculateDistance(input,data,label,k) print input,result

其中測試數據如圖:

技術分享圖片

輸入數據為:input = [1,20],預測它的標簽為A還是B?

技術分享圖片

最終預測結果為:A

Python實現KNN算法