k 近鄰演算法(KNN)演算法概述(分類器)

2021-08-20 18:13:36 字數 3562 閱讀 9279

knn通過測量不同特徵值之間的距離進行分類。大致思路:乙個樣本在k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某乙個類別。那麼該樣本也屬於這個類別。

用圖來舉例子

1.資料預處理

主要是將提供的資料集處理成函式可以處理的資料

def

file2matrix

(filename):

fr = open(filename)

arrayoflines = fr.readlines()

numberoflines = len(arrayoflines)

returnmat = zeros((numberoflines,3))

classlabelvector =

index = 0

for line in arrayoflines:

line = line.strip()

listfromline = line.split("\t")

returnmat[index,:] = listfromline[0:3] # 第index行的資料

index+=1

return returnmat,classlabelvector

當多個維度的資料我們認為是同等重要的時候,通常採用的方法是將數值歸一化,這樣可以避免數字差值對計算結果造成的影響。

2.1歸一化公式

newvalue = (oldvalue-min)/(max-min)

2.2 歸一化(正則化)**實現
## normalization

defautonorm

(dataset):

minvals = dataset.min(0) ## 0 means 陣列的第二維(縱列)

maxvals = dataset.max(0)

ranges = maxvals-minvals

normdataset = zeros(shape(dataset))

m = dataset.shape[0] #shape[1]為第二維的長度(橫列),shape[0]為第一維的長度(縱列)

## newvalue = (oldvalue-min)/(max-min)

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

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

return normdataset,ranges,minvals

需要注意的是,sklearn提供了函式,也可以直接呼叫sklearn的api

from sklearn import preprocessing

returnmat,classlabel = file2metrix("datingtestset2.txt")

horatio = 0.10

num_neighbors = 3

normmat = preprocessing.normalize(returnmat,'l2')

演算法的原理很簡單就不贅述了,直接上**吧

classify0()有四個輸入引數:用於分類的輸入向量inx,輸入的訓練樣本集為dataset,標籤向量labels,最後的引數k表示選擇最近鄰居的數目

def

classify0

(inx, dataset, labels, k):

datasetsize = dataset.shape[0]

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

sqdiffmat = diffmat**2

# axis代表的是第幾維的陣列 0為1維,1為2維

sqdistances = sqdiffmat.sum(axis=1)

distances = sqdistances**0.5

# argsort()函式是將x中的元素從小到大排列,提取其對應的index(索引),然後輸出到y

sorteddistindicies = distances.argsort()

classcount={}

for i in range(k):

voteilabel = labels[sorteddistindicies[i]]

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

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

return sortedclasscount[0][0]

採用sklearn的api實現knn演算法

from sklearn import neighbors

deftestknn

(): returnmat,classlabel = file2metrix("datingtestset2.txt")

horatio = 0.10

## 測試集的數量

num_neighbors = 3

##選擇k的數量

normmat = preprocessing.normalize(returnmat,'l2')

m = normmat.shape[0]

numtestvecs = int(m*horatio)

classifier = neighbors.kneighborsclassifier(num_neighbors,weights='distance')

classifier.fit(returnmat[numtestvecs:,],classlabel[numtestvecs:])

### predict 來得到**的結果

error_count = 0

for item,result in zip(returnmat[:numtestvecs],classlabel[:numtestvecs]):

#告訴模型這是乙個example,而不是多個

test_value = item.reshape(1,-1)

predict_result = classifier.predict(test_value)[0]

print

"predicted output:",classifier.predict(test_value)[0]

if predict_result != result:

error_count +=1

print

"error_rate is %f" % (error_count/float(m*0.9))

K近鄰(KNN) 分類演算法

k近鄰 knn 分類演算法 knn是non parametric分類器 不做分布形式的假設,直接從資料估計概率密度 是memory based learning.knn不適用於高維資料 curse of dimension machine learning的python庫很多,比如mlpy 更多pa...

K NN演算法(K 近鄰演算法)

k nn 演算法是一種分類演算法。所謂 k近鄰演算法,即是 給定乙個 訓練資料集,對新的 輸入例項,在 訓練資料集中找到與 該例項最鄰近的 k個例項 也就是k個 鄰居 這k 個例項的多數屬於某個 類,就把該輸入 例項分類到 這個類中。例如 如果k 3,綠 色圓點的最近的3個 鄰居是2個 紅色小三角形...

K 近鄰演算法 KNN

knn k nearest neighbor 假設訓練集有記錄 r1 r2,rn共n條,訓練集的特徵向量及其對應的類別都是已知的,每個記錄的特徵向量為 t1 t2,tk共k個特徵,待測試的記錄為ru 1 計算ru 的特徵向量與訓練集的每條記錄 即r1 r2,rn 的特徵向量的歐式距離,選取距離最小的...