#!/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 訓練集 輸出 未知類別案例的可能...