python 實現 KNN 分類器 手寫識別

2021-09-25 05:10:13 字數 3289 閱讀 2656

優點:進度高,對異常值不敏感,無資料輸入假定

缺點:計算複雜度高,空間複雜度高

適用資料範圍:數值型和標稱型

(1)計算已知類別資料集中的點與當前點的距離

(2)按照距離遞增次序排序,選取與當前點距離最小的 k 個點

(3)確定前 k 個點所在類別的出現頻率

(4)返回前 k 個點出現頻率最高的類別作為當前點的**分類

指在手寫裝置上書寫時產生的軌跡資訊轉化為具體字碼,本篇部落格重點非搭建手寫識別系統,而是幫助理解 knn。

(1)將(txt 文字)轉為乙個向量,即32*32的陣列轉化為1*1024的陣列(特徵向量)

(2)將特徵向量轉化為矩陣

(3)計算每個測試集中的特徵向量和訓練集中的特徵向量的距離,選取距離較小的前 k 個,該特徵向量對應的數字為 k 個**現次數最多的那個數字。

(1)轉化為1*1024特徵向量

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

(2)計算歐式距離,返回測試的類別

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]

(3)將每個向量合成矩陣,並對測試集中的每個樣本分類

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)))

進入模組所在的資料夾,開啟  spyder,執行模組。然後在  ipython 控制台輸入以下**:

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演算法實現

假設生活中你突然遇到乙個陌生人,你對他很不了解,但是你知道他喜歡看什麼樣的電影,喜歡穿什麼樣的衣服。根據以前你的認知,你把你身邊的朋友根據喜歡的電影型別,和穿什麼樣的衣服,簡單的分為了兩類,有錢的和沒錢的。那你該怎麼將這個陌生人分類呢?物以類聚,人以群分,你看他喜歡看的電影和穿衣服的衣服和那群人比較...