k 近鄰原理

2021-08-22 19:30:01 字數 3541 閱讀 1288

對於未知類別資料集中的點與當前點的距離

1. 計算已知類別資料集中的點與當前點的距離

2.按照距離依次排序

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

4.確定前k個點所在類別的出現概率

5.返回前k個點出現頻率最高的類別作為當前點**分類

概述:

knn演算法本身簡單有效,它是一種lazy-learning演算法;

分類器不需要使用訓練集進行訓練,訓練時間複雜度為0;

knn分類的計算複雜度和訓練集中的文件數目成正比,也就是說,如果訓練集中文件總數為n,那麼knn的分類時間複雜度為o(n)。

該演算法的三個基本要素:

1. k值的選擇;

2. 距離度量;

3. 分類決策規則

問題:

該演算法在分類時有個主要的不足是,當樣本不平衡時,如乙個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入乙個新樣本時,該樣本的k個鄰居大容量的樣本占多數。

解決:

不同的樣本給予不同權重項。

**如下:

import numpy as np

import operator

defcreatedataset

(): group = np.array([[1.0,1.1],[1.0,1.0],[0.0,0.0],[0,0.1]])

labels = ['a','a','b','b']

return group,labels

defclassify0

(inx,dataset,labels,k):

datasetsize = dataset.shape[0]

diffmat = np.tile(inx, (datasetsize,1)) - dataset

sqdiffmat = diffmat ** 2

sqdistances = sqdiffmat.sum(axis = 1)

distance = sqdistances **0.5

sorteddistindicies = distance.argsort()

classcount = {}

for i in range(k):

votelabel = labels[sorteddistindicies[i]]

classcount[votelabel] = classcount.get(votelabel,0) + 1

sortedclasscount = sorted(classcount.iteritems(),key=operator.itemgetter(1),reverse=true)

return sortedclasscount[0][0]

deffile2matrix

(filename):

fr = open(filename)

arrayoflines = fr.readlines()

numoflines = len(arrayoflines)

returnmat = np.zeros((numoflines,3))

classlabelvector =

index = 0

for line in arrayoflines:

line = line.strip()

listfromline = line.split('\t')

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

index += 1

return returnmat,classlabelvector

defautonorm

(dataset):

minvals = dataset.min(0)

maxvals = dataset.max(0)

ranges = maxvals - minvals

m = dataset.shape[0]

normdataset = np.zeros(np.shape(dataset))

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

normdataset = normdataset / np.tile(ranges,(m,1))

return normdataset,ranges,minvals

defdatingclasstest

(): horatio = 0.1

datingdatamat,datinglabels = file2matrix('datingtestset2.txt')

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],4)

print ('the classifier came back with: %d , the real answer is : %d' %(classifierresult, datinglabels[i]))

if (classifierresult != datinglabels[i]):

errorcount += 1.0

print ('total result is : %f' %(errorcount / float(numtestvecs))

defclassifyperson

(): resultlist = ['not at all', 'in small does','in large does']

input_man= [20000, 10, 5]

datingdatamat,datinglabels = file2matrix('datingtestset2.txt')

normmat,ranges,minvals = autonorm(datingdatamat)

result = classify0((input_man - minvals) / ranges,normmat,datinglabels,3)

print ('you will probably like this person:' , resultlist[result-1])

if __name__ == '__main__':

# group,labels = createdataset()

# test = classify0([3,3],group,labels,3)

# print test

classifyperson()

output: a

k近鄰法原理及程式設計實現

給定乙個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最鄰近的k個例項,這k個例項的多數屬於某個類,就把該輸入例項分為這個類。1.距離度量 兩個例項之間的距離可以用l pl p lp 範數來定義,其中p可以選擇。l pl p lp 範數的定義為 這裡面的x ix i xi 和x jx j x...

k 近鄰演算法

此文章參考機器學習實戰一書,具體的理論知識可以參考該書。本文的初衷只是為了做乙個複習,將學過的知識加以整理,其中不免有一定的錯誤。2.k 近鄰演算法的原理介紹 k 近鄰演算法通過測量不同的特徵值之間的距離進行分類。它的工作原理如下 存在乙個樣本的資料集合,也成為訓練樣本集合。並且樣本集中的每個資料都...

走進K近鄰

k最近鄰 k nearest neighbour,knn 分類演算法的思路是 如果乙個樣本在特徵空間中的k個最相似 即特徵空間中最鄰近 的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。k近鄰演算法的想法很簡單,類似於多數表決,關鍵點是參與多數表決的人是離你最近的k個人。給定乙個例項,首先從訓...