机器学习-模式识别(6)SVM支持向量机实现MNIST手写体数据集分类

基本原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分析:

matlab中SVM分类函数fitcsvm(trainset_t,train_set_labels_t);支持的训练集格式为Na,即N维特征,a个样本数,需要把图片mn维特征转化列向量后传入fitcsvm;图片转化时要注意,不可直接使用reshape(mn,a)转化为列向量,matlab中reshape函数维度转换原理为每行读取mn个元素后+1,会导致样本数据混乱;因此要使用reshape(a,m*n)’的方式,先转换为行向量再进行转置。在这里插入图片描述

%训练SVM模型
%3 8
Model = fitcsvm(trainset_t,train_set_labels_t);
sv = Model.SupportVectors;
[SuptNum SupSize]=size(sv); %SupNum即为支撑向量个数 SupSize为支撑向量维度即样本维度
figure(1)
subplot(211)
gscatter(trainset_t(:,350),trainset_t(:,351),train_set_labels_t);
title('样本分布散点图')
subplot(212)
gscatter(trainset_t(:,350),trainset_t(:,351),train_set_labels_t);
hold on
plot(sv(:,350),sv(:,351),'ko','MarkerSize',10);
firstLabel = train_set_labels_t(1);
secondLabel = setdiff(train_set_labels_t,firstLabel);
legend(num2str(firstLabel),num2str(secondLabel),'Support Vector');
hold off
 
% 预测测试集的标签
[predict_label,score] = predict(Model,testset_t);
% 得到错误率
err = (predict_label ~= test_set_labels_t);
err = sum(err);
errRadio = err / size(predict_label,1);
fprintf('测试集预测错误个数%d,测试集预测错误率:%f\n',err,errRadio);
p=0;
%求支撑向量下标和两类支撑向量分别的个数
for i=1:SuptNum
    for j=1:200
    if(sv(i,:)==checkset(j,1:784))
        if(j<=100)
            class1=i;
        end
        Table(i,:)=[i,checkset(j,785)];
    end
    end
end
class2=SuptNum-class1;
fprintf('3和8共有%d个支撑向量,图片3有%d个 图片8有%d个\n',SuptNum,class1,class2);
maxNum=0;
minNum=1;
maxR=0;
minR=1;
 
%求支撑向量两两间的相关系数
for i=1:class1
    for j=class1+1:SuptNum
    r=corrcoef(sv(i,:),sv(j,:));
    sp_R(i,:)=r(1,2);
    if(maxR<r(1,2))
        maxR=r(1,2);
        maxNum=[i,j];
    end
    if(minR>r(1,2))
        minR=r(1,2);
        minNum=[i,j];
    end 
    end
end
mean_sp_R=mean(sp_R);
showMax1=sv(maxNum(1,1),:)';
showMax2=sv(maxNum(1,2),:)';
showMax1=reshape(showMax1,28,28);
showMax2=reshape(showMax2,28,28);
showMin1=sv(minNum(1,1),:)';
showMin2=sv(minNum(1,2),:)';
showMin1=reshape(showMin1,28,28);
showMin2=reshape(showMin2,28,28);
fprintf('3和8中第%d(训练集中的下标%d)个与第%d(训练集中的下标%d)个支撑向量相关系数最大为:%f\n',maxNum(1,1),Table(maxNum(1,1),2),maxNum(1,2),Table(maxNum(1,2),2),maxR);
fprintf('3和8中第%d(训练集中的下标%d)个与第%d(训练集中的下标%d)个支撑向量相关系数最小为:%f\n',minNum(1,1),Table(minNum(1,1),2),minNum(1,2),Table(minNum(1,2),2),minR);
figure(2)
subplot(3,2,1);imshow(showMax1);title('支撑向量中相关系数最大');
subplot(3,2,2);imshow(showMax2);title('支撑向量中相关系数最大');
subplot(3,2,3);imshow(showMin1);title('支撑向量中相关系数最小');
subplot(3,2,4);imshow(showMin2);title('支撑向量中相关系数最小');
subplot(325)
W=Model.Beta*300000;
W=reshape(W,28,28);
imshow(W);
title('W向量');
maxNum=0;
minNum=1;
maxR=0;
minR=1;
%求样本间的两两相关系数
for i=1:100
    for j=101:200
        r=corrcoef(trainset(:,i),trainset(:,j));
        R(i,:)=r(1,2);
        if(maxR<r(1,2))
        maxR=r(1,2);
        maxNum=[i,j];
    end
    if(minR>r(1,2))
        minR=r(1,2);
        minNum=[i,j];
    end 
    end
end
mean_r=mean(R);
fprintf('第%d个与第%d个样本相关系数最大为:%f\n',maxNum(1,1),maxNum(1,2),maxR);
fprintf('第%d个与第%d个样本相关系数最小为:%f\n',minNum(1,1),minNum(1,2),minR);   
fprintf('支撑向量间两两相关系数均值:%f\n',mean_sp_R); 
fprintf('样本间两两相关系数均值:%f\n',mean_r); 
showMax1=trainset(:,maxNum(1,1));
showMax1=reshape(showMax1,28,28);
showMax2=trainset(:,maxNum(1,2));
showMax2=reshape(showMax2,28,28);
showMin1=trainset(:,minNum(1,1));
showMin1=reshape(showMin1,28,28);
showMin2=trainset(:,minNum(1,2));
showMin2=reshape(showMin2,28,28);
figure(3)
subplot(2,2,1);imshow(showMax1);title('样本中相关系数最大');
subplot(2,2,2);imshow(showMax2);title('样本中相关系数最大');
subplot(2,2,3);imshow(showMin1);title('样本中相关系数最小');
subplot(2,2,4);imshow(showMin2);title('样本中相关系数最小');
fprintf('\n');
  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MNIST手写数据集是一个非常经典的数据集,包含了60,000个训练数据和10,000个测试数据。每个数据都是一张28×28像素的灰度图片,表示0~9中的一个数字支持向量机(Support Vector Machine,简称SVM)是一种常见的分类算法,其主要思想是通过寻找最优超平面来将不同类别的数据分开。在R语言中,可以使用e1071包中的svm函数来实现SVM。 以下是使用R语言实现MNIST手写数据集识别的基本步骤: 1. 下载MNIST数据集并导入R语言中。这里我们使用R中自带的datasets包中的mnist数据集: ```r library(datasets) mnist <- datasets::mnist ``` 2. 将训练数据和测试数据分别提取出来: ```r train_images <- mnist$train$x train_labels <- mnist$train$y test_images <- mnist$test$x test_labels <- mnist$test$y ``` 3. 将图片数据转换为二维矩阵: ```r train_images <- array(train_images, dim = c(dim(train_images)[1], 28, 28)) test_images <- array(test_images, dim = c(dim(test_images)[1], 28, 28)) ``` 4. 将二维矩阵展开为一维向量: ```r train_images <- apply(train_images, c(1, 2), function(x) as.numeric(x)) test_images <- apply(test_images, c(1, 2), function(x) as.numeric(x)) ``` 5. 将标签数据转换为因子类型: ```r train_labels <- as.factor(train_labels) test_labels <- as.factor(test_labels) ``` 6. 使用svm函数训练模型并进行预测: ```r library(e1071) model <- svm(train_images, train_labels) pred_labels <- predict(model, test_images) ``` 7. 计算模型的准确率: ```r accuracy <- sum(pred_labels == test_labels) / length(test_labels) ``` 以上就是使用R语言支持向量机实现MNIST手写数据集识别的基本步骤。当然,这只是一个简单的示例,实际应用中可能需要对数据进行更多的处理和特征提取。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香草绵绵冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值