python使用KNN演算法手寫體識別

2022-09-27 06:36:10 字數 2985 閱讀 7668

#!/usr/bin/python

#coding:utf-8

import numpy as np

import operator

import matplotlib

import matplotlib.pyplot as plt

import os

'''''

knn演算法

1. 計算已知類別資料集中的每個點依次執行與當前點的距離。

2. 按照距離遞增排序。

3. 選取與當前點距離最小的k個點

4. 確定前k個點所在類別的出現頻率

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

'''

'''''

inx為要分類的向量

dataset為訓練樣本

labels為標籤向量

k為最近鄰的個數

'''

def classify0(inx , dataset , labels , k):

datasetsize = dataset.shape[0]#datasetsize為訓練樣本的個數

diffmat = np.tile(inx , (datasetsize , 1)) - dataset#將inx擴充套件為datasetsize行,1列

sqdiffmat = diffmat**2

sqdistances = sqdi程式設計客棧ffmat.sum(axis=1)

distances = sqdistances**0.5

sorteddistindicies = distances.argsort()#返回的是元素從小到大排序後,該元素原來的索引值的序列

classcount = {}

for i in range(k):

voteilabel = labels[sorteddistindicies[i]]#voteilabel為類別

classcount[voteilabel] = classcount.get(voteilabel,0)+1#如果之前這個voteilabel是有的,那麼就返回字典裡這個voteilabel裡的值,如果沒有就返回0

sortedclasscount = sorted(classcount.iteritems(),key=operator.itemgetter(1),reverse=true)#key=operator.itemgetter(1)的意思是按照字典裡的第乙個排序,,要按照第1個(ab是第0個),即『1'『2'排序。reverse=true是降序排序

print sortedclasscount

return sortedclasscount[0][0]

'''''

將影象轉換為1*1024的向量

'''

def img2vector(filename):

returnvect = np.zeros((1,1024))

fr = open(filename)

for i in range(32):

line = fr.readline()

for j in range(32):程式設計客棧

returnvect[0,i*32+j] = int(line[j] )

return returnvect

'''''

手寫體識別系統測試

'''

def handwritingclasstest(trainfilepath,testfilepath):

hwlabels =

trainingfilelist = os.listdir(trainfilepath)

m=len(trainingfilelist)

trainset = np.zeximqrnros((m,1024))

for i in range(m):

filename = trainingfilelist[i]

classnum = filenximqrname.split('.')[0]

classnum = int(classnum.split('_')[0])

hwlabels.append(classnum)

trainset[i] = img2vector( os.path.join(trainfilepath,filename) )

testfilelist = os.listdir(testfilepath)

errorcount = 0

mtest = len(testfilelist)

for i in range(mtest):

filename = trainingfilelist[i]

classnum = filename.split('.')[0]

classnum = int(classnum.split('_')[0])

vectorundertest = img2vector(os.path.join(trainfilepath, filename))

classifynum = classify0(vectorundertest,trainset,hwlabels,10)

print "the classifier came back with : %d , the real answer is : %d"% (classifynum , classnum)

if(classifynum != classnum) : errorcount+=1

print ("\nthe total number of error is : %d"%errorcount)

print ("\nthe error rate is : %f"%(float(errorcount)/mtest))

handwritingclasstest()

本文標題: python使用knn演算法手寫體識別

本文位址: /jiaoben/python/219285.html

手寫簡單的KNN演算法

import numpy as np import math class customkneighborsclassifier knn 自定義實現類 def init self,k 3 初始化賦值,x train 特徵測試集變數 y train 標量測試集變數 res class 結果 param ...

KNN演算法識別手寫數字

前言 從現在開始博主要開始學習機器學習了,歡迎有共同興趣的人一起學習。廢話不多說了,開始上 一 將資料集csv檔案匯入到python中,並將csv格式轉為list格式 def dataset 讀取訓練集檔案路徑 path trains1.csv os.path.abspath machinelear...

機器學習 KNN演算法 手寫識別

1.1 簡介 knn演算法即k最近鄰分類演算法,是機器學習的一種。從訓練樣本集中選取k個與測試樣本 距離 最近的樣本,這k個樣本中出現頻率最高的類別作為該測試樣本的類別。1.2 要求 目標 分類未知類別的案例。輸入 待分類未知類別案例專案 測試集 已知類別案例集合d 訓練集 輸出 未知類別案例的可能...