日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python手机代码识别数字_python实现kNN算法识别手写体数字的示例代码

發布時間:2025/3/20 python 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python手机代码识别数字_python实现kNN算法识别手写体数字的示例代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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()

輸出結果為:

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,可以顯示所有該文件夾下的文件,以列表的形式返回。

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

總結

以上是生活随笔為你收集整理的python手机代码识别数字_python实现kNN算法识别手写体数字的示例代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美xxxx免费虐 | 午夜三级福利 | 免费在线观看网址入口 | 色综合久久精品亚洲国产 | 久久久久久久久久一级 | 日韩一区二区三区四区五区 | 午夜久久久久久久 | www激情 | 未满十八18禁止免费无码网站 | 国产麻豆精品一区 | 久久久久久黄 | www.天天干| 91精品国产欧美一区二区成人 | 国产免费一区二区三区三州老师 | 在线不卡中文字幕 | 日本一区二区三区久久久久 | 天天干天天干天天干 | 亚洲一区 在线播放 | 天天干天天爽 | 久久久精品999| 日本三级视频在线播放 | 亚洲国产免费看 | 午夜精品免费 | 男生和女生一起差差差很痛的视频 | 在线观看www| 美女主播福利视频 | 日本天堂在线视频 | 天天网综合 | 麻豆porn| 国产高清在线免费 | 91黄在线看 | 97超视频在线观看 | 中文字幕91视频 | 久久久久久久久久久久久女过产乱 | 精品久久一区 | 水多多在线 | 亚洲免费在线视频观看 | av影视天堂| 黄色在线免费观看 | 日韩欧美高清在线视频 | 亚州av免费 | 精品人伦一区二区三区蜜桃免费 | 琪琪五月天| 国产精品色在线网站 | 欧美小视频在线观看 | 男人靠女人免费视频网站 | 亚洲av无码一区二区二三区软件 | 毛片美女 | 日本h在线观看 | 欧美熟妇激情一区二区三区 | 麻豆网址 | 神马午夜一区 | 亚洲第一成人在线 | 在线观看日本中文字幕 | 麻豆视频在线免费看 | 五月天一区二区三区 | 欧美日韩色图片 | 日本熟妇成熟毛茸茸 | v片在线观看 | 都市乱淫 | 中文字幕精品视频在线观看 | 91豆花视频 | 综合婷婷久久 | 亚洲精品久久夜色撩人男男小说 | 精品国偷自产一区二区三区 | 五月天av网站 | www.操操操| 大又大粗又爽又黄少妇毛片 | 国产一区在线视频 | www.av免费| 美女狠狠干 | 香蕉传媒| ,一级淫片a看免费 | 国产丝袜美腿一区二区三区 | 伊人影院网 | 337p嫩模大胆色肉噜噜噜 | 无码人妻精品一区二区中文 | 久久精品国产99久久 | 国产精品一区二区电影 | 精品黑人一区二区三区观看时间 | 黄视频网站在线 | 久久高清内射无套 | av每日更新在线观看 | 欧美乱妇18p | 日日摸夜夜 | 男人天堂va| 777精品视频 | 国模私拍一区二区 | 啪视频网站 | 手机在线看片 | 成人欧美视频 | 亚洲图片另类小说 | 四虎在线影视 | 91成人在线观看喷潮动漫 | 精品交短篇合集 | 亚洲综合专区 | 97福利社 | 91桃色免费视频 | 新超碰在线 |