基于MNIST数据集通过朴素贝叶斯学习生成随机手写体数字图像

本文介绍了如何基于MNIST数据集,利用朴素贝叶斯方法学习并生成随机手写体数字图像。首先讲解了贝叶斯方法,接着详细描述了数据集的获取与导入。在实现过程中,通过统计计算得到类别先验概率和特征向量的后验概率,进而随机生成图像。最后展示了生成图片的效果,并提供了Python实现代码。
摘要由CSDN通过智能技术生成

        好久没写博客了,话不多说,进入主题。

1、贝叶斯方法

        关于贝叶斯方法,刘未鹏的文章一出,感觉不再需要其他文章了。读者可以阅读以下http://mindhacks.cn/2008/09/21/the-magical-bayesian-method/

2、训练数据集

        经典的手写数字图像训练和测试集来自http://yann.lecun.com/exdb/mnist/。读者可以下载。

3、具体实现过程

        3.1 导入数据集

        上面提到的数据由于编码问题,需要自己写导入方法,如果你也是用python的话,有现成的模板可以使用。推荐一个GitHub的下载地址

        3.2 学习并生成图片

        对于一张图像,例如数据集中28*28的图像,每个像素点像素值为0~255。这样一来,经过抽象,一张图像可以分为图像本身数据信息images和它所表示的意义label。其中,images是一个28*28=784维的特征集,且每个维度的特征有256个取值(0~255的像素值)labe

可以实现基于朴素贝叶斯分类器的手写数字识别,具体步骤如下: 1. 读取MNIST数据集,可以使用MATLAB自带的load函数: ``` load('mnist_all.mat'); ``` 2. 将数据集分为训练集和测试集,可以按照80:20的比例进行划分: ``` train_ratio = 0.8; train_num = round(train_ratio*size(train0,1)); train_x = [train0(1:train_num,:);train1(1:train_num,:);train2(1:train_num,:);train3(1:train_num,:);train4(1:train_num,:);train5(1:train_num,:);train6(1:train_num,:);train7(1:train_num,:);train8(1:train_num,:);train9(1:train_num,:)]; train_y = [zeros(train_num,1);ones(train_num,1);2*ones(train_num,1);3*ones(train_num,1);4*ones(train_num,1);5*ones(train_num,1);6*ones(train_num,1);7*ones(train_num,1);8*ones(train_num,1);9*ones(train_num,1)]; test_x = [test0;test1;test2;test3;test4;test5;test6;test7;test8;test9]; test_y = [zeros(size(test0,1),1);ones(size(test1,1),1);2*ones(size(test2,1),1);3*ones(size(test3,1),1);4*ones(size(test4,1),1);5*ones(size(test5,1),1);6*ones(size(test6,1),1);7*ones(size(test7,1),1);8*ones(size(test8,1),1);9*ones(size(test9,1),1)]; ``` 3. 对训练集中的每个数字进行特征提取,可以使用像素值作为特征: ``` train_features = double(train_x)/255; ``` 4. 训练朴素贝叶斯分类器,可以使用MATLAB自带的fitcnb函数: ``` nb = fitcnb(train_features,train_y); ``` 5. 对测试集中的每个数字进行特征提取,并使用训练好的朴素贝叶斯分类器进行分类: ``` test_features = double(test_x)/255; test_pred = predict(nb,test_features); ``` 6. 计算分类准确率: ``` accuracy = sum(test_pred==test_y)/length(test_y); ``` 完整代码如下: ``` load('mnist_all.mat'); train_ratio = 0.8; train_num = round(train_ratio*size(train0,1)); train_x = [train0(1:train_num,:);train1(1:train_num,:);train2(1:train_num,:);train3(1:train_num,:);train4(1:train_num,:);train5(1:train_num,:);train6(1:train_num,:);train7(1:train_num,:);train8(1:train_num,:);train9(1:train_num,:)]; train_y = [zeros(train_num,1);ones(train_num,1);2*ones(train_num,1);3*ones(train_num,1);4*ones(train_num,1);5*ones(train_num,1);6*ones(train_num,1);7*ones(train_num,1);8*ones(train_num,1);9*ones(train_num,1)]; test_x = [test0;test1;test2;test3;test4;test5;test6;test7;test8;test9]; test_y = [zeros(size(test0,1),1);ones(size(test1,1),1);2*ones(size(test2,1),1);3*ones(size(test3,1),1);4*ones(size(test4,1),1);5*ones(size(test5,1),1);6*ones(size(test6,1),1);7*ones(size(test7,1),1);8*ones(size(test8,1),1);9*ones(size(test9,1),1)]; train_features = double(train_x)/255; nb = fitcnb(train_features,train_y); test_features = double(test_x)/255; test_pred = predict(nb,test_features); accuracy = sum(test_pred==test_y)/length(test_y); disp(['Accuracy: ',num2str(accuracy)]); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值