国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

機器學(xué)習(xí)(八)-基于KNN分類算法的手寫識別系統(tǒng)

Warren / 1412人閱讀

摘要:項目介紹基于近鄰分類器的手寫識別系統(tǒng)這里構(gòu)造的系統(tǒng)只能識別數(shù)字到。將圖像格式化處理為一個向量。

1 項目介紹

基于k-近鄰分類器(KNN)的手寫識別系統(tǒng), 這里構(gòu)造的系統(tǒng)只能識別數(shù)字0到9。

數(shù)據(jù)集和項目源代碼

難點: 圖形信息如何處理?

圖像轉(zhuǎn)換為文本格式

2 準(zhǔn)備數(shù)據(jù)

將圖像轉(zhuǎn)換為測試向量

訓(xùn)練集:

目錄trainingDigits

大約2000個例子

每個數(shù)字大約有200個樣本;

測試集

目錄testDigits

大約900個測試數(shù)據(jù)。

將圖像格式化處理為一個向量。我們將把一個32×32的二進制圖像矩陣轉(zhuǎn)換為1×1024的向量, 如下圖所示,

import numpy as np
def img2vector(filename):
    """
    # 將圖像數(shù)據(jù)轉(zhuǎn)換為(1,1024)向量
    :param filename: 
    :return: (1,1024)向量
    """
    # 生成一個1*1024且值全為0的向量;
    returnVect = np.zeros((1, 1024))
    # 讀取要轉(zhuǎn)換的信息;
    file = open(filename)
    # 依次填充
    # 讀取每一行數(shù)據(jù);
    for i in range(32):
        lineStr = file.readline()
        # 讀取每一列數(shù)據(jù);
        for j in range(32):
            returnVect[0, 32 * i + j] = int(lineStr[j])
    return returnVect
3 實施 KNN 算法

對未知類別屬性的數(shù)據(jù)集中的每個點依次執(zhí)行以下操作, 與上一個案例代碼相同:
(1) 計算已知類別數(shù)據(jù)集中的點與當(dāng)前點之間的距離;
(2) 按照距離遞增次序排序;
(3) 選取與當(dāng)前點距離最小的k個點;
(4) 確定前k個點所在類別的出現(xiàn)頻率;
(5) 返回前k個點出現(xiàn)頻率最高的類別作為當(dāng)前點的預(yù)測分類。

def classify(inX, dataSet, labels, k):
    """
    :param inX: 要預(yù)測的數(shù)據(jù)
    :param dataSet: 我們要傳入的已知數(shù)據(jù)集
    :param labels:  我們要傳入的標(biāo)簽
    :param k: KNN里的k, 也就是說我們要選幾個近鄰
    :return: 排序的結(jié)果
    """
    dataSetSize = dataSet.shape[0]  # (6,2) 6
    # tile會重復(fù)inX, 把他重復(fù)成(datasetsize, 1)型的矩陣
    # print(inX)
    # (x1 - y1), (x2- y2)
    diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
    # 平方
    sqDiffMat = diffMat ** 2
    # 相加, axis=1 行相加
    sqDistance = sqDiffMat.sum(axis=1)
    # 開根號
    distances = sqDistance ** 0.5
    # print(distances)
    # 排序 輸出的是序列號index,并不是值
    sortedDistIndicies = distances.argsort()
    # print(sortedDistIndicies)

    classCount = {}
    for i in range(k):
        voteLabel = labels[sortedDistIndicies[i]]
        classCount[voteLabel] = classCount.get(voteLabel, 0) + 1
        # print(classCount)
    sortedClassCount = sorted(classCount.items(), key=lambda d: float(d[1]), reverse=True)
    return sortedClassCount[0]

4 測試算法

使用 k-近鄰算法識別手寫數(shù)字

測試集里面的信息;

def handWritingClassTest(k):
    """
    # 測試手寫數(shù)字識別錯誤率的代碼
    :param k:
    :return:
    """
    hwLabels = []
    import os
    # 讀取所有的訓(xùn)練集文件;
    trainingFileList = os.listdir("data/knn-digits/trainingDigits")
    # 獲取訓(xùn)練集個數(shù);
    m = len(trainingFileList)
    # 生成m行1024列全為0的矩陣;
    trainingMat = np.zeros((m, 1024))
    # 填充訓(xùn)練集矩陣;
    for i in range(m):
        fileNameStr = trainingFileList[i]    # fileNameStr: 0_0.txt
        fileStr = fileNameStr.split(".")[0]  # fileStr: 0_0
        classNumStr = int(fileStr.split("_")[0])    # (數(shù)字分類的結(jié)果)classNumStr: 0
        # 填寫真實的數(shù)字結(jié)果;
        hwLabels.append(classNumStr)
        # 圖形的數(shù)據(jù): (1,1024)向量
        trainingMat[i, :] = img2vector("data/knn-digits/trainingDigits/%s" % fileNameStr)

    # 填充測試集矩陣;
    testFileList = os.listdir("data/knn-digits/testDigits")
    # 默認錯誤率為0;
    errorCount = 0.0
    # 測試集的總數(shù);
    mTest = len(testFileList)
    # 填充測試集矩陣;
    for i in range(mTest):
        fileNameStr = testFileList[i]
        fileStr = fileNameStr.split(".")[0]
        classNumStr = int(fileStr.split("_")[0])
        vectorTest = img2vector("data/knn-digits/testDigits/%s" % fileNameStr)

        # 判斷預(yù)測結(jié)果與真實結(jié)果是否一致?
        result = classify(vectorTest, trainingMat, hwLabels, k)

        if result != classNumStr:
            # 如果不一致,則統(tǒng)計出來, 計算錯誤率;
            errorCount += 1.0
            print("[預(yù)測失誤]:分類結(jié)果是:%d, 真實結(jié)果是:%d" % (result, classNumStr))
    print("錯誤總數(shù):%d" % errorCount)
    print("錯誤率:%f" % (errorCount / mTest))
    print("模型準(zhǔn)確率:%f" %(1-errorCount / mTest))
    return errorCount


print(handWritingClassTest(2))

效果展示

5 KNN算法手寫識別的缺點

算法的執(zhí)行效率并不高。

每個測試向量做2000次距離計算,每個距離計算包括了1024個維度浮點運算,總計要執(zhí)行900次;

需要為測試向量準(zhǔn)備2MB的存儲空間

有沒有更好的方法?

k決策樹就是k-近鄰算法的優(yōu)化版,可以節(jié)省大量的計算開銷。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/43591.html

相關(guān)文章

  • 機器學(xué)習(xí)()-基于KNN分類算法手寫識別系統(tǒng)

    摘要:項目介紹基于近鄰分類器的手寫識別系統(tǒng)這里構(gòu)造的系統(tǒng)只能識別數(shù)字到。將圖像格式化處理為一個向量。 1 項目介紹 基于k-近鄰分類器(KNN)的手寫識別系統(tǒng), 這里構(gòu)造的系統(tǒng)只能識別數(shù)字0到9。 數(shù)據(jù)集和項目源代碼 難點: 圖形信息如何處理? 圖像轉(zhuǎn)換為文本格式 2 準(zhǔn)備數(shù)據(jù) 將圖像轉(zhuǎn)換為測試向量 訓(xùn)練集: 目錄trainingDigits 大約2000個例子 每個數(shù)字大約有200個...

    lily_wang 評論0 收藏0
  • Python數(shù)據(jù)挖掘與機器學(xué)習(xí)技術(shù)入門實戰(zhàn)

    摘要:在本次課程中,著重講解的是傳統(tǒng)的機器學(xué)習(xí)技術(shù)及各種算法。回歸對連續(xù)型數(shù)據(jù)進行預(yù)測趨勢預(yù)測等除了分類之外,數(shù)據(jù)挖掘技術(shù)和機器學(xué)習(xí)技術(shù)還有一個非常經(jīng)典的場景回歸。 摘要: 什么是數(shù)據(jù)挖掘?什么是機器學(xué)習(xí)?又如何進行Python數(shù)據(jù)預(yù)處理?本文將帶領(lǐng)大家一同了解數(shù)據(jù)挖掘和機器學(xué)習(xí)技術(shù),通過淘寶商品案例進行數(shù)據(jù)預(yù)處理實戰(zhàn),通過鳶尾花案例介紹各種分類算法。 課程主講簡介:韋瑋,企業(yè)家,資深I(lǐng)T領(lǐng)...

    ephererid 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<