KNN演算法原理與實現

2021-07-23 15:28:39 字數 3530 閱讀 1233

knn (k-nearest neighbors)演算法不需要訓練過程,直接利用樣本之間的距離進行分類。演算法的基本過程是:給定乙個測試樣例,分別計算它與訓練集中所有樣本之間的距離,選取距離最小的k個訓練樣本對測試樣例的類別進行投票,最後將得票最多(在k個樣本中最多的類別)作為測試樣例的**類別。

需要注意的是,計算樣本與樣例距離時可以採用多種距離指標,如歐氏距離、曼哈頓距離等。k 的值也可以根據實際應用背景來靈活確定,一般地,我們選取20以內的值。

knn 演算法便於理解與解釋,且**準確率高。但當訓練集和測試集的樣本數較大時,會產生巨大的時間和空間開銷。

輸入:測試樣例向量 x,訓練樣本集d,訓練集類別向量l,近鄰數目k

輸出:**類別 l

for 訓練樣本 in d do:

計算訓練樣本與 x 之間的距離,儲存在向量dis中

將dis從小到大排序,得到sorted_dis

取sorted_dis的前k項,統計每一項對應的訓練樣本的類別

統計k個類別中,數量最多的那個,為l賦值

return l

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# knn algorithm in mlinaction

from numpy import *

import operator

defclassify

(inx, dataset, lables, k):

# 分類器主程式. inx為測試樣例向量,dataset為訓練集

datasize = dataset.shape[0] # lables 是與訓練集資料一一對應的類別向量,k 為選取的近鄰數目

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

sqdiffmat = diffmat**2

sqdistance = sqdiffmat.sum(axis=1)

distance = sqdistance**1 / 2

# 計算測試樣例與訓練集每個樣本的距離(歐氏距離)

sortindex = sqdistance.argsort() # 按距離排序

classcount = {}

for i in range(k): # 取距離最小的前k個訓練樣本進行投票(voting)

if lables[sortindex[i]] not

in classcount.keys():

classcount[lables[sortindex[i]]] = 0

classcount[lables[sortindex[i]]] += 1

maxcount = 0

for key in classcount.keys(): # voting, k個訓練樣本中最多的類別作為測試樣例的**樣本

if classcount[key] > maxcount:

maxcount = classcount[key]

resclass = key

return resclass

defloaddata

(filename1, filename2):

# 產生訓練集資料和測試集資料的函式

f1 = open(filename1, 'r') # 全集檔名

f2 = open(filename2, 'w') # 測試集檔名

linenum = 1000

horatio = 0.1

lablevec = # 訓練集樣本的類別向量

datamat = zeros((int(linenum * (1 - horatio)), 3)) # 訓練集樣本

testdatamat = zeros((int(linenum * horatio), 3)) # 測試集樣本

testlablevec = # 測試集樣例的類別向量

index = 0

for i in range(linenum):

line = f1.readline()

if i < linenum * horatio:

f2.write(line)

linevec = line.strip().split('\t')

testdatamat[i, :] = linevec[0:3]

else:

linevec = line.strip().split('\t')

datamat[i - 100, :] = linevec[0:3]

return datamat, lablevec, testdatamat, testlablevec

defdatanorm

(datamat, testdatamat):

# 資料標準化函式:(data-min)/(max-min)

max1 = datamat.max(0)

max2 = testdatamat.max(0)

min1 = datamat.min(0)

min2 = testdatamat.min(0)

max_min1 = max1 - min1

max_min2 = max2 - min2

m1 = datamat.shape[0]

m2 = testdatamat.shape[0]

normdatamat = (datamat - tile(min1, (m1, 1))) / tile(max_min1, (m1, 1))

normtestdatamat = (testdatamat - tile(min2, (m2, 1))) / \

tile(max_min2, (m2, 1))

return normdatamat, normtestdatamat

deftestclassify

(dataset, testdataset, lables, testlables):

# 演算法測試函式,返回**正確率

numright = 0

numtest = testdataset.shape[0]

for i in range(numtest):

lable = classify(testdataset[i, :], dataset, lables, 25)

if lable == testlables[i]:

numright += 1

return float(numright) / numtest

datamat, lablevec, testdatamat, testlablevec = loaddata(

'datingtestset.txt', 'testset.txt')

dataset, testdataset = datanorm(datamat, testdatamat)

ratio = testclassify(dataset, testdataset, lablevec, testlablevec)

print ratio

knn演算法原理與實現(1)

一 演算法原理與模型 knn演算法即最近鄰演算法,其原理非常簡單即根據給定的資料集,計算資料集中點的特徵到待分類資料的歐氏距離,然後選擇距離最近的k個作為判斷依據,這k個資料中出現類別最多的作為新輸入資料的label。模型用公式表示如下 二 python 實現 author gujun bill k...

KNN演算法原理與自實現

1.計算已知類別資料集中的點與當前點之間的距離 2.按照距離遞增次序排序 3.選擇與當前距離最小的k個點 4.確定前k個點所在類別的出現概率 5.返回前k個點出現頻率最高的類別作為當前點的 分類 距離計算 param v1 第乙個點的位置 param v2 第二個點的位置 return distan...

KNN演算法原理與python實現

knn演算法python實現 參考文獻 knn k nearest neighbor 演算法,顧名思義,其原理也就是 近朱者赤,近墨者黑 knn演算法是一種有監督的分類演算法,輸入同樣為樣本特徵值向量以及對應的類標籤,輸出則為具有分類功能的模型,能夠根據輸入的特徵值 分類結果。核心原理就是,與待分類...