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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【人工智能课程实验】 - 利用贝叶斯分类器实现手写数字 的识别

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【人工智能课程实验】 - 利用贝叶斯分类器实现手写数字 的识别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

讀入數據與預處理

因為老師給的文件無法直接讀取,故從官網導入數據:

官網鏈接:http://www.cs.nyu.edu/~roweis/data.html?

導入數據之后要對MATLAB文件進行讀入:

data=sio.loadmat(trainfile)

對文件type一下:

type(data) Out[118]: dict

?

將data中的train部分,完全復制到tr中:

for i in range(10) :trstr.append('train'+str(i)) for i in range():print(trstr[i])tr = dict.fromkeys(trstr) for i in range(10):tr[trstr[i]]=data[trstr[i]]

將其中一個小圖像賦值給tmp,進行如下練習操作:

輸出一下第一張“0”的圖像:

tmp = tr[trstr[0]][0] tmp = tmp.reshape(28,28) im = Image.fromarray(tmp) plt.imshow(im) plt.show()''' plt.figure("Image") # 圖像窗口名稱 plt.imshow(tmp) plt.axis('on') # 關掉坐標軸為 off plt.title('image') # 圖像題目 plt.show() '''

圖像輸出如下:?

?運行如下代碼:

tmp = tmp.reshape(14,2*28) im = Image.fromarray(tmp) plt.imshow(im) plt.show()

則輸出圖像如下:(可以思考一下原因,為什么會出現了兩個零,而不是被拉寬了的一個零)?

答:模擬一下輸出像素點的過程不難發現,相當于左右兩側的圖像幾乎是一樣的像素點,所以輸出的圖像應該是大致相同的。

?

進行01二值化:

tmp = tr[trstr[0]][0].copy() tmp = tmp.reshape(28*28) for i in range(tmp.size) :if tmp[i] > 10 :tmp[i] = 1else :tmp[i] = 0tmp = tmp.reshape(28,28)im = Image.fromarray(np.uint8(tmp)) plt.imshow(im)

(ps:注意輸出圖像的時候,傳入的參數需要是unsigned int類型的,不然有可能輸出的圖像是一種顏色的。)

定義一個數組out來進行降維(將28*28的圖像降維到7*7)

out=np.zeros((7,7)) tmp=tmp.reshape(28,28)for i in range(7) :for j in range(7) :out[i][j] = np.sum(tmp[i*4:i*4+4,j*4:j*4+4]) print(out.size) print(out.shape) for i in range(7):for j in range(7):if(out[i][j] > 5) :out[i][j]=1else :out[i][j]=0 im = Image.fromarray(np.uint8(out)) plt.imshow(im) plt.show()

輸出的圖像如下:?

對單幅圖像的操作練習到此結束了。接下來是對原訓練集的二值化和降維。

將訓練集字典dict進行二值化和降維:

先建立字典:?

tr = dict.fromkeys(trstr) jwtr = dict.fromkeys(trstr) for i in range(10):#處理測試集tr[trstr[i]]=data[trstr[i]].copy()jwtr[trstr[i]] = np.zeros((data[trstr[i]].shape[0],7,7))

?進行二值化:

for i in range(10):# 枚舉所有數字print(i)for j in range(tr[trstr[i]].shape[0]): # 枚舉所有行for k in range(28*28):if(tr[trstr[i]][j][k] > 0):tr[trstr[i]][j][k] = 1

?將字典的值(不是鍵值key哈,是指值value,這里的值是個目前是二維數組)更改為三維數組,即將784分為28*28

for i in range(10):# 枚舉所有數字tr[trstr[i]] = tr[trstr[i]].reshape(tr[trstr[i]].shape[0],28,28) # 錯誤寫法! # for j in range(tr[trstr[i]].shape[0]): # 枚舉所有行 # tr[trstr[i]][j] = tr[trstr[i]][j].reshape(28,28)

注意這里不能像注釋的這樣寫!因為他是整個的數組,需要保持形狀一致,所以不能只更改第一維取某一個值的時候的第二維。也就是你可以對字典的某一個鍵,修改對應的value,但是不能對數組的某一維的某一個值,去修改其他維度,要改就整個數組都改。

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑至此,得到了訓練集的所有數字的所有行的28*28的矩陣?!?/p>

下面處理得到對應的降維矩陣:

for i in range(10):# 枚舉所有數字for j in range(tr[trstr[i]].shape[0]):# 枚舉所有行(此時每一行是28*28的二值化矩陣)for k in range(7):for kk in range(7):jwtr[trstr[i]][j][k][kk] = np.sum(tr[trstr[i]][j][k*4:k*4+4,kk*4:kk*4+4])if(jwtr[trstr[i]][j][k][kk] > 5):jwtr[trstr[i]][j][k][kk]=1else:jwtr[trstr[i]][j][k][kk]=0jwtr[trstr[i]] = jwtr[trstr[i]].reshape((tr[trstr[i]].shape[0],49))

?處理得到先驗概率:

P = np.zeros(10,dtype = float) Nsum = 0 for i in range(10):Nsum += tr[trstr[i]].shape[0]for i in range(10):P[i] = tr[trstr[i]].shape[0]/Nsum PP = np.zeros((49,10),dtype = float) for i in range(49):for j in range(10):PP[i][j] = (sum(jwtr[trstr[j]][0:jwtr[trstr[j]].shape[0],i:i+1])+1)/(jwtr[trstr[j]].shape[0]+2)

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑至此,PP[i][j]代表第i個特征,組成的數字為j的概率?↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

也就是我們訓練出了一個二維矩陣,接下來要用這個矩陣來預測驗證集了。

首先處理一下驗證集:

test_str = [] # 驗證集 for i in range(10) :test_str.append('test'+str(i)) test_image = dict.fromkeys(test_str) jw_test_image = dict.fromkeys(test_str) for i in range(10):#處理驗證集test_image[test_str[i]] = data[test_str[i]].copy()jw_test_image[test_str[i]] = np.zeros((data[test_str[i]].shape[0],7,7))

接下來的01二值化和降維的過程和訓練集一致:

for i in range(10):# 枚舉所有數字print(i)for j in range(test_image[test_str[i]].shape[0]): # 枚舉所有行for k in range(28*28):if(test_image[test_str[i]][j][k] > 0):test_image[test_str[i]][j][k] = 1 for i in range(10):# 枚舉所有數字test_image[test_str[i]] = test_image[test_str[i]].reshape(test_image[test_str[i]].shape[0],28,28)for i in range(10):# 枚舉所有數字for j in range(test_image[test_str[i]].shape[0]):# 枚舉所有行(此時每一行是28*28的二值化矩陣)for k in range(7):for kk in range(7):jw_test_image[test_str[i]][j][k][kk] = np.sum(test_image[test_str[i]][j][k*4:k*4+4,kk*4:kk*4+4])if(jw_test_image[test_str[i]][j][k][kk] > 5):jw_test_image[test_str[i]][j][k][kk]=1else:jw_test_image[test_str[i]][j][k][kk]=0jw_test_image[test_str[i]] = jw_test_image[test_str[i]].reshape((test_image[test_str[i]].shape[0],49))

?↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑至此,我們將原始驗證集處理成降維二值化矩陣jw_test_image字典 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

備份一份給操作數組

opr_test_image = dict.fromkeys(test_str) for i in range(10):opr_test_image[test_str[i]] = jw_test_image[test_str[i]].copy()

??↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑至此,我們接下來的操作矩陣就是opr_test_image字典 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

利用貝葉斯公式求后驗概率,并進行預測,概率最大的值對應的數字就是通過PP矩陣預測得到的數字。

注意兩點:

①根據貝葉斯公式,發現分母均為同樣的正值,由于我們這里只需要關注值之間的大小關系,所以不需要計算分母,只需要比較分子即可。

②因為引用的是numpy包,所以每一個元素都是float類型,所以不能直接相乘,精度不夠。但是由于我們這里只需要關注值之間的大小關系,所以可以取個log變成加法運算,保證了大小關系。

Phou = np.ones(10,dtype =float) # 后驗概率初始數組 ans = np.zeros(10,dtype =float) for dig in range(10):for col in range(opr_test_image[test_str[dig]].shape[0]):tmp = opr_test_image[test_str[dig]][col] #得到49個參數Phou = np.zeros(10,dtype =float) # 后驗概率初始數組 for i in range(49):for j in range(10):if(tmp[i] != 0): # 若為1Phou[j] = Phou[j]+np.log(PP[i][j])else :Phou[j] = Phou[j]+np.log((1-PP[i][j]))for j in range(10): # 枚舉每一個數字Phou[j] = Phou[j] * P[j]if(dig == np.argmax(Phou)):ans[dig] = ans[dig]+1 # print(ans[dig])ans[dig] = ans[dig] / opr_test_image[test_str[dig]].shape[0]print("數字%d: "%(dig))print(ans[dig])

輸出結果:

數字0: 0.8306122448979592 數字1: 0.9092511013215859 數字2: 0.685077519379845 數字3: 0.6514851485148515 數字4: 0.6924643584521385 數字5: 0.7365470852017937 數字6: 0.7494780793319415 數字7: 0.7334630350194552 數字8: 0.6098562628336756 數字9: 0.7205153617443013np.mean(ans) Out[205]: 0.7318750196697547

?

完整代碼:

trainfile = "C:\\Users\\...\\mnist_all"import numpy as np import pandas as pd import scipy.io as sio from matplotlib import pyplot as plt from PIL import Image# df = pd.DataFrame(pd.read_csv(train_data,header=1)''' data=sio.loadmat(trainfile) trstr = [] jwtr = [] test_str = [] # 驗證集 for i in range(10) :trstr.append('train'+str(i)) for i in range(10) :test_str.append('test'+str(i))tr = dict.fromkeys(trstr) jwtr = dict.fromkeys(trstr)test_image = dict.fromkeys(test_str) jw_test_image = dict.fromkeys(test_str) for i in range(10):#處理測試集tr[trstr[i]]=data[trstr[i]].copy()jwtr[trstr[i]] = np.zeros((data[trstr[i]].shape[0],7,7))#處理驗證集test_image[test_str[i]] = data[test_str[i]].copy()jw_test_image[test_str[i]] = np.zeros((data[test_str[i]].shape[0],7,7))'''for i in range(10):# 枚舉所有數字print(i)for j in range(tr[trstr[i]].shape[0]): # 枚舉所有行for k in range(28*28):if(tr[trstr[i]][j][k] > 0):tr[trstr[i]][j][k] = 1for i in range(10):# 枚舉所有數字tr[trstr[i]] = tr[trstr[i]].reshape(tr[trstr[i]].shape[0],28,28) # 錯誤寫法! # for j in range(tr[trstr[i]].shape[0]): # 枚舉所有行 # tr[trstr[i]][j] = tr[trstr[i]][j].reshape(28,28)''' ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑至此,得到了訓練集的所有數字的所有行的28*28的矩陣。↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ '''for i in range(10):# 枚舉所有數字for j in range(tr[trstr[i]].shape[0]):# 枚舉所有行(此時每一行是28*28的二值化矩陣)for k in range(7):for kk in range(7):jwtr[trstr[i]][j][k][kk] = np.sum(tr[trstr[i]][j][k*4:k*4+4,kk*4:kk*4+4])if(jwtr[trstr[i]][j][k][kk] > 5):jwtr[trstr[i]][j][k][kk]=1else:jwtr[trstr[i]][j][k][kk]=0jwtr[trstr[i]] = jwtr[trstr[i]].reshape((tr[trstr[i]].shape[0],49))P = np.zeros(10,dtype = float) Nsum = 0 for i in range(10):Nsum += tr[trstr[i]].shape[0]for i in range(10):P[i] = tr[trstr[i]].shape[0]/Nsum PP = np.zeros((49,10),dtype = float) for i in range(49):for j in range(10):PP[i][j] = (sum(jwtr[trstr[j]][0:jwtr[trstr[j]].shape[0],i:i+1])+1)/(jwtr[trstr[j]].shape[0]+2)''' 至此,PP[i][j]代表第i個特征,組成的數字為j的概率 '''# 處理驗證集 for i in range(10):# 枚舉所有數字print(i)for j in range(test_image[test_str[i]].shape[0]): # 枚舉所有行for k in range(28*28):if(test_image[test_str[i]][j][k] > 0):test_image[test_str[i]][j][k] = 1 for i in range(10):# 枚舉所有數字test_image[test_str[i]] = test_image[test_str[i]].reshape(test_image[test_str[i]].shape[0],28,28)for i in range(10):# 枚舉所有數字for j in range(test_image[test_str[i]].shape[0]):# 枚舉所有行(此時每一行是28*28的二值化矩陣)for k in range(7):for kk in range(7):jw_test_image[test_str[i]][j][k][kk] = np.sum(test_image[test_str[i]][j][k*4:k*4+4,kk*4:kk*4+4])if(jw_test_image[test_str[i]][j][k][kk] > 5):jw_test_image[test_str[i]][j][k][kk]=1else:jw_test_image[test_str[i]][j][k][kk]=0jw_test_image[test_str[i]] = jw_test_image[test_str[i]].reshape((test_image[test_str[i]].shape[0],49))#得到二值化降維矩陣 jw_test_image''' 接下來,將降維矩陣賦值給操作數組 '''opr_test_image = dict.fromkeys(test_str) for i in range(10):opr_test_image[test_str[i]] = jw_test_image[test_str[i]].copy()#得到操作數組 opr_test_imagePhou = np.ones(10,dtype =float) # 后驗概率初始數組 ans = np.zeros(10,dtype =float) for dig in range(10):for col in range(opr_test_image[test_str[dig]].shape[0]):tmp = opr_test_image[test_str[dig]][col] #得到49個參數Phou = np.zeros(10,dtype =float) # 后驗概率初始數組 for i in range(49):for j in range(10):if(tmp[i] != 0): # 若為1Phou[j] = Phou[j]+np.log(PP[i][j])else :Phou[j] = Phou[j]+np.log((1-PP[i][j]))for j in range(10): # 枚舉每一個數字Phou[j] = Phou[j] * P[j]if(dig == np.argmax(Phou)):ans[dig] = ans[dig]+1 # print(ans[dig])ans[dig] = ans[dig] / opr_test_image[test_str[dig]].shape[0]print("數字%d: "%(dig))print(ans[dig])''' 下面是對測試集的一個圖像的處理樣例:'''''' tmp = tr[trstr[0]][0].copy() tmp = tmp.reshape(28,28) im = Image.fromarray(tmp) plt.imshow(im)plt.figure("Image") # 圖像窗口名稱 plt.imshow(tmp) plt.axis('on') # 關掉坐標軸為 off plt.title('image') # 圖像題目 plt.show() ''' ''' tmp = tr[trstr[0]][0].copy() tmp = tmp.reshape(28*28) for i in range(tmp.size) :if tmp[i] > 10 :tmp[i] = 1else :tmp[i] = 0tmp = tmp.reshape(28,28)im = Image.fromarray(np.uint8(tmp)) plt.imshow(im) '''''' out=np.zeros((7,7)) tmp=tmp.reshape(28,28)for i in range(7) :for j in range(7) :out[i][j] = np.sum(tmp[i*4:i*4+4,j*4:j*4+4]) print(out.size) print(out.shape) for i in range(7):for j in range(7):if(out[i][j] > 5) :out[i][j]=1else :out[i][j]=0 im = Image.fromarray(np.uint8(out)) plt.imshow(im) plt.show() '''

update:(20191201)

發現對于降維到7*7的矩陣,可以做到平均73%的準確率。那么思考降維到14*14的矩陣,保留的特征會更多一些,那么準確率會不會更高一些呢?于是繼續寫了下面的代碼(其實是在上面這個代碼上進行了增加,并沒有改變原來的東西,也就是說下面這個代碼和上面這個代碼有很多重復的地方,在注釋中也有標注)

實驗結果:(為了防止放到下面看不到,這里就放到上面一起寫了)

平均預測率為75%左右,也就是說雖然參數變多了,但是預測率的提升并不明顯。

# -*- coding: utf-8 -*- """ Spyder EditorThis is a temporary script file. """trainfile = "D:\\mystudy\\大三上學期作業\\人工智能\\數字識別相關\\mnist_all" import numpy as np import pandas as pd import scipy.io as sio from matplotlib import pyplot as plt from PIL import Image from pylab import *# df = pd.DataFrame(pd.read_csv(train_data,header=1)''' data=sio.loadmat(trainfile) trstr = [] jwtr = [] test_str = [] # 驗證集 for i in range(10) :trstr.append('train'+str(i)) for i in range(10) :test_str.append('test'+str(i))tr = dict.fromkeys(trstr) jwtr = dict.fromkeys(trstr)test_image = dict.fromkeys(test_str) jw_test_image = dict.fromkeys(test_str) for i in range(10):#處理測試集tr[trstr[i]]=data[trstr[i]].copy()jwtr[trstr[i]] = np.zeros((data[trstr[i]].shape[0],7,7))#處理驗證集test_image[test_str[i]] = data[test_str[i]].copy()jw_test_image[test_str[i]] = np.zeros((data[test_str[i]].shape[0],7,7))'''for i in range(10):# 枚舉所有數字print(i)for j in range(tr[trstr[i]].shape[0]): # 枚舉所有行for k in range(28*28):if(tr[trstr[i]][j][k] > 0):tr[trstr[i]][j][k] = 1for i in range(10):# 枚舉所有數字tr[trstr[i]] = tr[trstr[i]].reshape(tr[trstr[i]].shape[0],28,28) # 錯誤寫法! # for j in range(tr[trstr[i]].shape[0]): # 枚舉所有行 # tr[trstr[i]][j] = tr[trstr[i]][j].reshape(28,28)''' ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑至此,得到了訓練集的所有數字的所有行的28*28的矩陣。↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ '''for i in range(10):# 枚舉所有數字for j in range(tr[trstr[i]].shape[0]):# 枚舉所有行(此時每一行是28*28的二值化矩陣)for k in range(7):for kk in range(7):jwtr[trstr[i]][j][k][kk] = np.sum(tr[trstr[i]][j][k*4:k*4+4,kk*4:kk*4+4])if(jwtr[trstr[i]][j][k][kk] > 5):jwtr[trstr[i]][j][k][kk]=1else:jwtr[trstr[i]][j][k][kk]=0jwtr[trstr[i]] = jwtr[trstr[i]].reshape((tr[trstr[i]].shape[0],49))P = np.zeros(10,dtype = float) Nsum = 0 for i in range(10):Nsum += tr[trstr[i]].shape[0]for i in range(10):P[i] = tr[trstr[i]].shape[0]/Nsum PP = np.zeros((49,10),dtype = float) for i in range(49):for j in range(10):PP[i][j] = (sum(jwtr[trstr[j]][0:jwtr[trstr[j]].shape[0],i:i+1])+1)/(jwtr[trstr[j]].shape[0]+2)''' 至此,PP[i][j]代表第i個特征,組成的數字為j的概率 '''# 處理驗證集 for i in range(10):# 枚舉所有數字print(i)for j in range(test_image[test_str[i]].shape[0]): # 枚舉所有行for k in range(28*28):if(test_image[test_str[i]][j][k] > 0):test_image[test_str[i]][j][k] = 1 for i in range(10):# 枚舉所有數字test_image[test_str[i]] = test_image[test_str[i]].reshape(test_image[test_str[i]].shape[0],28,28)for i in range(10):# 枚舉所有數字for j in range(test_image[test_str[i]].shape[0]):# 枚舉所有行(此時每一行是28*28的二值化矩陣)for k in range(7):for kk in range(7):jw_test_image[test_str[i]][j][k][kk] = np.sum(test_image[test_str[i]][j][k*4:k*4+4,kk*4:kk*4+4])if(jw_test_image[test_str[i]][j][k][kk] > 5):jw_test_image[test_str[i]][j][k][kk]=1else:jw_test_image[test_str[i]][j][k][kk]=0jw_test_image[test_str[i]] = jw_test_image[test_str[i]].reshape((test_image[test_str[i]].shape[0],49))#得到二值化降維矩陣 jw_test_image''' 接下來,將降維矩陣賦值給操作數組 '''opr_test_image = dict.fromkeys(test_str) for i in range(10):opr_test_image[test_str[i]] = jw_test_image[test_str[i]].copy()#得到操作數組 opr_test_imagePhou = np.ones(10,dtype =float) # 后驗概率初始數組 ans = np.zeros(10,dtype =float) for dig in range(10):for col in range(opr_test_image[test_str[dig]].shape[0]):tmp = opr_test_image[test_str[dig]][col] #得到49個參數Phou = np.zeros(10,dtype =float) # 后驗概率初始數組 for i in range(49):for j in range(10):if(tmp[i] != 0): # 若為1Phou[j] = Phou[j]+np.log(PP[i][j])else :Phou[j] = Phou[j]+np.log((1-PP[i][j]))for j in range(10): # 枚舉每一個數字Phou[j] = Phou[j] * P[j]if(dig == np.argmax(Phou)):ans[dig] = ans[dig]+1 # print(ans[dig])ans[dig] = ans[dig] / opr_test_image[test_str[dig]].shape[0]print("數字%d: "%(dig))print(ans[dig])print(np.mean(ans))''' ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓降維到14*14的答案↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ''' for i in range(10): # test_image[test_str[i]] = data[test_str[i]].copy()#處理測試集jwtr[trstr[i]] = np.zeros((data[trstr[i]].shape[0],14,14))#處理驗證集jw_test_image[test_str[i]] = np.zeros((data[test_str[i]].shape[0],14,14))for i in range(10):# 枚舉所有數字print(i)for j in range(tr[trstr[i]].shape[0]):# 枚舉所有行(此時每一行是28*28的二值化矩陣)for k in range(14):for kk in range(14):jwtr[trstr[i]][j][k][kk] = np.sum(tr[trstr[i]][j][k*2:k*2+2,kk*2:kk*2+2])if(jwtr[trstr[i]][j][k][kk] > 2):jwtr[trstr[i]][j][k][kk]=1else:jwtr[trstr[i]][j][k][kk]=0jwtr[trstr[i]] = jwtr[trstr[i]].reshape((tr[trstr[i]].shape[0],14*14))P = np.zeros(10,dtype = float) Nsum = 0 for i in range(10):Nsum += tr[trstr[i]].shape[0]for i in range(10):P[i] = tr[trstr[i]].shape[0]/Nsum PP = np.zeros((14*14,10),dtype = float) for i in range(14*14):for j in range(10):PP[i][j] = (sum(jwtr[trstr[j]][0:jwtr[trstr[j]].shape[0],i:i+1])+1)/(jwtr[trstr[j]].shape[0]+2)''' 至此,PP[i][j]代表第i個特征,組成的數字為j的概率 '''# 處理驗證集 for i in range(10):# 枚舉所有數字print(i)for j in range(test_image[test_str[i]].shape[0]): # 枚舉所有行for k in range(28*28):if(test_image[test_str[i]][j][k] > 0):test_image[test_str[i]][j][k] = 1 for i in range(10):# 枚舉所有數字test_image[test_str[i]] = test_image[test_str[i]].reshape(test_image[test_str[i]].shape[0],28,28)for i in range(10):# 枚舉所有數字for j in range(test_image[test_str[i]].shape[0]):# 枚舉所有行(此時每一行是28*28的二值化矩陣)for k in range(14):for kk in range(14):jw_test_image[test_str[i]][j][k][kk] = np.sum(test_image[test_str[i]][j][k*2:k*2+2,kk*2:kk*2+2])if(jw_test_image[test_str[i]][j][k][kk] > 2):#注意這里也要修改!!!jw_test_image[test_str[i]][j][k][kk]=1else:jw_test_image[test_str[i]][j][k][kk]=0 for i in range(10): jw_test_image[test_str[i]] = jw_test_image[test_str[i]].reshape((test_image[test_str[i]].shape[0],14*14))#得到二值化降維矩陣 jw_test_image''' 接下來,將降維矩陣賦值給操作數組 '''opr_test_image = dict.fromkeys(test_str) for i in range(10):opr_test_image[test_str[i]] = jw_test_image[test_str[i]].copy()#得到操作數組 opr_test_imagePhou = np.zeros(10,dtype =float) # 后驗概率初始數組 ans = np.zeros(10,dtype =float) for dig in range(10):for col in range(opr_test_image[test_str[dig]].shape[0]):tmp = opr_test_image[test_str[dig]][col] #得到14*14個參數Phou = np.zeros(10,dtype =float) # 后驗概率初始數組 for i in range(14*14):for j in range(10):if(tmp[i] != 0): # 若為1Phou[j] = Phou[j]+np.log(PP[i][j])else :Phou[j] = Phou[j]+np.log((1-PP[i][j]))for j in range(10): # 枚舉每一個數字Phou[j] = Phou[j] * P[j]if(dig == np.argmax(Phou)):ans[dig] = ans[dig]+1 # print(ans[dig])ans[dig] = ans[dig] / opr_test_image[test_str[dig]].shape[0]print("數字%d: "%(dig))print(ans[dig])print(np.mean(ans)) for dig in range(10):im = Image.fromarray(np.uint8(opr_test_image[test_str[dig]][0].reshape(14,14)))plt.imshow(im)plt.show()''' ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑降維到14*14的答案↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ''' ''' 輸出準確率圖像: ''' def autolabel(rects):for rect in rects:height = rect.get_height()plt.text(rect.get_x()+rect.get_width()/2.- 0.2, 1.03*height, '%.2f' % (height))name_list = ['0', '1', '2', '3', '4', '5', '6', '7','8','9',] num_list = [0.8306122448979592,0.9092511013215859,0.685077519379845,0.6514851485148515,0.6924643584521385,0.7365470852017937,0.7494780793319415,0.7334630350194552,0.6098562628336756,0.7205153617443013] autolabel(plt.bar(range(len(num_list)), num_list, color='rgb', tick_label=name_list)) plt.show()''' 下面是對測試集的一個圖像的處理樣例:'''''' tmp = tr[trstr[0]][0].copy() tmp = tmp.reshape(28,28) im = Image.fromarray(tmp) plt.imshow(im)plt.figure("Image") # 圖像窗口名稱 plt.imshow(tmp) plt.axis('on') # 關掉坐標軸為 off plt.title('image') # 圖像題目 plt.show() ''' ''' tmp = tr[trstr[0]][0].copy() tmp = tmp.reshape(28*28) for i in range(tmp.size) :if tmp[i] > 10 :tmp[i] = 1else :tmp[i] = 0tmp = tmp.reshape(28,28)im = Image.fromarray(np.uint8(tmp)) plt.imshow(im) '''''' out=np.zeros((7,7)) tmp=tmp.reshape(28,28)for i in range(7) :for j in range(7) :out[i][j] = np.sum(tmp[i*4:i*4+4,j*4:j*4+4]) print(out.size) print(out.shape) for i in range(7):for j in range(7):if(out[i][j] > 5) :out[i][j]=1else :out[i][j]=0 im = Image.fromarray(np.uint8(out)) plt.imshow(im) plt.show() '''''' dd = pd.date_range(end = '20191115',periods = 6,) print(dd) df1=pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006,1007,1008], "gender":['male','female','male','female','male','female','male','female'], "pay":['Y','N','Y','Y','N','Y','N','Y',], "m-point":[10,12,20,40,40,40,30,20]}) print(df1) '''

?

總結

以上是生活随笔為你收集整理的【人工智能课程实验】 - 利用贝叶斯分类器实现手写数字 的识别的全部內容,希望文章能夠幫你解決所遇到的問題。

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