k 近鄰 KNN 演算法的應用

2021-08-13 01:10:57 字數 2305 閱讀 2904

from numpy import *

from os import listdir

import operator

defclassify0

(inx, dataset, labels, k):

datasetsize = dataset.shape[0]

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

sqdiffmat = diffmat**2

sqdistances = sqdiffmat.sum(axis=1)

distances = sqdistances**0.5

sorteddistindicies = distances.argsort()

classcount={}

for i in range(k):

voteilabel = labels[sorteddistindicies[i]]

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

sortedclasscount = sorted(classcount.items(),

key=operator.itemgetter(1), reverse=true)

return sortedclasscount[0][0]

defimg2vector

(filename):

""" 返回每個檔案的前32行的前32個數字,即整個數字

:param filename:

:return:

"""returnvc = zeros((1, 1024))

fr = open(filename)

for i in range(32):

linestr = fr.readline()

for j in range(32):

returnvc[0, 32*i+j] = int(linestr[j])

return returnvc

defhandwriteclasstest

(): hwlables =

# 獲取該目錄下的檔案

trainingmatfilelist = listdir('trainingdigits')

# 檔案個數

m = len(trainingmatfilelist)

trainingmat = zeros((m, 1024))

# 對檔名進行切割並獲取訓練集

for i in range(m):

filenamestr = trainingmatfilelist[i]

filestr = filenamestr.split('.')[0]

classnumstr = int(filestr.split('_')[0])

# 獲取每個檔案的前32行的前32個數字,即整個數字

trainingmat[i, :] = img2vector('trainingdigits/%s' % filenamestr)

# testfilelist = listdir('testdigits')

testfilelist = listdir('test')

errorcount = 0.0

mtest = len(testfilelist)

# 測試

for i in range(mtest):

filenamestr = testfilelist[i]

# 切割出該檔案所代表的數字

filestr = filenamestr.split('.')[0]

classnumstr = int(filestr.split('_')[0])

# 獲取特徵變數,並判斷其是哪個數字

vectorundertest = img2vector('test/%s' % filenamestr)

classifierresult = classify0(vectorundertest, trainingmat, hwlables, 3)

print("返回結果為: %d, 答案為: %d" % (classifierresult, classnumstr))

if (classifierresult != classnumstr): errorcount += 1.0

print("錯誤的個數: %d" % errorcount)

print("錯誤率: %f" % (errorcount/float(mtest)))

handwriteclasstest()

K 近鄰演算法 KNN

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

k近鄰演算法 kNN

核心思想 前k個最相似資料中出現次數最多的類別,作為新資料的類別。核心函式 計算距離函式,投票函式 coding utf 8 import random import sys from collections import counter from operator import itemgette...

K近鄰演算法 KNN

k近鄰演算法 knn 何謂k近鄰演算法,即k nearest neighbor algorithm,簡稱knn演算法,單從名字來猜想,可以簡單粗暴的認為是 k個最近的鄰居,當k 1時,演算法便成了最近鄰演算法,即尋找最近的那個鄰居。為何要找鄰居?打個比方來說,假設你來到乙個陌生的村莊,現在你要找到與...