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.pyimport 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演算法 工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且...