亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python實現kNN算法識別手寫體數字的示例代碼

系統 1610 0

1。總體概要

kNN算法已經在上一篇博客中說明。對于要處理手寫體數字,需要處理的點主要包括:

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

            
from PIL import Image
'''將圖片轉換成文檔,使用0,1分別替代空白和數字'''
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))#獲取該像素所對應的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)訓練集的構建。首先想到的是將(1)中圖片處理后的文本數據構建成list形式,所以訓練集將是二維數組,形如 [[1,0,1,1,0,,,,,0,1],[0,1,1,1,10,,,,],[0,0,1,0,,,],,,,,] 所以我們構建函數處理訓練集數據。

2。代碼

簡單的總結這個算法,就是將測試數據向量化,逐個和同樣向量化的訓練數據進行kNN運算,求的最短距離出現最多的分類就是我們要的分類。建立訓練集的過程就是將文件數據向量化的過程。

            
#!/user/bin/env python
#-*- coding:utf-8 -*-
from os import listdir#獲取文件目錄下所有文件
'''
from PIL import Image
#將圖片轉換成文檔,使用0,1分別替代空白和數字
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))#獲取該像素所對應的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是數組形式,而對于下面的test函數,testData只是一列,相當于列表,所以在進行加減時,需要將其轉換為數組,我們使用np下的tile函數來實現'''
 testDatasize = dataSet.shape[0]#獲取dataSet的總行數
 dataSet = dataSet.astype('float64')#不進行轉換則報錯
 testData1 = np.tile(testData,(testDatasize,1))#使用tile函數返回多個重復構成的數組
 testData1 = testData1.astype('float64')
 distSquareMat = (dataSet - testData1) ** 2 # 計算差值的平方
 distSquareSums = distSquareMat.sum(axis=1) # 求每一行的差值平方和,axis=0則按列計算
 distances = distSquareSums ** 0.5 # 開根號,得出每個樣本到測試點的距離
 sortedIndices = distances.argsort() # 排序,得到排序后的下標
 indices = sortedIndices[:k] # 取最小的k個
 labelCount = {} # 存儲每個label的出現次數,出現次數最多的就是我們要選擇的類別
 for i in indices:
  label = labels[i]
  labelCount[label] = labelCount.get(label, 0) + 1 # 次數加一,使用字典的get方法,第一次出現時默認值是0
 sortedCount = sorted(labelCount.items(), key=opt.itemgetter(1), reverse=True) # 對label出現的次數從大到小進行排序
 return sortedCount[0][0] # 返回出現次數最大的label

#定義函數讀取某個文件,返回該文件組成的數組
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

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

#測試函數
def test():
 j = 0
 k = 0
 trainarr,lables = train_data()
 testdata_list = listdir('/學習/視頻課程/源碼/第7周/testandtraindata/testdata/')
 for i in range(0,len(testdata_list)):#逐個去測試
  testfile = '/學習/視頻課程/源碼/第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('辨識成功率:'+j/(k+j))

test()
          

輸出結果為:

python實現kNN算法識別手寫體數字的示例代碼_第1張圖片

3。幾個知識點代碼說明

(1) numpy.tile

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

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

            
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]#所有行的第二列數據
Out[22]: array([1, 2, 3, 4])
          

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲色中文字幕在线播放 | 精彩视频一区二区 | 德国女人一级毛片免费 | 日韩视频 中文字幕 | 久久久久综合网 | 国产成+人欧美+综合在线观看 | 日本亚洲欧洲高清有码在线播放 | 337p欧洲日本大胆艺术 | 99涩涩| 久久免费视频3 | 亚洲国产欧美一区二区欧美 | 亚州毛色毛片免费观看 | www.97视频| 久久午夜神器 | 欧美成人毛片一级在线 | 久久99青青久久99久久 | 精品成人免费一区二区在线播放 | 亚洲毛片网站 | 99热国产这里只有精品 | 国产精品亚洲国产 | 久久在线播放 | 午夜香蕉成视频人网站高清版 | 亚洲qingse中文久久网 | 伊人伊人伊人伊人 | 在线观看福利网站 | 精品热久国产福利视频 | 2021精品综合久久久久 | 天天综合天天综合 | 国内精品综合九九久久精品 | 四虎影视成人精品 | 中国欧美日韩一区二区三区 | 女性下面全部视频免费 | 成人合集大片bd高清在线观看 | 毛片一级 | 国产精品2020观看久久 | 五月花精品视频在线观看 | 色综合色狠狠天天久久婷婷基地 | 亚洲另类视频 | 99久久精品国产一区二区三区 | 欧美真人视频一级毛片 | 黄色生活毛片 |