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