kNNアルゴリズム及び実例(二)

3398 ワード

前のブログではKNNアルゴリズムを紹介しています.一次元データでの分類方法を紹介しています.http://blog.csdn.net/congqi4525/article/details/71374484. 本ブログでは、二次元データの分類方法(機械学習の実戦での手書き識別システムの例)を詳しく紹介します.アルゴリズムデータには、2つの部分があります.tringDigitsとtestDigitsは、前のブログの分類アルゴリズムを使用するために、画像の2次元データを1次元データアルゴリズムコードに変換する必要があります.
from numpy import *
from kNN import classify0
import os
def img2vector(filename):       #                 
    retVec=zeros((1,1024))
    fr=open(filename)
    for i in range(32):
        lineStr=fr.readline()
        for j in range(32):
            retVec[0,32*i+j]=int(lineStr[j])
    return retVec
def handclassTest():
    hwLabels=[]
    trainFileList=os.listdir('data/trainingDigits')
    m=len(trainFileList)
    trainingMat=zeros((m,1024))
    for i in range(m):              #          
        fileNameStr=trainFileList[i]
        fileStr=fileNameStr.split('.')[0]
        classNumStr=int(fileStr.split('_')[0])
        hwLabels.append(classNumStr)
        trainingMat[i,:]=img2vector("data/trainingDigits/%s"%fileNameStr)
    testFileList=os.listdir('data/testDigits')
    mTest=len(testFileList)
    errorCount=0.0
    for i in range(mTest):      #              ,      
        fileNameStr=testFileList[i]
        fileStr=fileNameStr.split('.')[0]
        classNumStr=int(fileStr.split('_')[0])
        vectorUnderTest=img2vector("data/testDigits/%s"%fileNameStr)
        classresult=classify0(vectorUnderTest,trainingMat,hwLabels,3)
        print("came back:%d  real:%d"%(classresult,classNumStr))
        if(classresult!=classNumStr):
            errorCount+=1.0
    print("errorCount:%d  %f"%(errorCount,errorCount/float(mTest)))
handclassTest()