最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)現(xiàn)基于KNN算法的筆跡識(shí)別功能詳解

 更新時(shí)間:2018年07月09日 11:53:57   作者:Kedi  
這篇文章主要介紹了Python實(shí)現(xiàn)基于KNN算法的筆跡識(shí)別功能,結(jié)合實(shí)例形式詳細(xì)分析了使用KNN算法進(jìn)行筆跡識(shí)別的相關(guān)庫引入、操作步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Python實(shí)現(xiàn)基于KNN算法的筆跡識(shí)別功能。分享給大家供大家參考,具體如下:

需要用到:

  • Numpy庫
  • Pandas庫
  • 手寫識(shí)別數(shù)據(jù) 點(diǎn)擊此處本站下載。

數(shù)據(jù)說明:

數(shù)據(jù)共有785列,第一列為label,剩下的784列數(shù)據(jù)存儲(chǔ)的是灰度圖像(0~255)的像素值 28*28=784

KNN(K近鄰算法):

從訓(xùn)練集中找到和新數(shù)據(jù)最接近的K條記錄,根據(jù)他們的主要分類來決定新數(shù)據(jù)的類型。

這里的主要分類,可以有不同的判別依據(jù),比如“最多”,“最近鄰”,或者是“距離加權(quán)”。

整個(gè)程序的幾個(gè)部分:

1.數(shù)據(jù)的歸一化處理(normalization)
2.(重要)找出與test數(shù)據(jù)最接近的train數(shù)據(jù)的編號(hào),根據(jù)編號(hào)查找到對(duì)應(yīng)的label,將label賦給test數(shù)據(jù)的預(yù)測值
3.統(tǒng)計(jì)知道的test的label值與test的預(yù)測label值得正確率

Step 1

導(dǎo)入Numpy與Pandas庫

import numpy as np
import pandas as pd

Step 2

對(duì)數(shù)據(jù)進(jìn)行歸一化

對(duì)數(shù)據(jù)歸一化的方法很多,比如:

一、max-Min標(biāo)準(zhǔn)化

max - Min標(biāo)準(zhǔn)化方法是對(duì)原始數(shù)據(jù)進(jìn)行線性變換。設(shè)minA和maxA分別為屬性A的最小值和最大值,將A的一個(gè)原始值x通過max-Min標(biāo)準(zhǔn)化映射成在區(qū)間[0,1]中的值x',其公式為:

新數(shù)據(jù)=(原數(shù)據(jù)-極小值)/(極大值-極小值)

二、

新數(shù)據(jù)=原數(shù)據(jù)/(原數(shù)據(jù)的平方和開根號(hào))

三、

y = ( x - min )/( max - min ) 其中min為x的最小值,max為x的最大值,輸入向量為x,歸一化后的輸出向量為y 。上式將數(shù)據(jù)歸一化到 [ 0 , 1 ]區(qū)間,當(dāng)激活函數(shù)采用S形函數(shù)時(shí)(值域?yàn)?0,1))時(shí)這條式子適用

在這里采用方法二

def normalize(x):
 norms = np.apply_along_axis(np.linalg.norm,1,x)
 return x / np.expand_dims(norms,-1)

調(diào)用np中的linalg.norm(x)apply_along_axis(func, axis, x)函數(shù)

linalg.norm(x)函數(shù)的作用是 return sum(abs(xi)**2)**0.5

apply_along_axis(func, axis, x)函數(shù)的作用是將x按axis方向執(zhí)行func函數(shù),axis=0表示做列方向上的運(yùn)算,axis=1表示做行方向上的運(yùn)算

step 3

找出與test數(shù)據(jù)最接近的train數(shù)據(jù),這步是最關(guān)鍵的一步。

在這里,test數(shù)據(jù)與train數(shù)據(jù)就是空間的兩個(gè)向量,問題就變成了如何計(jì)算這兩個(gè)向量的相似程度。

我們可以把它們想象成空間中的兩條線段,都是從原點(diǎn)([0, 0, ...])出發(fā),指向不同的方向。兩條線段之間形成一個(gè)夾角,如果夾角為0度,意味著方向相同、線段重合;如果夾角為90度,意味著形成直角,方向完全不相似;如果夾角為180度,意味著方向正好相反。因此,我們可以通過夾角的大小,來判斷向量的相似程度。夾角越小,就代表越相似。

假定a向量是[x1, y1],b向量是[x2, y2],那么可以將余弦定理改寫成下面的形式:

余玄定理

def nearest_neighbor(norm_func,train_data,train_label,test_data):
 train_data = norm_func(train_data)
 test_data = norm_func(test_data)
 cos = np.dot(train_data,np.transpose(test_data))#np.transpose為求轉(zhuǎn)置,dot為矩陣的乘積,結(jié)果為cos的一列值為test與train的相似度
 max_cos = np.argmax(cos,axis=0)#np.argmax為cos中一列上方的最大值
 test_pred = train_label[max_cos]#train_label為一列,max_cos為一個(gè)數(shù)組,train_label[max_cos]會(huì)讀出train_label中max_cos數(shù)組編號(hào)的元素
 return test_pred#返回test的預(yù)測值

step 4

統(tǒng)計(jì)預(yù)測值的正確率

def validate(test_pred,test_label):
 c=len(test_pred)#在數(shù)組里面套數(shù)組的時(shí)候,len得到的是大數(shù)組里數(shù)組的個(gè)數(shù),在只有一層數(shù)組的時(shí)候,得到的是數(shù)組中元素的個(gè)數(shù)
 correct=(test_pred == test_label).sum()#統(tǒng)計(jì)兩個(gè)數(shù)組中有多少個(gè)元素相同
 return float(correct)/c#必須轉(zhuǎn)變成浮點(diǎn)數(shù)再做除法,之前使用correct/c得到0

測試代碼:

if __name__ == '__main__':
 train_num = 200
 test_num = 300#測試數(shù)據(jù)起始是test_num-train_num
 x = pd.read_csv('train.csv')
 x_train = x.values[0:train_num,1:]#讀取pandas中讀取出來的數(shù)據(jù),需要用data.values[]
 x_train_label = x.values[0:train_num,0]#第一列是label,每幅圖的數(shù)據(jù)是一行
 x_test = x.values[train_num:test_num,1:]
 x_test_label = x.values[train_num:test_num,0]
 test_pred=nearest_neighbor(normalize,x_train,x_train_label,x_test)
 prec=validate(test_pred,x_test_label)
 print u"正確率為%.2f"%(prec)#浮點(diǎn)數(shù)是%f

完整代碼點(diǎn)擊此處本站下載。

注解:

上面部分主要是講解KNN算法,運(yùn)用到的是現(xiàn)成的28*28的數(shù)據(jù),而在實(shí)際做筆跡分析的時(shí)候,首先需要將圖像轉(zhuǎn)化成矩陣數(shù)據(jù)。

現(xiàn)在介紹一下,圖像轉(zhuǎn)化成矩陣與矩陣轉(zhuǎn)化成圖像的方法

矩陣轉(zhuǎn)化成圖像

需要用到的庫是圖像處理庫Python Imaging Library (PIL)

在Windows下使用pip install PIL安裝失敗,采取了下載PIL.exe雙擊安裝的方法
下載地址:

PIL官方下載地址

import pandas as pd
import numpy as np
from PIL import Image
# load data
train = pd.read_csv('train.csv')
# now draw the numbers
for ind, row in train.iloc[0:3].iterrows():#iloc方法(介紹見后)來獲得前3行數(shù)據(jù)
 i = row[0]#[0]為標(biāo)簽項(xiàng)
 arr = np.array(row[1:], dtype=np.uint8)#1-784列組成一幅圖,,uint8為8位無符號(hào)整數(shù)
 #arr = np.array(255 - row[1:], dtype=np.uint8)#如果需要顏色取反,用255減去當(dāng)前每個(gè)像素點(diǎn)的值
 arr.resize((28, 28))#把它變成28*28的矩陣
 #save to file
 im = Image.fromarray(arr)
 im.save("./train_pics/%s-%s.png" % (ind, i))#第一個(gè)%s(ind)表示它是第幾幅圖像,第二個(gè)%s表示這個(gè)圖像里面數(shù)字是幾 ,注意該語句不能產(chǎn)生文件夾,需要現(xiàn)在指定目錄建一個(gè)文件夾

.iloc()方法

iloc[行位置,列位置]
df.iloc[1,1]#選取第二行,第二列的值,返回的為單個(gè)值
df.iloc[0,2],:]#選取第一行及第三行的數(shù)據(jù)

圖像轉(zhuǎn)化成矩陣

需要用到的庫是opencv(open source computer vision),下載安裝方式請(qǐng)參照附錄:python_OpenCV安裝

這里主要講它的幾個(gè)簡單功能

1.靜態(tài)圖像的輸入,輸出

cv2.imread('xxx.png')#輸入,#這里輸入image的維度image.shape = (w,h,3),w*h是圖片的長寬,3是BGR等三種顏色的channel值,每個(gè)值為0~255
cv2.imwrite('xxx.jpg', image)#輸出

2.將圖片轉(zhuǎn)化為灰度圖片

#灰度圖片的顏色channel只有一個(gè),0~255表示灰度值
grayImage = cv2.imread('xxx.png',cv2.CV_LOAD_IMAGE_GRAYSCALE)

3.改變圖像的大小

print grayImage.shape#查看圖像的shape,shape為(137,301),如果查看的是圖像的size,則為42137(41237=137*301)
res=cv2.resize(grayImage,(28,28),interpolation=cv2.INTER_CUBIC)#將圖片grayImage以cv2.INTER_CUBIC方式變化為(28,28)大小的圖片

變換的方法:

  • CV_INTER_NN - 最近鄰插值,
  • CV_INTER_LINEAR - 雙線性插值 (缺省使用)
  • CV_INTER_AREA - 使用象素關(guān)系重采樣。當(dāng)圖像縮小時(shí)候,該方法可以避免波紋出現(xiàn)。當(dāng)圖像放大時(shí),類似于 CV_INTER_NN 方法..
  • CV_INTER_CUBIC -立方插值.

下面是有關(guān)輸入,輸出,改變成灰度圖,改變圖像大小,顯示的完整程序,注意圖像在窗口中的顯示

import cv2
image = cv2.imread('111.png')#讀
cv2.imwrite('111.jpg', image)#寫
grayImage = cv2.imread('111.png',cv2.CV_LOAD_IMAGE_GRAYSCALE)
print grayImage.shape
res=cv2.resize(grayImage,(28,28),interpolation=cv2.INTER_CUBIC)
#顯示圖像
cv2.imshow('test',grayImage)#顯示灰度圖
cv2.imshow('change',res)#顯示改變了大小的圖
#捕獲鍵盤輸入
k=cv2.waitKey(0)
if k==27:#27表示ESC鍵
 cv2.destroyWindow()

cv2.imshow()用于將圖片顯示在窗口中,后面必須跟個(gè)cv2.waitKey()函數(shù),才能讓顯示持續(xù),不然顯示出來程序就中止了,窗口就會(huì)被關(guān)閉。cv2.waitKey()函數(shù)是捕獲鍵盤的輸入,cv2.destroyWindow()是釋放窗口。

在學(xué)習(xí)了如果讀取,輸出圖片后,我們就可以用寫好的KNN算法識(shí)別我們的筆跡了。

問題:

我使用了很多手寫的數(shù)據(jù)去驗(yàn)證識(shí)別是否準(zhǔn)確,發(fā)現(xiàn)準(zhǔn)確率還不夠高。主要存在的問題是

1.圖片大小問題,大小的調(diào)節(jié)不應(yīng)該把整張圖片變?yōu)?8*28的圖,而應(yīng)該識(shí)別出寫有數(shù)字的中心圖片,把旁邊的白邊去掉

2.手寫的數(shù)字照片,不能保證寫字的地方為黑(像素值為255)

解決方式:需要使用一個(gè)濾波器,把因紙張,拍攝問題出現(xiàn)的像素值降。再?zèng)]有使用濾波器的條件下,我把照片換成了在畫圖板上寫的數(shù)字。

3.寫字的粗細(xì)會(huì)影響判斷

解決辦法:這個(gè)可能是訓(xùn)練樣本不夠多,整體訓(xùn)練樣本的字跡偏粗,在輸入很細(xì)的筆跡時(shí),不能識(shí)別出來。還有就是應(yīng)該監(jiān)測輸入字體的粗細(xì),對(duì)輸入的很細(xì)的筆跡做膨脹處理,對(duì)很粗的筆跡做腐蝕處理

附:python_OpenCV安裝

看到網(wǎng)上好多教程的是在VS環(huán)境下OpenCV的安裝,而我一直都是在windows7,32位,sublime+cmd環(huán)境下,進(jìn)行python的編程,所以琢磨了下這種條件下的OpenCV安裝

使用pip install numpy語句安裝numpy
(如果出現(xiàn)錯(cuò)誤:Microsoft Visual C++ 9.0 is required <unable to find vcvarsall.bat>,使用管理員身份安裝 Microsoft Visual C++ 9.0,重新啟動(dòng)計(jì)算機(jī),再使用使用pip install numpy語句安裝numpy

opencv2.4.10下載

下載之后解壓(隨便解壓到哪里),將解壓目錄opencv文件夾中,build->python->2.7->x86下的文件cv2.pyd 復(fù)制到python2.7\Lib\site-packages

測試是否安裝成功,執(zhí)行解壓目錄下的sources\samples\python\drawing.py或者進(jìn)入python環(huán)境,使用import cv2

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Python讀取配置文件-ConfigParser的二次封裝方法

    Python讀取配置文件-ConfigParser的二次封裝方法

    這篇文章主要介紹了Python讀取配置文件-ConfigParser的二次封裝方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 使用pygame模塊編寫貪吃蛇的實(shí)例講解

    使用pygame模塊編寫貪吃蛇的實(shí)例講解

    下面小編就為大家分享一篇使用pygame模塊編寫貪吃蛇的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • Python 使用office365郵箱的示例

    Python 使用office365郵箱的示例

    這篇文章主要介紹了Python 使用office365郵箱的示例,幫助大家利用python進(jìn)行高效辦公,感興趣的朋友可以了解下
    2020-10-10
  • Python多線程原理與用法實(shí)例剖析

    Python多線程原理與用法實(shí)例剖析

    這篇文章主要介紹了Python多線程原理與用法,結(jié)合具體的爬蟲實(shí)例剖析了多線程的相關(guān)概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-01-01
  • Python 3實(shí)戰(zhàn)爬蟲之爬取京東圖書的圖片詳解

    Python 3實(shí)戰(zhàn)爬蟲之爬取京東圖書的圖片詳解

    最近在學(xué)習(xí)python3,下面這篇文章主要給大家介紹了關(guān)于Python3實(shí)戰(zhàn)爬蟲之爬取京東圖書圖片的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-10-10
  • 利用Python查看目錄中的文件示例詳解

    利用Python查看目錄中的文件示例詳解

    這篇文章主要給大家介紹了關(guān)于利用Python查看目錄中的文件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • Python中處理JSON文件的超詳細(xì)指南

    Python中處理JSON文件的超詳細(xì)指南

    這篇文章主要給大家介紹了關(guān)于Python中處理JSON文件的超詳細(xì)指南,json模塊是python內(nèi)置的庫,不需要額外安裝就可以導(dǎo)入運(yùn)行,json模塊的主要功能是將序列化數(shù)據(jù)從文件里讀取出來或者存入文件,需要的朋友可以參考下
    2024-05-05
  • django實(shí)現(xiàn)支付寶支付實(shí)例講解

    django實(shí)現(xiàn)支付寶支付實(shí)例講解

    在本篇文章里小編給大家整理的是一篇關(guān)于django支付寶支付的代碼實(shí)例內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2019-10-10
  • Python操作XML文件的使用指南

    Python操作XML文件的使用指南

    我們經(jīng)常需要解析用不同語言編寫的數(shù)據(jù),Python?提供了許多第三方庫來解析或拆分用其他語言編寫的數(shù)據(jù),今天我們來學(xué)習(xí)下?Python?XML?解析器的相關(guān)功能
    2022-09-09
  • 簡單聊聊Python中多線程與類方法的交互

    簡單聊聊Python中多線程與類方法的交互

    在Python編程中,多線程是一種提高程序運(yùn)行效率的有效手段,本文將通過簡潔的語言、清晰的邏輯和實(shí)際的代碼案例,探討Python多線程如何調(diào)用類方法,感興趣的可以了解下
    2025-01-01

最新評(píng)論

大渡口区| 婺源县| 大洼县| 玉树县| 呼玛县| 从江县| 苗栗县| 道真| 灵璧县| 博白县| 西藏| 洪雅县| 黔江区| 神农架林区| 阿拉善盟| 香港| 绵阳市| 芜湖市| 静宁县| 卓尼县| 建湖县| 旬阳县| 成都市| 平定县| 罗平县| 屯留县| 漯河市| 大同县| 丹棱县| 合水县| 东乌珠穆沁旗| 玉田县| 亳州市| 南宁市| 正宁县| 土默特左旗| 榆中县| 长海县| 南平市| 长泰县| 邵东县|