matlab基于朴素贝叶斯变换的手写数字识别

matlab基于朴素贝叶斯变换的手写数字识别

欢迎各位大佬的指点。

代码

​ 原理部分参考大佬的即可。

https://blog.csdn.net/qq_32690999/article/details/78737393

https://blog.csdn.net/ctyqy2015301200079/article/details/83380533

​ 源码总共由三部分组成,fun1.m ,fun2.m ,preDeal.m。

​ 训练集在同文件夹下名为training文件夹内,内含“1” “2”等等文件夹,各个文件夹内有1.1,1.2等等照片。

为了便于处理,原图大小均为50*50,命名方式统一为”n.n.png“。

如下图

  • 总的工作目录

    • preDeal.m
    • fun1.m
    • fun2.m
    • training
      • 1
        • 1.0.png
        • 1.1.png
        • 等等
      • 2
        • 2.0.png

测试集我放在training下,随意即可,改一下路径就行。

fun1.m

  1. 读取图片并二值化
  2. 将图片分割成5*5矩阵
function res = fun1( a )
%FUN1 此处显示有关此函数的摘要
%   此处显示详细说明
thresh=graythresh(a);%确定二值化阈值
A=im2bw(a,thresh);%对图像二值化
% figure;subplot(121);imshow(a);
% subplot(122);imshow(A)
[m,n]=size(A);
M=floor(m/5);
N=floor(n/5);
halfSize=M*N/3;
res=zeros(5,5);
for c_Row=1:5
    for c_High=1:5
        count=0;
        for i=(c_Row-1)*M +1: c_Row*M
            for j=(c_High-1)*N +1:c_High*N
                if A(i,j)==0  
                    count=(count+1);
                    %fprintf('count=%f',count)
                end
            end
        end
        if count>=halfSize
            res(c_Row,c_High)=1;    %判断有字迹的为1
        else
            res(c_Row,c_High)=0;
        end
    end
end
end


fun2.m

1.由于训练集中每个数字的训练图片数量相等,则贝叶斯公式中类别的先验概率相等;对于同一个测试图片的同一特征,其先验概率也是相同的,因此只需比较特征的后验概率即可。由于假设特征的朴素的,因此只需将各个特征的概率相乘即可得到类别的后验概率,即为所求。

function pos = fun2( res ,flag )
%FUN2 此处显示有关此函数的摘要
%   此处显示详细说明
pos=1;
for tem1=1:5
    for tem2=1:5
        if(res(tem1,tem2)==1)
            pos=pos*flag(tem1,tem2);
        end
    end
end
end

preDeal.m

clc;clear;

%训练集
for jj=0:3
    eval(['flag' num2str(jj) '=zeros(5,5);']);
    for ii=0:9
        da=['training\' num2str(jj) '\' num2str(jj) '.' num2str(ii) '.png'];     
        a=imread(da);
        res=fun1(a);
        eval(['flag' num2str(jj) '=flag' num2str(jj) '+res;']);    
    end
end


%%测试集
a=imread('test0.png');
res=fun1(a);

%计算类别num的概率
array=zeros(1,10);
for num=0:3
    eval(['pos=fun2(res,flag' num2str(num) ');']);
    array(1,num+1)=pos;
end
[x,y]=max(array);%默认x是每一列的最大值向量,y是每列的最小值的下标组成的向量
fprintf('识别结果为:%d',y-1);



  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 30
    评论
实现手写数字识别的方法有很多种,其中朴素贝叶斯算法是一种常用的方法之一。下面是基于MNIST数据集实现手写数字识别matlab代码,使用朴素贝叶斯算法: ```matlab % 读取MNIST数据集 [train_images, train_labels] = mnist_parse('train-images.idx3-ubyte', 'train-labels.idx1-ubyte'); [test_images, test_labels] = mnist_parse('t10k-images.idx3-ubyte', 't10k-labels.idx1-ubyte'); % 转换为灰度图像 train_images_gray = reshape(train_images, size(train_images,1)*size(train_images,2), size(train_images,3))'; test_images_gray = reshape(test_images, size(test_images,1)*size(test_images,2), size(test_images,3))'; % 将像素值归一化到[0,1] train_images_norm = double(train_images_gray) / 255; test_images_norm = double(test_images_gray) / 255; % 训练朴素贝叶斯分类 nb_classifier = fitcnb(train_images_norm, train_labels); % 预测测试集 test_labels_pred = predict(nb_classifier, test_images_norm); % 计算准确率 accuracy = sum(test_labels_pred == test_labels) / length(test_labels); fprintf('Accuracy: %.2f%%\n', accuracy * 100); ``` 在上述代码中,我们首先使用`mnist_parse`函数读取MNIST数据集,并将图像转换为灰度图像,然后将像素值归一化到[0,1]。接着使用`fitcnb`函数训练朴素贝叶斯分类,并使用`predict`函数预测测试集的标签。最后计算准确率并输出结果。 需要注意的是,MNIST数据集的格式有点特殊,需要使用`mnist_parse`函数进行解析。此外,朴素贝叶斯算法的优点是易于实现和快速训练,但是在一些复杂的分类问题上可能表现不佳。如果需要更高的准确率,可以尝试其他分类算法,比如支持向量机(SVM)和深度学习算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值