1.k鄰近演算法原理
k鄰近演算法通過計算不同特徵值間的距離進行分類
存在乙個樣本資料集合,也稱為訓練樣本集,樣本集中每個資料都存在標籤。輸入沒有標籤的新資料後,將輸入資料中的每個特徵值和訓練樣本集進行比較,然後選出特徵最相似的資料集的標籤作為輸入資料集標籤。一般來說我們選取訓練樣本集中前k個相似資料,然後選取k個相似資料中出現最多的標籤作為輸入資料標籤
2.python**實現
import numpy as np
import pylab as pl
import operator
#k鄰近演算法
def classify0(inx, dataset, labels, k):
m = dataset.shape[0]
diff = np.tile(inx,(m,1)) - dataset
sqdiff = diff ** 2
sqdistances = sqdiff.sum(axis=1)
distance = sqdistances ** 0.5
sorteddistindicies = distance.argsort()
classcount = {}
for i in range(k):
label = labels[sorteddistindicies[i]]
classcount[label] = classcount.get(label,0) + 1
sortedclasscount = sorted(classcount.iteritems(),key=operator.itemgetter(1),reverse=true)
return sortedclasscount[0][0]
#將檔案轉化為陣列
def file2data(filename):
fr = open(filename)
lines = fr.readlines()
n = len(lines)
returndata = np.zeros((n,3))
labels =
index = 0
for line in lines:
line = line.strip()
listfromline = line.split('\t')
returndata[index,:] = listfromline[0:3]
index += 1
return returndata, labels
#將資料歸一化處理
def autonorm(dataset):
minvals = dataset.min(0)
maxvals = dataset.man(0)
ranges = maxvals - minvals
normdataset = np.zeros(np.shape(dataset))
m = dataset.shape[0]
normdataset = dataset - np.tile(minvals, (m,1))
normdataset = normdataset/np.tile(ranges,(m,1))
return normdataset, ranges, minvals
之後我們將k鄰近演算法用於手寫識別系統
我們的資料放在兩個目錄裡面,其中乙個為訓練資料,包含大約2000個樣本,乙個是測試資料報含大約為900個樣本,其中的每個樣本資料如上圖所示,由0和1組成,其中有32行和32列
#將圖轉化為陣列
def img2vector(filename):
vector = np.zeros((1,1024))
fr = open(filename)
for i in range(32):
line = fr.readline()
for j in range(32):
vector[0,32*i+j] = int(line[j])
return vector
#手寫字型的處理
def handwritingclasstest():
labels =
trainingfilelist = os.listdir('trainingdigits')
m = len(trainingfilelist)
traindata = np.zeros((m,1024))
for i in range(m):
filenamestr = trainingfilelist[i]
filename = filenamestr.split('.')[0]
classnum = int(filename.split('_')[0])
traindata[i,:] = img2vector('trainingdigits/%s'%filenamestr)
testfilelist = os.listdir('testdigits')
errorcount = 0.0
mtest = len(testfilelist)
for i in range(mtest):
filenamestr = testfilelist[i]
filename = filenamestr.split('.')[0]
classnum = int(filename.split('_')[0])
vectortest = img2vector('testdigits/%s'%filenamestr)
classresult = classify0(vectortest, traindata, labels, 3)
if (classresult != classnum) : errorcount += 1.0
print 'error rate is %f' %(errorcount/float(mtest))
機器學習演算法 K鄰近演算法
coding utf 8 author whf from numpy import import operator def classify inx,dataset,labels,k 得到資料集的行數 shape方法用來得到矩陣或陣列的維數 datasetsize dataset.shape 0 t...
機器學習 K 鄰近演算法 KNN
k 鄰近演算法 有監督演算法 演算法工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每乙個資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新資料的每乙個特徵與樣本集中資料對應的特徵進行比較,然後演算法提供樣本集中特徵最相似資料 最鄰近 的分類標...
機器學習 k鄰近演算法 KNN
title 機器學習 k鄰近演算法 knn date 2019 11 16 20 20 41 mathjax true categories 外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 img ae8zaru7 1573908679258 1573907207887.png 現在我們...