knn演算法 近朱者赤,近墨者黑

2021-06-27 21:30:41 字數 2955 閱讀 8143

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個最相鄰的樣本中的大多數屬於某乙個類...