k近鄰(knn,k-nearestneighbor)分類演算法基本思想是:如果乙個樣本在特徵空間中的k個最相似,也就是特徵空間中k個最鄰近的樣本大多數屬於某乙個類別,則該樣本也屬於這個類別。類似與古話:近朱者赤,近墨者黑,背後自然也蘊藏著物以類聚,人以群分的思想!
演算法步驟:
1.對資料進行歸一化處理
2.求每個測試樣本基於訓練樣本的k個最近臨樣本
3.k個最近臨樣本所屬類別中最大的乙個即位測試樣本的類別。
優點:
1.容易理解,易於分類
2.適合多類別的分類問題
缺點:
1.每個測試樣本需要與所有訓練樣本進行求距離,計算量大
2.當各類樣本不平衡時,測試結果可能會趨向與樣本數量多的那一類。
k值的選擇:
k值過小,得到的近臨數太少,使得分類精度低,同時放大了雜訊的干擾;k值過大,當各類樣本不平衡時,測試結果可能會趨向與樣本數量多的那一類。k值的選擇一般小於訓練樣本的平方根。
例項:
《機器學習實戰》一書中手寫數字識別例子:
測試樣本:同訓練樣本
**:
from numpy import *
import operator
import os
def readdata(traindir, testdir):
trainfilelist = os.listdir(traindir)
testfilelist = os.listdir(testdir)
numsamples = len(trainfilelist)
trainx = zeros((numsamples, 1024))
trainy =
for i in xrange(numsamples):
filename = trainfilelist[i]
trainx[i, :] = readimgdata(traindir + filename)
label = int(filename.split('_')[0])
numsamples = len(testfilelist)
testx = zeros((numsamples, 1024))
testy =
for i in xrange(numsamples):
filename = testfilelist[i]
testx[i, :] = readimgdata(testdir + filename)
label = int(filename.split('_')[0])
return trainx, trainy, testx, testy
#readimgdata讀取每個文字內容
def readimgdata(filename):
row = 32
col = 32
filex = zeros((1, row*col))
filefp = open(filename)
for i in xrange(row):
linetemp = filefp.readline()
for j in xrange(col):
filex[0, i*row + j] = int(linetemp[j])
return filex
def knn(testx, trainx, trainy, k):
numsamples = trainx.shape[0]
diff = tile(testx, (numsamples, 1)) - trainx
squarediff = diff ** 2
squaredist = sum(squarediff, axis = 1)
dist = squaredist ** 0.5
sorteddist = argsort(dist)
classcount = {}
for i in xrange(k):
votelabel = trainy[sorteddist[i]]
classcount[votelabel] = classcount.get(votelabel, 0) + 1
maxcount = 0
for key, value in classcount.items():
if value > maxcount:
maxcount = value
maxindex = key
return maxindex
print "******start******"
traindir = './trainingdigits/'
testdir = './testdigits/'
trainx, trainy, testx, testy = readdata(traindir, testdir)
print "******data end******"
sumsamples = testx.shape[0]
right = 0
for i in xrange(sumsamples):
label = knn(testx[i], trainx, trainy, 3)
#print "label = %d" % label
if label == testy[i]:
right += 1
print "*****test end******"
print 'right = %d' % right
rate = float(right) / sumsamples
print 'rate = %f' % rate
**中readdata讀取樣本目錄中的資料,readimgdata讀取單個文字的資料,knn實現測試演算法。
實戰02 近朱者赤,近墨者黑 kNN
classify0 待判定的樣本向量,資料集矩陣,標籤向量,k值 選前k個 sqdiffmat.sum axis 1 表示同一行累加 axis 0表示同一列累加 pycharm ctrl a 全選 ctrl alt l 格式化 shell中 匯入模組 import knn from imp impo...
KNN演算法 鄰近演算法
knn演算法是機器學習裡面比較簡單的乙個分類演算法了,整體思想比較簡單 計算乙個點a與其他所有點之間的距離,取出與該點最近的k個點,然後統計這k個點裡面所屬分模擬例最大的,則點a屬於該分類。這樣講可能還有點迷糊,下面用乙個例子來說明一下 電影名稱 打鬥次數 接吻次數 電影型別 california ...
KNN演算法(鄰近演算法)
鄰近演算法 或者說k最近鄰 knn,k nearestneighbor 分類演算法是 資料探勘分類技術中最簡單的方法之一。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。knn演算法的核心思想 是如果乙個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某乙個類...