1. 程式人生 > >《機器學習實戰》第二章:k-近鄰演算法(3)手寫數字識別

《機器學習實戰》第二章:k-近鄰演算法(3)手寫數字識別

這是k-近鄰演算法的最後一個例子——手寫數字識別!

怎樣?是不是聽起來很高大上?

呵呵。然而這跟影象識別沒有半毛錢的關係微笑

因為每個資料樣本並不是手寫數字的圖片,而是有由0和1組成的文字檔案,就像這樣:

       

嗯,這個資料集中的每一個樣本用圖形軟體處理過,變成了寬高都是32畫素的黑白影象。用文字格式表示出來就成了上面這個樣子,是一個32*32的矩陣。於是每個樣本就有1024維,這些0或1就是每個樣本的特徵值,標籤是手寫的數字,範圍0~9,比如左邊這幅是3,右邊這幅是6。

每個標籤都有將近200個樣本,可供訓練。


---------------------------------------------------------------------------------------------

我們首先定義一個函式,用於把上面這樣的一個txt檔案,變成一個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

然後,基於訓練集合測試集,測試classify0分類器的效果。
from os import listdir

def handwritingClassTest():
    hwLabels = []
    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])
        hwLabels.append(classNumStr)
        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))

hwLabels 存放每條訓練集資料的標籤。

函式列出路徑下的所有檔案和資料夾。'trainingDigits' 這個目錄下放的是訓練集資料樣本(就是上面那張圖展現的眾多文字檔案)。m是訓練集樣本數量。trainingMat是訓練集特徵矩陣。

8~13行這個迴圈:每個訓練樣本命名規則是n_x.txt,n就是標籤,x是該標籤的第幾個樣本。比如1_6.txt就是標籤1的第6的樣本。標籤存入hwLabels這個list裡面。然後把文字檔案轉換成特徵矩陣,用的是剛才那個img2vector函式。

然後開始搞測試樣本。測試樣本放在'testDigits' 這個目錄下,mTest是測試樣本數量。

17~24

這個迴圈:首先也是通過檔名把測試樣本的正確標籤摳出來,存入classNumStr。然後把文字檔案轉換成特徵矩陣,存入vectorUnderTest。然後把vectorUnderTest當做待測試資料傳入classify0分類器(原始碼在第一篇部落格)。得出的分類結果和classNumStr相比較,統計錯誤率。

執行結果(執行的過程比較慢):


錯誤率僅為1.2%,效果還是不錯的。

相關推薦

機器學習實戰第二k-近鄰演算法3數字識別

這是k-近鄰演算法的最後一個例子——手寫數字識別! 怎樣?是不是聽起來很高大上? 呵呵。然而這跟影象識別沒有半毛錢的關係 因為每個資料樣本並不是手寫數字的圖片,而是有由0和1組成的文字檔案,就像這樣:         嗯,這個資料集中的每一個樣本用圖形軟體處理過,變成了寬高

機器學習實戰第二k-近鄰演算法1簡單KNN

收拾下心情,繼續上路。 最近開始看Peter Harrington的《Machine Learning in Action》... 的中文版《機器學習實戰》。準備在部落格裡面記錄些筆記。 這本書附帶的程式碼和資料及可以在這裡找到。 這本書裡程式碼基本是用python寫的

機器學習實戰第二k-近鄰演算法2約會物件分類

這是KNN的一個新例子。 在一個約會網站裡,每個約會物件有三個特徵: (1)每年獲得的飛行常客里程數(額...這個用來判斷你是不是成功人士?) (2)玩視訊遊戲所耗時間百分比(額...這個用來判斷你是不是肥宅?) (3)每週消費的冰激凌公升數(額...這個是何用意我真不知道

Python3《機器學習實戰》01k-近鄰演算法完整程式碼及註釋

執行平臺: Windows Python版本: Python3 IDE: Anaconda3 # -*- coding: utf-8 -*- """ Created on Sun Apr 29 20:32:03 2018 @author: Wang

機器學習實戰筆記一K-近鄰演算法在約會網站上的應用

K-近鄰演算法概述 簡單的說,K-近鄰演算法採用不同特徵值之間的距離方法進行分類  K-近鄰演算法 優點:精度高、對異常值不敏感、無資料輸入假定。 缺點:計算複雜度高、空間複雜度高。 適用範圍:數值型和標稱型。   k-近鄰演算法的一般流程 收集資料:可使用任何方法

Python3《機器學習實戰》筆記K-近鄰演算法

2.1 實施KNN演算法 python3實現KNN演算法,本書採用的是python2,轉化為python3 import numpy as np #運算子模組 import operator def createDataSet(): group = np

機器學習實戰k近鄰演算法(kNN)應用之數字識別程式碼解讀

from numpy import * from os import listdir import operator import time #k-NN簡單實現函式 def classify0(inX,dataSet,labels,k): #求出樣本集的行數,也就是labels標籤的數目

機器學習筆記九K近鄰演算法KNN

一.基本思想 K近鄰演算法,即是給定一個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最鄰近的K個例項,這K個例項的多數屬於某個類,就把該輸入例項分類到這個類中。如下面的圖: 通俗一點來說,就是找最“鄰近”的夥伴,通過這些夥伴的類別來看自己的類別

機器學習實戰k-近鄰演算法3---如何視覺化資料

關於視覺化: 《機器學習實戰》書中的一個小錯誤,P22的datingTestSet.txt這個檔案,根據網上的原始碼,應該選擇datingTestSet2.txt這個檔案。主要的區別是最後的標籤,作者原來使用字串‘veryLike’作為標籤,但是Python轉換會出現Val

機器學習實戰第二----KNN

BE 指定 cto 文件轉換 .sh ati subplot OS umt tile的使用方法 tile(A,n)的功能是把A數組重復n次(可以在列方向,也可以在行方向) argsort()函數 argsort()函數返回的是數組中值從大到小的索引值 dict.get()

機器學習實戰-第二代碼+註釋-KNN

rep sdn odi als cti 元素 集合 pre recv #-*- coding:utf-8 -*- #https://blog.csdn.net/fenfenmiao/article/details/52165472 from numpy import *

【2】機器學習之兄弟連K近鄰K-means

關鍵詞:從K近鄰到最近鄰,監督學習,資料帶lable,效率優化(從線性搜尋到kd樹搜尋),缺點是需要儲存所有資料,空間複雜度大。可以利用kd數來優化k-means演算法。 學習了kNN和K-means演算法後,仔細分析比較了他們之間的異同以及應用場景總結成此文供讀者參

機器學習實戰第二——學習KNN演算法,讀書筆記

        K近鄰演算法(簡稱KNN)學習是一種常用的監督學習方法,給定測試樣本,基於某種距離度量找出訓練集中與其最靠近的k個訓練樣本,然後基於這k個“鄰居”的資訊來進行預測。通常在分類任務中可以使用“投票法”,即

機器學習實戰 第二KNN1python程式碼及註釋

#coding=utf8 #KNN.py from numpy import * import operator def createDataSet(): group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) #我覺

機器學習實戰k-臨近演算法

海倫一直在使用線上約會網站尋找合適自己的約會物件,經過一番總結,海倫整理了以下資料,希望我們的分類軟體可以更好地幫助她將匹配物件劃分到確切的分類中 1、收集資料 40920 8.326976 0.953952 largeDoses 14488 7.153469 1.673

機器學習實戰學習筆記——K-近鄰演算法KNN(二)海倫約會網站匹配實戰

《機器學習實戰》中KNN演算法例項一:關於這個實戰的故事背景可以搜尋“海倫 約會網站”基本上就可以瞭解。 這個實驗的目的是根據已有的海倫整理出來的約會物件的資料和海倫對約會物件的評價,構造分類器,使對

Python3 機器學習實戰自我講解 K-近鄰法-海倫約會-字型識別

第二章 k近鄰法 2.1 概念 2.1.1 k近鄰法簡介 k近鄰法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一種基本分類與迴歸方法。它的工作原理是:存在一個樣本資料集合,也稱作為訓練樣

機器學習實戰第二記錄

第二章講的是K-鄰近演算法from numpy import*import operatordef createDataSet():    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])    labels = ['A',

機器學習實戰k-近鄰演算法4--- 如何歸一化資料

歸一化的公式: newValue = (oldValue - min) / (max - min) 就是把資料歸一化到[0, 1]區間上。 好處: 防止某一維度的資料的數值大小對距離就算產生影響。多個維度的特徵是等權重的,所以不能被數值大小影響。 下面是歸一化特徵值的程式碼

機器學習實戰讀書筆記(1)--k鄰近演算法

kNN演算法 kNN演算法概述 kNN演算法和kmeans演算法的比較 knn工作原理: 存在一個樣本資料集合(訓練樣本集),並且每個樣本都具有標籤,輸入新的樣本後,我們將樣本的特徵與訓練樣本集中的資料特徵比較,演算法提取特徵最相似的k個樣本的標籤,採用少數服從多數的