knn演算法具體描述可以參見李航的《統計學習方法》
knn演算法的偽碼過程如下:
(1)計算已知類別資料集中的點與當前點之間的距離;
(2)按照距離遞增次序排序;
(3)選取與當前點距離最小的k個點;
(4)確定前k個點所在類別的出現頻率;
(5)返回前k個點出現頻率最高的類別作為當前點的**分類;
knn**詳解如下:
def classify0(inx, dataset, labels, k):
datasetsize = dataset.shape[0] #首先獲取已知類別資料點的個數,既輸入特徵矩陣的行數
diffmat = tile(inx, (datasetsize,1)) - dataset
#tile函式是numpy庫中的乙個模組,此處具體的功能是講向量inx按照行方向重複datasetsize次,列方向重複1次。
sqdiffmat = diffmat**2 #求矩陣diffmat中每個元素的平方
sqdistances = sqdiffmat.sum(axis=1) #將矩陣sqdiffmat每一行求和
distances = sqdistances**0.5
sorteddistindicies = distances.argsort()
#argsort()函式是numpy的模組,此處用來返回distances元素從小到大排序好之後的索引
classcount={} #建立字典,將用來存放k個點中的標籤種類和對應的出現次數
for i in range(k):
voteilabel = labels[sorteddistindicies[i]] #取到前k個點的類別
classcount[voteilabel] = classcount.get(voteilabel,0) + 1
#此句與迴圈結合,目的是用來統計某一類別標籤在k個點中出現的次數
#get函式,用來返回鍵voteilabel的值,如果不存在,就返回0,如果存在就返回該值,並加1
sortedclasscount = sorted(classcount.iteritems(), key=operator.itemgetter(1), reverse=true)
#sorted()函式用法:python的build-in函式 sorted(iterable, cmp=none, key=none, reverse=false) --> new sorted list
#iterable是可迭代型別;
#cmp:用於比較的函式,比較什麼由key決定;
#key:用列表元素的某個屬性或函式(此例中是函式)進行作為關鍵字,有預設值,迭代集合中的一項;
#reverse:排序規則. reverse = true 降序 或者 reverse = false 公升序,有預設值。
#返回值:是乙個經過排序的可迭代型別,與iterable一樣。
#iteritems()函式用法:此處將字典classcount轉變成可迭代的物件,書上說是分解為元祖列表
#operator.itemgetter(1):定義乙個函式,用於獲取物件的哪些維的資料,引數為一些序號(即需要獲取的資料在物件中的序號)
return sortedclasscount[0][0] #返回出現次數最大的那個類別標籤
def file2matrix(filename): #將文字記錄轉換為numpy的解析程式
fr=open(filename) #開啟檔案,並且返回乙個表示檔案的物件
arrayolines = fr.readlines() #readlines()方法讀取整個檔案所有行,儲存在乙個列表(list)變數中,每行(字串型別)作為乙個元素,但讀取大檔案會比較佔記憶體。
numberoflines = len(arrayolines) #獲取列表的元素個數,既讀入檔案的行數
returnmat = zeros((numberoflines,3)) #zeros函式的返回物件是numpy中的array陣列結構
classlabelvector = #建立乙個空列表,用來存放類別
index = 0
for line in arrayolines:
line = line.strip() #刪除每一行資料的頭和尾的空格,line是型別是列表的元素,既是字串
listfromline = line.split('\t') #以製表符對字串進行分割,將乙個字串分割成多個字串組成的列表
returnmat[index, : ] = listfromline[0:3] #將列表listfromline前3個資料,賦給returnmat第index行的,前2列
index+=1
return returnmat,classlabelvector #返回存放特徵的array陣列(元素以字串的型別存放),和存放類別的列表
由於各特徵值之間的差異比較大,需要歸一化,需要將每個點的三個特徵值轉化到(0,1)區間內:
def autonorm(dataset):
minvals=dataset.min(0)
maxvals=dataset.max(0)
ranges= maxvals-minvals
normdataset=zeros(shape(dataset))
m=dataset.shape[0] #返回dataset第一維度的數目,既是行數
normdataset=dataset-tile(minvals,(m,1))
normdataset=normdataset/tile(range,(m,1))
return normdataset,ranges,minvals
一般用已有資料的90%作為訓練樣本,10%去測試分類器
def datingclasstest(): #測試**
horatio=0.10
datingdatamat,datinglabels=file2matrix('datingtestset.txt')
normsmat,ranges,minvals=autonorm(datingdatamat) #歸一化特徵矩陣
m=normsmat.shape[0]
numtestvecs=int(m*horatio) #用來測試的資料的數量numtestvecs
errorcount=0.0
for i in range(numtestvecs):
classifierresult=classify0(normmat[i, : ],normsmat[numtestvecs:m,:],datinglabels[numtestvecs:m],3)
#資料的前numtestvecs行用來測試,後面的剩下的用來訓練
print "the classifier came back with: %d, the real answer is: %d" % (classifierresult, datinglabels[i])
if(classifierresult != datinglabels[i]): errorcount +=1.0
print "the total error rate is: %f" % (errorcount/float(numtestvecs))
print errorcount
def classifyperson():
resultlist=['not at all','in small doses','in large doses']
percenttats=float(raw_input("percentage of time spent playing video games?"))
ffmiles=float(raw_input("frequent flier miles earned per year?"))
icecream=float(raw_input("liters of ice cream consumed per year?"))
datingdatamat,datinglabels=file2matrix('datingtestset2.txt')
normsmat,ranges,minvals=autonorm(datingdatamat)
inarr=array([ffmiles,percenttats,icecream])
classifierresult=classify0((inarr-minvals)/ranges,normsmat,datinglabels,3)
print "you will probably like this person:",resultlist[classifierresult-1]
《機器學習實戰》 K 近鄰演算法
基本原理 通過計算新資料與給定的樣本資料之間的距離,來確定相似度排名 然後取前k個最相似的樣本,統計這k 一般不大於20 個樣本中出現最多的分類,設為新資料的分類。新資料,訓練樣本集,樣本資料標籤 即分類 最近鄰 前k個最相似資料 最近鄰標籤 演算法實施 首先提取要比較的特徵,確定各特徵的權重,進行...
機器學習實戰 K 近鄰演算法
簡單的說,k 近鄰演算法採用測量不同特徵值之間的距離辦法進行分類.收集資料 可以使用任何方法。準備資料 距離計算所需要的數值,最好是結構化的資料格式。分析資料 可以使用任何方法。訓練演算法 此步驟不適用於k 近鄰演算法。測試演算法 計算錯誤率。使用演算法 首先需要輸入樣本資料和結構化的輸出結果,然後...
機器學習實戰 k 近鄰演算法
本系列是基於 機器學習實戰 這本書做的讀書筆記,原書採用python2作為工具,我則將原書 改為用python3編寫並記錄在此系列中。我將把書中對這些機器學習演算法的定義謄上,然後寫下自己對該演算法的通俗理解,之後貼出書中演算法清單中的 本書講解的第乙個機器學習演算法是k 近鄰演算法 knn 它的工...