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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

开根号的笔算算法图解_机器学习KNN算法之手写数字识别

發布時間:2025/5/22 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开根号的笔算算法图解_机器学习KNN算法之手写数字识别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.算法簡介

手寫數字識別是KNN算法一個特別經典的實例,其數據源獲取方式有兩種,一種是來自MNIST數據集,另一種是從UCI歐文大學機器學習存儲庫中下載,本文基于后者講解該例。 基本思想就是利用KNN算法推斷出如下圖一個32x32的二進制矩陣代表的數字是處于0-9之間哪一個數字。

數據集包括兩部分,一部分是訓練數據集,共有1934個數據;另一部分是測試數據集,共有946個數據。所有數據命名格式都是統一的,例如數字5的第56個樣本——5_56.txt,這樣做為了方便提取出樣本的真實標簽。

數據的格式也有兩種,一種是像上圖一樣由0、1組成的文本文件;另一種則是手寫數字圖片,需要對圖片做一些處理,轉化成像上圖一樣的文本格式,下文皆有介紹。

2.算法步驟

  • 收集數據:公開數據源
  • 分析數據,構思如何處理數據
  • 導入訓練數據,轉化為結構化的數據格式
  • 計算距離(歐式距離)
  • 導入測試數據,計算模型準確率
  • 手寫數字,實際應用模型
  • 由于所有數據皆由0和1構成,所以不需要數據標準化和歸一化這一步驟

    3.算法實現

    處理數據

    在計算兩個樣本之間的距離時,每一個屬性是一一對應的,所以這里將32x32的數字矩陣轉化成1x1024數字矩陣,方便計算樣本之間距離。

    #處理文本文件 def img_deal(file):#創建一個1*1024的一維零矩陣the_matrix = np.zeros((1,1024))fb = open(file)for i in range(32):#逐行讀取lineStr = fb.readline()for j in range(32):#將32*32=1024個元素賦值給一維零矩陣the_matrix[0,32*i+j] = int(lineStr[j])return the_matrix

    計算歐式距離

    numpy有一個tile方法,可以將一個一維矩陣橫向復制若干次,縱向復制若干次,所以將一個測試數據經過tile方法處理后再減去訓練數據,得到新矩陣后,再將該矩陣中每一條數據(橫向)平方加和并開根號后即可得到測試數據與每一條訓練數據之間的距離。

    下一步將所有距離升序排列,取到前K個,并在這個范圍里,每個數字類別的個數,并返回出現次數較多那個數字類別的標簽。

    def classify(test_data,train_data,label,k):Size = train_data.shape[0]#將測試數據每一行復制Size次減去訓練數據,橫向復制Size次,縱向復制1次the_matrix = np.tile(test_data,(Size,1)) - train_data#將相減得到的結果平方sq_the_matrix = the_matrix ** 2#平方加和,axis = 1 代表橫向all_the_matrix = sq_the_matrix.sum(axis = 1)#結果開根號得到最終距離distance = all_the_matrix ** 0.5#將距離由小到大排序,給出結果為索引sort_distance = distance.argsort()dis_Dict = {}#取到前k個for i in range(k):#獲取前K個標簽the_label = label[sort_distance[i]]#將標簽的key和value傳入字典dis_Dict[the_label] = dis_Dict.get(the_label,0)+1#將字典按value值的大小排序,由大到小,即在K范圍內,篩選出現次數最多幾個標簽sort_Count = sorted(dis_Dict.items(), key=operator.itemgetter(1), reverse=True)#返回出現次數最多的標簽return sort_Count[0][0]

    測試數據集應用

    首先要對訓練數據集處理,listdir方法是返回一個文件夾下所有的文件,隨后生成一個行數為文件個數,列數為1024的訓練數據矩陣,并且將訓練數據集中每條數據的真實標簽切割提取存入至labels列表中,即計算距離classify函數中需要傳入的label。

    labels = [] #listdir方法是返回一個文件夾中包含的文件train_data = listdir('trainingDigits')#獲取該文件夾中文件的個數m_train=len(train_data)#生成一個列數為train_matrix,行為1024的零矩陣train_matrix = np.zeros((m_train,1024))for i in range(m_train):file_name_str = train_data[i]file_str = file_name_str.split('.')[0]#切割出訓練集中每個數據的真實標簽file_num = int(file_str.split('_')[0])labels.append(file_num)#將所有訓練數據集中的數據都傳入到train_matrix中train_matrix[i,:] = img_deal('trainingDigits/%s'%file_name_str)

    然后對測試訓練數據集做與上述一樣的處理,并將測試數據矩陣TestClassify、訓練數據矩陣train_matrix、訓練數據真實標簽labels、K共4個參數傳入計算距離classify函數中,最后計算出模型準確率并輸出預測錯誤的數據。

    error = []test_matrix = listdir('testDigits')correct = 0.0m_test = len(test_matrix)for i in range(m_test):file_name_str = test_matrix[i]file_str = file_name_str.split('.')[0]#測試數據集每個數據的真實結果file_num = int(file_str.split('_')[0])TestClassify = img_deal('testDigits/%s'%file_name_str)#傳入計算距離函數classify所需參數classify_result = classify(TestClassify,train_matrix,labels,3)print('預測結果:%st真實結果:%s'%(classify_result,file_num))##計算模型準確率if classify_result == file_num:correct += 1.0else:#將預測錯誤的數據加入error列表error.append((file_name_str,classify_result))print("正確率:{:.2f}%".format(correct / float(m_test) * 100))print(error)print(len(error))

    代碼運行部分截圖如下

    當K = 3時,準確率達到了98.94%,只有10個數字預測出錯,對于這個模型而言,準確率是十分可觀的,但運行效率卻比較低,接近30秒的運行時間。因為每個測試數據都要與近2000個訓練數據進行距離計算,而每次計算又包含1024個維度浮點運算,高次數多維度的計算是導致模型運行效率低的主要原因。

    K值

    下圖是K值與模型準確率的關系變化圖,K = 3時,模型準確率達到峰值,隨著K增大,準確率越來越小,所以這份數據的噪聲還是比較小的。

    手寫數字測試

    建模完成了,模型的準確率也不錯,為何自己手寫的數字測試一下呢?所以偶就手動寫了幾個數字

    正常拍出的圖片是RGB彩色圖片,并且像素也各不相同,所以需要對圖片做兩項處理:轉化成黑白圖片、將像素轉化為32x32,這樣才符合我們上文算法的要求;對于像素點,數值一般位于0-255,255代表白、0代表黑,但因為手寫數字像素點顏色并不規范,所以我們設置一個閾值(170)用以判斷黑白之分。 圖片轉文本代碼如下:

    def pic_txt():for i in range(0,10):img = Image.open('.handwritten%s.png'%i)#將圖片像素更改為32X32img = img.resize((32,32))#將彩色圖片變為黑白圖片img = img.convert('L')#保存path = '.handwritten%s_new.jpg'%iimg.save(path)for i in range(0,10):fb = open('.hand_written%s_handwritten.txt'%i,'w')new_img = Image.open('.handwritten%s_new.jpg'%i)#讀取圖片的寬和高width,height = new_img.sizefor i in range(height):for j in range(width):# 獲取像素點color = new_img.getpixel((j, i))#像素點較高的為圖片中的白色if color>170:fb.write('0')else:fb.write('1')fb.write('n')fb.close()

    整體代碼運行截圖如下:

    正確率為70%,畢竟測試數據很小,10個數字中4、7、8三個數字預測錯誤,還算可觀;由于光線問題,有幾個數字左下角會有一些黑影,也會對測試結果產生一定的影響,若避免類似情況,并且多增加一些測試數據,正確率定會得到提升的。

    若需要源碼和數據請私信,感謝閱讀。

    總結

    以上是生活随笔為你收集整理的开根号的笔算算法图解_机器学习KNN算法之手写数字识别的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 亚洲狼人av | 欧美激情 国产精品 | 日不卡 | 国产乱人乱偷精品视频 | 热久久中文字幕 | 国产精品va | 亚洲午夜久久久久久久久 | 综合网中文字幕 | 国产精品久久久久久久久久久久午夜片 | 亚洲精品国偷拍自产在线观看蜜桃 | 波多野在线观看 | 中国xxxx性xxxx产国 | av色噜噜 | 日本国产欧美 | 少妇一级淫片免费放播放 | 特黄级| 第一页在线| 欧美日韩视频无码一区二区三 | 国产ts丝袜人妖系列视频 | 日本50路肥熟bbw | 免费在线看黄网址 | 久久久久久久久久久久久国产 | 免费看av的网址 | 肥臀浪妇太爽了快点再快点 | 欧美三级a | 亚洲精品国产精品国自产 | 日本不卡一区在线 | 亚洲人妻电影一区 | 国产日本在线播放 | 日韩福利片| 一区精品在线观看 | 日韩激情视频一区二区 | 国产露脸无套对白在线播放 | 午夜影院在线看 | 日韩欧美精品中文字幕 | 91视频在线观看免费 | 蜜臀av88| wwwyoujizz日本| 伊人网国产| 久久免费国产精品 | 精品欧美一区二区在线观看 | 欧美粗大猛烈老熟妇 | 亚洲天堂中文字幕 | 一区二区三区精品 | 亚洲伦理一区二区 | 一本色道久久综合狠狠躁 | 国语对白精彩对话 | 最新超碰在线 | 伊人久在线 | 日韩免费一区二区三区 | 午夜欧美激情 | 日本午夜精品理论片a级app发布 | 一本加勒比hezyo黑人 | 亚洲日本精品视频 | 亚洲成人久久久 | 成人午夜影院在线观看 | 国精品无码一区二区三区 | 奇米影视亚洲春色 | 亚洲免费一区视频 | 日韩午夜精品视频 | 国产精品第7页 | 久久综合导航 | missav|免费高清av在线看 | 欧美xxxⅹ性欧美大片 | 亚洲国产精品无码久久 | av大片网址| 国产又爽又黄又嫩又猛又粗 | 免费黄色高清视频 | 国产精品久久久久久久妇 | 自拍偷拍亚洲综合 | 国产妇女乱一性一交 | caoporn视频在线 | 综合国产一区 | 色婷婷在线视频 | 中文字幕欧美在线观看 | 欧美色亚洲色 | 波多野结衣中文字幕在线播放 | 亚洲精品字幕在线观看 | 咪咪色在线视频 | 黑人性生活视频 | 国产精品视频1区 | 男女视频免费观看 | 一级理论片 | 热99精品 | 欧美日韩精品在线观看视频 | 免费亚洲精品 | ass亚洲肉体欣赏pics | 午夜影视大全 | 亚洲精品国产电影 | 国产初高中真实精品视频 | 日本午夜精品理论片a级app发布 | 99久久婷婷国产综合精品 | 蜜桃视频在线网站 | 色先锋资源网 | 久久久久久欧美 | 毛片的网址 | 国产一级片免费播放 | 久久伊人五月天 | 欧美日韩在线视频免费播放 |