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演算法是一種有監督的分類演算法,輸入同樣為樣本特徵值向量以及對應的類標籤,輸出則為具有分類功能的模型,能夠根據輸入的特徵值 分類結果。核心原理就是,與待分類...