MATLAB实现支持向量机算法(MNIST数据集)

基于MOOC人工智能之模式识别的课程完成的第三次作业
MATLAB实现支持向量机算法(MNIST数据集)
MOOC地址:人工智能之模式识别
SVM 是通过学习样本寻找分类间隔边界,把这一过程转化为了
一个优化问题。众所周知,分类间隔是由距离分类决策边界最近的那些少量样本决定的,而比这些样本距离分类决策边界更远的大量样本,其实都不会影响到最优权向量的求取,这些作用十分特殊的样本,就被称为“支持向量”,表示是他们支撑起了线性分类器在最大分类间隔意义下的最优解。这也是为什么这种算法被称为“支持向量机(Support Vector Machine,SVM)”的原因。

SVM.m 程序代码主要实现了数据集读入,定义 SVM 分类器模板、训练,测试及结果输出几个部分。

clear variables
clc
load ('./test_images.mat');
load ('./test_labels.mat');
load ('./train_images.mat');
load ('./train_labels.mat');%数据集的读入
train_num =2000;
test_num = 200;
  
  
data_train = mat2vector(train_images(:,:,1:train_num),train_num);%图像转向量
data_test = mat2vector(test_images(:,:,1:test_num),test_num);%mnist数据集图像为28*28
  
% 这里我们用最简单的线性模型做演示;SVM中可调的超参数非常多,如损失函数以及选用的核函数等
% 如果需要进一步设定,可以参考帮助文档,如设置t =
% templateSVM('Standardize',1,'KernelFunction','gaussian');,将t送入fitcecoc即可
% templateSVM()定义分类器模板
% fitcecoc()定义分类器训练

t = templateSVM('KernelFunction','linear');%这里采用了线性核函数
svm_model = fitcecoc(data_train,train_labels1(1:train_num),'Learners',t);
  
%训练模型,由于是多分类,不能直接调用fitcsvm,用多分类训练函数fitcecoc
%测试结果
%predict()定义分类器预测,对待识别样本利用指定的模板进行分类识别
result = predict(svm_model,data_test);
result = result.';
fprintf('预测结果:');
result(1:20)%取20个打印出来对比
fprintf('真实分布:');
test_labels1(1:20)
acc = 0.;
for i = 1:test_num
    if result(i)==test_labels1(i)
        acc = acc+1;
    end
end
fprintf('精确度为:%5.2f%%\n',(acc/test_num)*100);
  

当训练样本数量为2000时,贝叶斯分类器对MNIST手写数字的识别精确度是96%
MATLAB实现支持向量机算法(MNIST数据集)_第1张图片

你可能感兴趣的:(模式识别,模式识别,机器学习)