k 近鄰演算法(KNN)

2021-09-20 13:23:45 字數 3848 閱讀 8986

import numpy as np

import operator

def createdataset():

group=np.array([[1.0,1.1],

[1.0,1.0],

[0.0,0.0],

[0.0,0.1]])

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

return group,labels

def classify0(inx,dataset,labels,k):#inx需要分類的測試集,dataset已有的訓練集,labels標籤

'''簡易版knn實現

'''#計算距離

datasetsize=dataset.shape[0]

diffmat=np.tile(inx,(datasetsize,1))-dataset#將矩陣縱向貼上複製

sqdiffmat=diffmat**2

sqdistances=sqdiffmat.sum(axis=1)

distances=sqdistances**0.5

#選擇距離最小的k個點

sorteddistindicies=distances.argsort()#返回的是陣列值從小到大的索引值

classcount={}

for i in range(k):

voteilabel=labels[sorteddistindicies[i]]

classcount[voteilabel]=classcount.get(voteilabel,0)+1#如果指定鍵不存在的話,返回0

sortedclasscount=sorted(classcount.items(),key=operator.itemgetter(1),reverse=true)#根據第乙個域進行排序

return sortedclasscount[0][0]

def file2matrix(filename):

'''csv檔案轉成屬性標籤矩陣

'''fr=open(filename)

arrayolines=fr.readlines()

fr.close()

numberoflines=len(arrayolines)

returnmat=np.zeros((numberoflines,3))

classlabelvector=

index=0

for line in arrayolines:

line=line.strip()

listfromline=line.split('\t')

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

index+=1

return returnmat,classlabelvector

def autonorm(dataset):

'''歸一化特徵

'''minvals=dataset.min(0)#從列中選取最小值

maxvals=dataset.max(0)

ranges=maxvals-minvals

normdataset=np.zeros(np.shape(dataset))

m=dataset.shape[0]

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

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

return normdataset,ranges,minvals

def datingclasstest():

horatio=0.10#設定測試集比率

datingdatamat,datinglabels=file2matrix('.\machinelearninginaction\ch02\datingtestset2.txt')

normmat,ranges,minvals=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('分類器返回:%d;真實的結果:%d'%(classifierresult,datinglabels[i]))

if classifierresult != datinglabels[i]:

errorcount+=1

print('總錯誤率:%f'%(errorcount/numtestvecs))

def img2vector(filename):

'''將乙個32*32的二進位制影象矩陣轉換成1*1024的向量

'''returnvect=np.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

import os

def handwriteclasstest():

hwlabels=

trainingfilelist=os.listdir('./machinelearninginaction/ch02/trainingdigits')

m=len(trainingfilelist)

trainingmat=np.zeros((m,1024))

for i in range(m):

filenamestr=trainingfilelist[i]

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

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

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

testfilelist=os.listdir('./machinelearninginaction/ch02/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('./machinelearninginaction/ch02/testdigits/%s'%filenamestr)

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

print('分類器返回:%d;真實的結果:%d'%(classifierresult,classnumstr))

if classifierresult!=classnumstr:

errorcount+=1.0

print('錯誤總數:%d'%errorcount)

print('總錯誤率:%f'%(errorcount/mtest))

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時,演算法便成了最近鄰演算法,即尋找最近的那個鄰居。為何要找鄰居?打個比方來說,假設你來到乙個陌生的村莊,現在你要找到與...