K近鄰演算法

2021-07-15 04:49:59 字數 4375 閱讀 7627

k近鄰演算法說穿了就是對於每個要分類的用例,先和每乙個樣本求距離,然後找出距離最近的k個樣本,這k個樣本裡面出現次數最多的類別就是這個樣例的類別。每乙個需要分類的用例都需要和每乙個樣本求距離,然後排序,求次數出現最多的類別,效率不高。

from numpy import *

import operator

import knn

from os import listdir

def createdataset():

group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])

labels = ['a','a','b','b']

return group, labels

def classify0(inx, dataset, labels, k):

datasetsize = dataset.shape[0]

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

sqdiffmat = diffmat**2

sqdistance = sqdiffmat.sum(axis=1)

distances = sqdistance**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.iteritems(), key=operator.itemgetter(1), reverse=true)

return sortedclasscount[0][0]

def file2matrix(filenmae):

fr = open(filenmae)

arrayoflines = fr.readlines()

numbers = len(arrayoflines)

returnmat = zeros((numbers, 3))

classlabelvector =

index = 0

for line in arrayoflines:

line = line.strip()

listfromline = line.split('\t')

returnmat[index,:] = listfromline[0:3]

index = index + 1

return returnmat, classlabelvector

def autonorm(dataset):

minvals = dataset.min(0)

maxvals = dataset.max(0)

ranges = maxvals - minvals

normdataset = zeros(shape(dataset))

m = dataset.shape[0]

normdataset = dataset - tile(minvals, (m, 1))

normdataset = normdataset / tile(ranges, (m, 1))

return normdataset, ranges, minvals

def datingclasstest():

horatio = 0.10

datingdatamat, datinglabels = knn.file2matrix('datingtestset2.txt')

normmat, ranges, minvals = knn.autonorm(datingdatamat)

m = normmat.shape[0]

numtestvecs = int(m*horatio)

errorcount = 0.0

for i in range(numtestvecs):

classifierresult = classify0(normmat[i, :], normmat[numtestvecs:m, :], datinglabels[numtestvecs:m], 3)

print "the classifier came back with: %d, the real answer is: %d" % (classifierresult, datinglabels[i])

if classifierresult != datinglabels[i]:

errorcount += 1.0

print "the total error rate is: %f" % (errorcount/float(numtestvecs))

def img2vector(filename):

returnvect = zeros((1, 1024))

fr = open(filename)

for i in range(32):

linestr = fr.readline()

for j in range(32):

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

return returnvect

def handwritingclasstest():

hwlabels =

trainingfilelist = listdir('trainingdigits')

m = len(trainingfilelist)

trainingmat = zeros((m, 1024))

for i in range(m):

filenamestr = trainingfilelist[i]

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

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

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

testfilelist = listdir('testdigits')

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('testdigits/%s' % filenamestr)

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

print "the classifier came back with: %d, the real answer is: %d" % (classifierresult, classnumstr)

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

print "\nthe total number of errors is: %d" % errorcount

print "\nthe total error rate is: %f" % (errorcount/float(mtest))

main函式呼叫knn.py
import knn

import scipy

# import matplotlib

# import matplotlib.pyplot as plt

datingdatamat, datinglabels = knn.file2matrix('datingtestset2.txt')

print(datingdatamat)

print(datinglabels)

# fig = plt.figure()

# ax = fig.add_subplot(111)

# ax.scatter(datingdatamat[:, 1], datingdatamat[:, 2])

# plt.show()

normmat, ranges, minvals = knn.autonorm(datingdatamat)

print(normmat)

knn.datingclasstest()

knn.handwritingclasstest()

k 近鄰演算法

此文章參考機器學習實戰一書,具體的理論知識可以參考該書。本文的初衷只是為了做乙個複習,將學過的知識加以整理,其中不免有一定的錯誤。2.k 近鄰演算法的原理介紹 k 近鄰演算法通過測量不同的特徵值之間的距離進行分類。它的工作原理如下 存在乙個樣本的資料集合,也成為訓練樣本集合。並且樣本集中的每個資料都...

K 近鄰演算法

k 近鄰演算法採用測量不同特徵值之間的距離方法進行分類。優點 精度高 對異常值不敏感 無資料輸入假定 缺點 計算複雜度高 空間複雜度高 適用資料範圍 數值型和標稱型 工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入...

K 近鄰演算法

首先,我們將 k 近鄰演算法的基本理論 其次我們將使用python從文字檔案中匯入並解析資料 再次,討論當存在許多資料 的時,如何避免計算距離時可能碰到的一些常見錯誤 最後,利用實際的例子講解如何使用k 近鄰演算法改進約會 1.1 knn演算法 工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且...