欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python實(shí)現(xiàn)kNN算法識(shí)別手寫體數(shù)字的示例代碼

 更新時(shí)間:2019年08月16日 15:06:21   作者:諾坎普奇跡  
這篇文章主要介紹了python實(shí)現(xiàn)kNN算法識(shí)別手寫體數(shù)字的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1。總體概要

kNN算法已經(jīng)在上一篇博客中說明。對(duì)于要處理手寫體數(shù)字,需要處理的點(diǎn)主要包括:

(1)圖片的預(yù)處理:將png,jpg等格式的圖片轉(zhuǎn)換成文本數(shù)據(jù),本博客的思想是,利用圖片的rgb16進(jìn)制編碼(255,255,255)為白色,(0,0,0)為黑色,獲取圖片大小后,逐個(gè)像素進(jìn)行判斷分析,當(dāng)此像素為空白時(shí),在文本數(shù)據(jù)中使用0來替換,反之使用1來替換。

from PIL import Image
'''將圖片轉(zhuǎn)換成文檔,使用0,1分別替代空白和數(shù)字'''
pic = Image.open('/Users/wangxingfan/Desktop/1.png')
path = open('/Users/wangxingfan/Desktop/1.txt','a')
width = pic.size[0]
height = pic.size[1]
for i in range(0,width):
 for j in range(0,height):
  c_RGB = pic.getpixel((i,j))#獲取該像素所對(duì)應(yīng)的RGB值
  if c_RGB[0]+c_RGB[1]+c_RGB[2]>0:#白色
   path.write('0')
  elif c_RGB[0]+c_RGB[1]+c_RGB[2]==0:#黑色
   path.write('1')
  else:
   pass
 path.write('\n')
path.close()

(2)訓(xùn)練集的構(gòu)建。首先想到的是將(1)中圖片處理后的文本數(shù)據(jù)構(gòu)建成list形式,所以訓(xùn)練集將是二維數(shù)組,形如[[1,0,1,1,0,,,,,0,1],[0,1,1,1,10,,,,],[0,0,1,0,,,],,,,,]所以我們構(gòu)建函數(shù)處理訓(xùn)練集數(shù)據(jù)。

2。代碼

簡(jiǎn)單的總結(jié)這個(gè)算法,就是將測(cè)試數(shù)據(jù)向量化,逐個(gè)和同樣向量化的訓(xùn)練數(shù)據(jù)進(jìn)行kNN運(yùn)算,求的最短距離出現(xiàn)最多的分類就是我們要的分類。建立訓(xùn)練集的過程就是將文件數(shù)據(jù)向量化的過程。

#?。痷ser/bin/env python
#-*- coding:utf-8 -*-
from os import listdir#獲取文件目錄下所有文件
'''
from PIL import Image
#將圖片轉(zhuǎn)換成文檔,使用0,1分別替代空白和數(shù)字
pic = Image.open('/Users/wangxingfan/Desktop/1.png')
path = open('/Users/wangxingfan/Desktop/1.txt','a')
width = pic.size[0]
height = pic.size[1]
for i in range(0,width):
 for j in range(0,height):
  c_RGB = pic.getpixel((i,j))#獲取該像素所對(duì)應(yīng)的RGB值
  if c_RGB[0]+c_RGB[1]+c_RGB[2]>0:#白色
   path.write('0')
  elif c_RGB[0]+c_RGB[1]+c_RGB[2]==0:#黑色
   path.write('1')
  else:
   pass
 path.write('\n')
path.close()
'''
import numpy as np
import operator as opt

def kNN(dataSet, labels, testData, k):
 '''首先明確列表不能想加減,dataSet是數(shù)組形式,而對(duì)于下面的test函數(shù),testData只是一列,相當(dāng)于列表,所以在進(jìn)行加減時(shí),需要將其轉(zhuǎn)換為數(shù)組,我們使用np下的tile函數(shù)來實(shí)現(xiàn)'''
 testDatasize = dataSet.shape[0]#獲取dataSet的總行數(shù)
 dataSet = dataSet.astype('float64')#不進(jìn)行轉(zhuǎn)換則報(bào)錯(cuò)
 testData1 = np.tile(testData,(testDatasize,1))#使用tile函數(shù)返回多個(gè)重復(fù)構(gòu)成的數(shù)組
 testData1 = testData1.astype('float64')
 distSquareMat = (dataSet - testData1) ** 2 # 計(jì)算差值的平方
 distSquareSums = distSquareMat.sum(axis=1) # 求每一行的差值平方和,axis=0則按列計(jì)算
 distances = distSquareSums ** 0.5 # 開根號(hào),得出每個(gè)樣本到測(cè)試點(diǎn)的距離
 sortedIndices = distances.argsort() # 排序,得到排序后的下標(biāo)
 indices = sortedIndices[:k] # 取最小的k個(gè)
 labelCount = {} # 存儲(chǔ)每個(gè)label的出現(xiàn)次數(shù),出現(xiàn)次數(shù)最多的就是我們要選擇的類別
 for i in indices:
  label = labels[i]
  labelCount[label] = labelCount.get(label, 0) + 1 # 次數(shù)加一,使用字典的get方法,第一次出現(xiàn)時(shí)默認(rèn)值是0
 sortedCount = sorted(labelCount.items(), key=opt.itemgetter(1), reverse=True) # 對(duì)label出現(xiàn)的次數(shù)從大到小進(jìn)行排序
 return sortedCount[0][0] # 返回出現(xiàn)次數(shù)最大的label

#定義函數(shù)讀取某個(gè)文件,返回該文件組成的數(shù)組
def file_data(fname):
 arr = []
 path = open(fname)
 for i in range(0,32):
  line = path.readline()
  for j in range(0,32):
   arr.append(line[j])
 return arr

#建立訓(xùn)練數(shù)據(jù)集
def train_data():
 lables = []
 file_list = listdir('/學(xué)習(xí)/視頻課程/源碼/第7周/testandtraindata/traindata/')
 trainarr = np.zeros((len(file_list),1024))
 for i in range(0,len(file_list)):
  file = '/學(xué)習(xí)/視頻課程/源碼/第7周/testandtraindata/traindata/'+file_list[i]
  lables.append(file_list[i].split('_')[0])#獲取對(duì)應(yīng)的文件類別
  trainarr[i,:] = file_data(file)#取所有列的第一個(gè)數(shù)據(jù)
 return trainarr,lables

#測(cè)試函數(shù)
def test():
 j = 0
 k = 0
 trainarr,lables = train_data()
 testdata_list = listdir('/學(xué)習(xí)/視頻課程/源碼/第7周/testandtraindata/testdata/')
 for i in range(0,len(testdata_list)):#逐個(gè)去測(cè)試
  testfile = '/學(xué)習(xí)/視頻課程/源碼/第7周/testandtraindata/testdata/'+testdata_list[i]
  testdata1 = file_data(testfile)
  result = kNN(trainarr,lables,testdata1,k=3)
  print(result+',real_number:'+testdata_list[i].split('_')[0])
  if result == testdata_list[i].split('_')[0]:
   j +=1
  else:
   k +=1

 print('辨識(shí)成功率:'+j/(k+j))

test()

輸出結(jié)果為:

這里寫圖片描述

3。幾個(gè)知識(shí)點(diǎn)代碼說明

(1)numpy.tile

p = np.array([0,0,0])
np.tile(p,(3,1))#表示columns方向重復(fù)三次,index方向不變
Out[12]: 
array([[0, 0, 0],
  [0, 0, 0],
  [0, 0, 0]])
np.tile(p,(1,3))#表示index方向重復(fù)三次,行還是一行
Out[13]: array([[0, 0, 0, 0, 0, 0, 0, 0, 0]])

(2)array[1,:]表示取所有列的第【索引1】個(gè)數(shù)據(jù)(也就是第二行數(shù)據(jù))

a = np.array([[1,1,1],[2,2,2],[3,3,3],[4,4,4]])
a[1,:]
Out[21]: array([2, 2, 2])
a[:,1]#所有行的第二列數(shù)據(jù)
Out[22]: array([1, 2, 3, 4])

(3)list并不能進(jìn)行加減計(jì)算,需要使用numpy將數(shù)據(jù)轉(zhuǎn)換為數(shù)組形式,且在使用例如:arr1+arr2時(shí),需要兩個(gè)數(shù)組的維度相同,在某個(gè)緯度上的數(shù)據(jù)長(zhǎng)度也相同。

(4)使用os模塊下的listdir,可以顯示所有該文件夾下的文件,以列表的形式返回。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用matplotlib庫實(shí)現(xiàn)圖形局部數(shù)據(jù)放大顯示的實(shí)踐

    使用matplotlib庫實(shí)現(xiàn)圖形局部數(shù)據(jù)放大顯示的實(shí)踐

    本文主要介紹了使用matplotlib庫實(shí)現(xiàn)圖形局部數(shù)據(jù)放大顯示的實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • python 函數(shù)進(jìn)階之閉包函數(shù)

    python 函數(shù)進(jìn)階之閉包函數(shù)

    這篇文章主要介紹了python 函數(shù)進(jìn)階之閉包函數(shù),內(nèi)函數(shù)使用了外函數(shù)的局部變量,并且外函數(shù)把內(nèi)函數(shù)返回出來的過程叫做閉包,里面的內(nèi)函數(shù)是閉包函數(shù),下文相關(guān)介紹需要的小伙伴可以參考一下
    2022-04-04
  • opencv讀取視頻并保存圖像的方法

    opencv讀取視頻并保存圖像的方法

    實(shí)習(xí)項(xiàng)目要做安全帽目標(biāo)檢測(cè),拿到了公司給的一些視頻數(shù)據(jù),使用Opencv讀取視頻并每隔1s存儲(chǔ)一副圖像,本文就詳細(xì)的介紹一下使用,感興趣的可以了解一下
    2021-06-06
  • PyQT實(shí)現(xiàn)菜單中的復(fù)制,全選和清空的功能的方法

    PyQT實(shí)現(xiàn)菜單中的復(fù)制,全選和清空的功能的方法

    今天小編就為大家分享一篇PyQT實(shí)現(xiàn)菜單中的復(fù)制,全選和清空的功能的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • Python?ORM框架之SQLAlchemy?的基礎(chǔ)用法

    Python?ORM框架之SQLAlchemy?的基礎(chǔ)用法

    這篇文章主要介紹了Python?ORM框架之SQLAlchemy?的基礎(chǔ)用法,ORM全稱?Object?Relational?Mapping對(duì)象關(guān)系映射,更多詳細(xì)內(nèi)容需要的小伙伴課題參考下面文章介紹。希望對(duì)你的學(xué)習(xí)有所幫助
    2022-03-03
  • python操作xml文件詳細(xì)介紹

    python操作xml文件詳細(xì)介紹

    這篇文章主要介紹了python操作xml文件詳細(xì)介紹,著重介紹了獲取XML標(biāo)簽的屬性和值的方法,需要的朋友可以參考下
    2014-06-06
  • 在pycharm中文件取消用 pytest模式打開的操作

    在pycharm中文件取消用 pytest模式打開的操作

    這篇文章主要介紹了在pycharm中文件取消用 pytest模式打開的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Python+OpenCV繪制灰度直方圖詳解

    Python+OpenCV繪制灰度直方圖詳解

    一幅圖像由不同灰度值的像素組成,圖像中灰度的分布情況是該圖像的一個(gè)重要特征。圖像的灰度直方圖就描述了圖像中灰度分布情況。本文將利用Python和OpenCV繪制灰度直方圖,需要的可以參考一下
    2022-03-03
  • PyQt5筆記之彈出窗口大全

    PyQt5筆記之彈出窗口大全

    今天小編就為大家分享一篇PyQt5筆記之彈出窗口大全,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • python通過BF算法實(shí)現(xiàn)關(guān)鍵詞匹配的方法

    python通過BF算法實(shí)現(xiàn)關(guān)鍵詞匹配的方法

    這篇文章主要介紹了python通過BF算法實(shí)現(xiàn)關(guān)鍵詞匹配的方法,實(shí)例分析了BF算法的原理與Python實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03

最新評(píng)論