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

读入数据与预处理

因为老师给的文件无法直接读取,故从官网导入数据:

官网链接: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的矩阵。↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

下面处理得到对应的降维矩阵:

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一步步编写操作系统 77 内联汇编与ATT语法简介

内联汇编 之前和大家介绍过了一种汇编方法,就是C代码和汇编代码分别编译,最后通过链接的方式结合在一起形成可执行文件。 另一种方式就是在C代码中直接嵌入汇编语言,强大的GCC无所不能,咱们本节要学习的就是这一种,它…

【Python学习】内置函数(不断更新)

关于常用在for循环中的range函数 python range() 函数可创建一个整数列表,一般用在 for 循环中。 函数语法 range(start, stop[, step]) 参数说明: start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range&#…

【Python学习】 简单语法与常见错误(持续更新)

关于单引号和双引号 当输出的字符串内部没有单引号的时候,外面可以用单引号, 但是如果内部有了单引号,那么外部只能用双引号。 dict {Name: Zara, Age: 7, Class: First} print(dict) print (dict[Name]: , dict[Name]) print ("dic…

一步步编写操作系统 78 intel汇编与ATT汇编语法区别

本节咱们介绍下intel汇编语法和at&t汇编语法的区别。 以上表中未列出这两种语法在内存寻址方面的差异,个人觉得区别还是很大的,下面单独说说。 在Intel语法中,立即数就是普通的数字,如果让立即数成为内存地址,需要…

重读经典:《Masked Autoencoders Are Scalable Vision Learners》

MAE 论文逐段精读【论文精读】这一次李沐博士给大家精读的论文是 MAE,这是一篇比较新的文章,2021年11月11日才上传到 arXiv。这篇文章在知乎上的讨论贴已经超过了一百万个 view,但是在英文社区,大家反应比较平淡一点,R…

【Python学习日志】 - Numpy包

NumPy是什么? 使用Python进行科学计算的基础包,在数据分析的时候比较常用到矩阵计算。这时太多的Np属性不记得,所以方便自己使用把一些常用的Np属性汇总记录一下使用的时候方便查找。 ndarray.ndim 阵列的轴数(尺寸)…

详解协同感知数据集OPV2V: An Open Benchmark Dataset and Fusion Pipeline for Perception with V2V Communication

在《详解自动驾驶仿真框架OpenCDA: An Open Cooperative Driving Automation Framework Integrated with Co-Simulation》 一文中介绍了自动驾驶仿真框架 OpenCDA。本文将介绍论文作者另一篇最新工作 OPV2V,论文收录于 ICRA2022。 OPV2V 数据集主要 feature 有&…

【Python学习】 - 如何在Spyder中弹出plot绘图窗口而不是在Console中绘图

依次选择这几项: 点击ok确认。 注意:点击ok之后不会立即生效,重启Spyder之后才会生效

mysql系列:加深对脏读、脏写、可重复读、幻读的理解

关于相关术语的专业解释,请自行百度了解,本文皆本人自己结合参考书和自己的理解所做的阐述,如有不严谨之处,还请多多指教。 **不可重复读的重点是修改: **同一事务,两次读取到的数据不一样。 幻读的重点在于新增或者…

重读经典(点云深度学习开山之作):《Deep learning on point clouds for 3D scene understanding》(持续更新中)

本文介绍的是 PointNet 作者的博士论文:3D场景理解中的点云深度学习。从上图可以看到,整个博士论文主要贡献有两块:一是点云深度学习的网络架构(PointNet 和 PointNet);二是在3D场景理解中的应用&#xff0…

Coursera自动驾驶课程第17讲:An Autonomous Vehicle State Estimator

在第16讲《Coursera自动驾驶课程第16讲:LIDAR Sensing》我们学习了自动驾驶目前常用的3D 传感器,激光雷达,了解了激光雷达的工作原理,掌握了对点云数据的操作以及如何使用点云配准方法来进行汽车定位。 回顾一下,在本…

!何为脏读、不可重复读、幻读

2.0、前言 事务的隔离性是指多个事务并发执行的时候相互之间不受到彼此的干扰的特性,隔离性是事务ACID特性中的I,根据隔离程度从低到高分为Read Uncommitted(读未提交),Read Committed(读已提交&#xff0…

【转】JPA、Hibernate和Mybatis区别和总结

很多人都用过java的数据库连接池C3P0,但官方没有说明名称的由来。 据传闻:连接池作者是《星球大战》迷,C3P0就是其中的一个机器人,并且这个名称中包涵connection 和pool的单词字母。因此叫这个名字(根据网友提醒&…

详解3D物体检测模型: Voxel Transformer for 3D Object Detection

本文介绍一个新的的3D物体检测模型:VoTr,论文已收录于ICCV 2021。 这是第一篇使用 voxel-based Transformer 做3D 主干网络,用于点云数据3D物体检测。由于有限的感受野,传统的 3D 卷积网络检测器(voxel-based&#xff…

一步步编写操作系统 65 标准调用约定stdcall 汇编实战

因为c语言遵循的调用约定是cdecl,咱们也自然要遵守cdecl约定了。不过为了起到对比的作用,除了介绍cdecl外,也会介绍下stdcall。 既然咱们用的是调用约定是cdecl,那对它的介绍最好让它离下一节的内容近一些,所以先说一…

Coursera自动驾驶课程第18讲:The Planning Problem

在第17讲《Coursera自动驾驶课程第17讲:An Autonomous Vehicle State Estimator》 我们学习了如何使用多传感器融合进行自车定位,以及传感器的内外参标定和时间同步,我们还讨论了在实际应用中常遇到的问题。 从本讲开始我们将学习一个新的模…

详解3D物体检测模型:Focal Sparse Convolutional Networks for 3D Object Detection

用于3D目标检测的焦点稀疏卷积神经网络【CVPR2022】【3D检测】本文介绍一篇新的 3D 物体检测模型:Focals Conv,论文收录于 CVPR2022。在 3D 检测任务中,点云或体素数据不均匀地分布在3维空间中,不同位置的数据对物体检测的贡献是不…

地平线:面向规模化量产的自动驾驶感知研发与实践

导读 4月27日,地平线智能驾驶感知研发部负责人苏治中就 《面向规模化量产的自动驾驶感知研发与实践》 这一主题进行了直播讲解。 本次课程内容分为4个部分: 1、地平线自动驾驶环境感知量产实践 2、软硬协同的自动驾驶感知算法设计 3、实现规模化量产的“…

Power BI与Power Query、Power Pivot 是什么关系?

搞不清楚Power BI与Power Query、Power Pivot是什么关系?看这篇文章就够了。 刚开始学习PowerBI的时候,总是能碰到Power Query和Power Pivot这两个词(下文简称为PQ和PP),现在中文里面学习PowerBI的资源本来就不是很多&#xff0c…

地平线:上帝视角与想象力——自动驾驶感知的新范式

导读 3月28日,在「地平线自动驾驶技术专场」上,地平线自动驾驶系统架构师刘景初博士围绕《上帝视角与想象力——自动驾驶感知的新范式 》这一主题进行了直播讲解。 本次课程主要分为以下4个部分: 1、自动驾驶结构演化提出算法新需求 2、软件2…