模式识别作业6实验报告


近期学习任务:

  • 完成模式识别大作业
  • 准备报告SDeCNN论文并实现
  • 随机分析课后习题
  • 压缩感知论文公式改错
  • IEEE模式识别论文翻译与报告

利用贝叶斯分类器实现手写数字识别

基本原理

  1. 对每个手写的数字样品,按bxb(如b=5)方式划分,共有b2份。
  2. 对每一份内的象素个数进行累加统计,除以每一份内的象素总数,设定阈值T=0.05(可改),若每一份内的象素占有率大于T则对应的特征值为1,否则为0。
  3. 先计算数字ii的先验概率P(ωi)=NiNP(\omega_i)=\frac{N_i}{N},其中NiN_i为数字ii的样品数,NN为样品总数。
  4. 再计算Pj(ωi)=k=0,XωiNixkj+1Ni+2P_j(\omega_i)=\frac{\sum_{k=0,X\in\omega_i}^{N_i}x_{kj}+1}{N_i+2},再计算类条件概率P(Xωi)=j=024P(xj=αXωi)P(X|\omega_i)=\prod_{j=0}^{24}P(x_j=\alpha|X\in\omega_i),其中Pj(ωi)P_j(\omega_i)表示样品XX属于ωi\omega_i类条件下,XX的第jj个分量为1的概率估计值,α=0or1\alpha=0\,or\,1.
  5. 利用贝叶斯公式求后验概率P(ωiX)=P(ωi)P(Xωi)k=09P(ωk)P(Xωk)i=0,1,,9.P(\omega_i|X)=\frac{P(\omega_i)P(X|\omega_i)}{\sum_{k=0}^9P(\omega_k)P(X|\omega_k)},i=0,1,\cdots,9.
  6. 后验概率的最大值的类别0-9就是手写数字的所属类别。

实验数据采集

从网上下载,来源:https://blog.csdn.net/qq_25005311/article/details/97910815
有4000张手写数字图片,大小为28×28,数字0-9分别有400张。部分图片如下:
在这里插入图片描述

算法流程

算法的思维导图为:

实验结果分析(key)

取不同的样本个数,设定不同的划分数b和阈值T,得到数字识别正确率的百分比如下两个表格:

表格1

样本总数\参数 b=7,T=0.06 b=7,T=1/16 b=7,T=2/16 b=7,T=3/16 b=7,T=4/16 b=7,T=5/16
100 86% 87% 86% 82% 85% 83%
500 72.4% 73.4% 77.6% 76.4% 74.8% 73.8%
1000 70% 71.7% 74% 75.1% 74.2 75.2%
2000 69.1% 71.65% 73.25% 74.1% 72.25% 72.6%
3000 69.53% 71.37% 73.33% 74.33% 72.97% 73.77%
4000 70.03% 71.92% 73.72% 74.42% 72.72% 73.12%

表格2

样本总数\参数 b=7,T=6/16 b=7,T=7/16 b=7,T=8/16 b=14,T=1/4 b=14,T=2/4 b=28,T=0
100 85% 84% 81% 95% 92% 97%
500 76.6% 77% 70% 85.2% 83.6% 85.6%
1000 76.4 75.8% 72.5% 83.8% 83.1% 84.7%
2000 73.75% 73.6% 69.95% 81.35% 80.65% 82.45%
3000 74.33% 73.7% 69.83% 81.97% 81.03% 82.73%
4000 73.52% 72.9% 69.67% 81.7% 80.65% 82.27%

上表可以看到,当b=28,T=0,即对图片不做分块处理,阈值为0时识别率最高,基本在80%以上。下图为样本总数等于100时的数字识别矩阵,可以看到,错误识别三个数字
在这里插入图片描述
识别错误的图片为:

下图为样本总数等于100时的数字识别矩阵:
在这里插入图片描述
在这里插入图片描述
Bayes分类器的优点和缺点为:

  • 优点:贝叶斯算法高效,易于实现。
  • 缺点:分类性能不一定很高。

程序代码

clear;clc;
tune_b = 28; % 需要调的参数1
tune_T = 0;  % 需要调的参数2
A = [];N1=9; % 每个数字样本个数为N1+1,需要调的参数3
N = 10*(N1+1); % 样本总数为N
for i=0:9
    B = [];
    for j=0:N1
        x = im2double(imread(strcat('D:\kp_matlab\hw6-number_recog\01\images4000\',...
            num2str(i),'_', num2str(j),'.bmp')));
        b = tune_b; % b*b方式划分,影响正确率
        a = size(x,1)/b; % 每份的行数
        a1 = a*ones(1,b);
        x = mat2cell(x,a1,a1); %28*28的数值矩阵分块,分成b*b
        x = reshape(x,b^2,1); % 将矩阵转化为列向量
        C = [];
        for k = 1:b^2
            c = (cell2mat(x(k))~=0);
            count = sum(c(:));
            t = count/a^2;
            T = tune_T; % 修改阈值提高正确率
            if t>T
                t=1;
            else t=0;
            end
            C = [C;t]; % 构造特征指标列向量
        end
        B = [B,C]; % 拼接每个样本的指标列向量
    end
    A = cat(3,A,B); % 每个数字样本个数都相同,构造数字0-9的三维特征矩阵
end

P1 = (N1+1)/N; % 先验概率
for i = 1:10
    for j=1:b^2
        s = sum(A(j,:,i))+1;
        P(i,j) = s/((N1+1)+2); % 计算样品X属于wi类条件下,X的第j个分量为1的概率估计值
    end
end

p = ones(10,1);
for h=1:10
    for k=1:(N1+1)
        for i=1:10
            for j=1:b^2
                if A(j,k,h)==1
                    p(i)=p(i)*P(i,j);
                else p(i)=p(i)*(1-P(i,j));
                end
            end
        end
        p = P1*p; % 利用贝叶斯公式求后验概率,分母都相同故忽略不计
        [maxval,index] = max(p); % 后验概率的最大值的类别0-9就是手写数字的所属类别
        I(h,k) = index; % 行h表示数字0-9,列k表示样本
        p = ones(10,1);
    end
end

I = I-1;
disp(I); % 显示数字识别矩阵
for i=1:10
    z(i) = sum((I(i,:)~=i-1));
end
disp(sum(z(:))); % 计算识别错误的总个数
disp((N-sum(z(:)))/N); % 计算正确率

利用支持向量机实现手写数字识别

基本原理

算法流程

实验结果分析

程序代码

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章