優點:進度高,對異常值不敏感,無資料輸入假定
缺點:計算複雜度高,空間複雜度高
適用資料範圍:數值型和標稱型
(1)計算已知類別資料集中的點與當前點的距離
(2)按照距離遞增次序排序,選取與當前點距離最小的 k 個點
(3)確定前 k 個點所在類別的出現頻率
(4)返回前 k 個點出現頻率最高的類別作為當前點的**分類
指在手寫裝置上書寫時產生的軌跡資訊轉化為具體字碼,本篇部落格重點非搭建手寫識別系統,而是幫助理解 knn。
(1)將(txt 文字)轉為乙個向量,即32*32的陣列轉化為1*1024的陣列(特徵向量)
(2)將特徵向量轉化為矩陣
(3)計算每個測試集中的特徵向量和訓練集中的特徵向量的距離,選取距離較小的前 k 個,該特徵向量對應的數字為 k 個**現次數最多的那個數字。
(1)轉化為1*1024特徵向量
(2)計算歐式距離,返回測試的類別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
(3)將每個向量合成矩陣,並對測試集中的每個樣本分類def classify0(inx, dataset, labels, k):
datasetsize = dataset.shape[0]
diffmat = tile(inx, (datasetsize,1)) - dataset # shape[0]得出dataset的行數,即樣本個數
sqdiffmat = diffmat**2 # tile(a,(m,n))將陣列a作為元素構造m行n列的陣列
sqdistances = sqdiffmat.sum(axis=1)
distances = sqdistances**0.5
sorteddistindicies = distances.argsort() # array.argsort(),得到每個元素的排序序號
classcount={} # sorteddistindicies[0]表示排序後排在第乙個的那個數在原來陣列中的下標
for i in range(k):
voteilabel = labels[sorteddistindicies[i]]
classcount[voteilabel] = classcount.get(voteilabel,0) + 1 # 從字典中獲取key對應的value,沒有key的話返回0
# sorted()函式,按照第二個元素即value的次序逆向(reverse=true)排序
sortedclasscount = sorted(classcount.items(), key=operator.itemgetter(1), reverse=true)
return sortedclasscount[0][0]
進入模組所在的資料夾,開啟 spyder,執行模組。然後在 ipython 控制台輸入以下**:def handwritingclasstest():
hwlabels =
# os模組中的listdir('str')可以讀取目錄str下的所有檔名,返回乙個字串列表
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)))
得到以下結果:import knn
knn.handwritingclasstest()
在 k = 3 的時候,錯誤率為1.2%。
利用python實現KNN分類器
雖然已經熟悉掌握了knn分類器,但是關鍵還是要實現一遍,參考一些資料之後,實現如下 加了注釋 該程式實現了knn演算法 import numpy import operator def knnclassifier inx,dataset,labels,k inx 被分類的測試樣本 向量形式 data...
Python實現的KNN分類器
coding utf 8 created on 2016 4 24 author taiji1985 import numpy as np import operator import matplotlib.pyplot as plt 建立乙個測試用的資料集 defcreatedataset x n...
kNN分類器和Python演算法實現
假設生活中你突然遇到乙個陌生人,你對他很不了解,但是你知道他喜歡看什麼樣的電影,喜歡穿什麼樣的衣服。根據以前你的認知,你把你身邊的朋友根據喜歡的電影型別,和穿什麼樣的衣服,簡單的分為了兩類,有錢的和沒錢的。那你該怎麼將這個陌生人分類呢?物以類聚,人以群分,你看他喜歡看的電影和穿衣服的衣服和那群人比較...