k 近鄰演算法

2021-07-08 19:00:06 字數 3326 閱讀 9097

此文章參考機器學習實戰一書,具體的理論知識可以參考該書。本文的初衷只是為了做乙個複習,將學過的知識加以整理,其中不免有一定的錯誤。

2.k-近鄰演算法的原理介紹

k-近鄰演算法通過測量不同的特徵值之間的距離進行分類。它的工作原理如下:存在乙個樣本的資料集合,也成為訓練樣本集合。並且樣本集中的每個資料都存在標籤,即我們知道樣本集中的資料與其對應的分類的關係。輸入沒有標籤的資料之後,將輸入資料的特徵值玉樣本集中資料的特徵值之間進行乙個距離的計算,。提取樣本集中特徵最相似的分類標籤。一般說來,我們只選擇樣本集中特徵值最相似的前k個資料,這就是k-近鄰中k值的由來。通常k是不大於20的常數。

3.k-經歷演算法的過程

計算一直類別資料集中的點與當前點的距離;

按照距離依次進行排序:

選取與當前距離最小的k個點:

確定前k個點所在類別的出現頻率

4

.例項說明

5.實現過程

首先需要讀取放在文字中的這些約會者的資訊,假設一共有n個人,那麼通過讀取可以得到乙個nx3的矩陣,並得到訓練集中相對應的約會者的標籤,這是乙個nx1的矩陣向量。對應的python實現**如下所示:

#定義讀取檔案的函式,將文資訊解析為可用的資料

def file2matrix(filename):

fr=open(filename)

arraylines=fr.readlines() #得到檔案的行數

numberoflines=len(arraylines)

returnmat=zeros((numberoflines,3)) #定義返回的矩陣

classlabelvector= #定義返回的類別向量

index=0

for line in arraylines:

line=line.strip()

listfromline=line.split('\t')

returnmat[index,:]=listfromline[0:3]

index += 1

return returnmat,classlabelvector

因為考慮到有的特徵值的值比較大,例如飛行的總里程,為了避免有的特徵值對於結果的影響,需要將特徵值進行乙個歸一化的處理,將所有的特徵值都歸一化到0-1之

間,將每個特徵值除以最大值與最小值的差值就可以將特徵值進行歸一化。將上一步得到的矩陣進行歸一化處理後就可以得到乙個值都在0-1的矩陣,python**如下:

#歸一化特徵值,即將特徵值都限定在0——1的範圍內

def autonorm(dataset):

minvals = dataset.min(0) #得到每一列的最小值

maxvals = dataset.max(0) #獲取每一列的最大值

ranges = maxvals - minvals

normdataset = zeros(shape(dataset)) #初始化特徵矩陣

m = dataset.shape[0] #原始矩陣的行數

normdataset = dataset - tile(minvals, (m,1))

normdataset = normdataset/tile(ranges, (m,1)) #element wise divide

return normdataset, ranges, minvals

最後需要對訓練的分類器進行乙個測試,從樣本集中抽取一定的樣本作為測試集,通過分類處理與開始預設的分類進行乙個比較,就可以得到分類的準確率。python**如下;

def datingclasstest():

horatio = 0.10 #hold out 10%

datingdatamat,datinglabels = file2matrix('datingtestset2.txt') #load data setfrom file

normmat, ranges, minvals = autonorm(datingdatamat)

m = normmat.shape[0]

numtestvecs = int(m*horatio)

errorcount = 0.0

for i in range(numtestvecs):

classifierresult = classify0(normmat[i,:],normmat[numtestvecs:m,:],datinglabels[numtestvecs:m],3)

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)

K 近鄰演算法

k 近鄰演算法採用測量不同特徵值之間的距離方法進行分類。優點 精度高 對異常值不敏感 無資料輸入假定 缺點 計算複雜度高 空間複雜度高 適用資料範圍 數值型和標稱型 工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入...

K 近鄰演算法

首先,我們將 k 近鄰演算法的基本理論 其次我們將使用python從文字檔案中匯入並解析資料 再次,討論當存在許多資料 的時,如何避免計算距離時可能碰到的一些常見錯誤 最後,利用實際的例子講解如何使用k 近鄰演算法改進約會 1.1 knn演算法 工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且...

K 近鄰演算法

k 近鄰演算法 有點 精度高,對異常值不敏感,無資料輸入假定。缺點 計算複雜度高,空間複雜度高。使用範圍 數值型和標稱型。python from numpy import def createdataset group array 1.0,1.1 1.0,1.0 0.0,0.0 0.0,0.1 la...