【MATLAB】机器学习:线性判别分析LDA与支持向量机SVM的综合实验

实验内容

1.根据多类人脸图,实现线性判别分析,求得投影矩阵W 。
2.将W作用在测试样本上,画出测试样本在投影后的分布图。(d’=2)
3.根据投影后的训练数据和测试数据,使用支持向量机获得分类精度。
4.找出使得支持向量机分类精度最高的d’。

实验代码

clear;clc;
%% 导入图片数据
img_path0="C:\machine learning\11.实验十一\ORL人脸库";
tab={'s1','s2','s3','s4','s5','s6','s7','s8','s9','s10','s11','s12','s13','s14','s15','s16','s17','s18','s19','s20','s21','s22','s23','s24','s25','s26','s27','s28','s29','s30','s31','s32','s33','s34','s35','s36','s37','s38','s39','s40'};
data=[];label=[];
for i=1:size(tab,2)
    path_regexp=strcat(img_path0,'\',tab{i},'\','*.bmp');
    file=dir(path_regexp);
    for j=1:size(file)
        img_name=file(j).name;
        img_path=strcat(img_path0,'\',tab{i},'\',img_name);
        image=imread(img_path);
        image=imresize(image,[10,10]);  % 为提高运算速度,将图像大小设为10×10
        image=double(image);
        data=[data,image(:)];
    end
    label=[label,i*ones(1,10)];
end
save data.mat data;
save label.mat label;
%% 留出法划分训练集和测试集(data里每10列中随机选6列作为训练集,剩下4列作为测试集)
load data.mat;load label.mat;
train=[];test=[];train_label=[];test_label=[];
for i=1:40
    k=randperm(10);
    x=(i-1)*10+k(:,1:6);
    y=(i-1)*10+k(:,7:10);
    train=[train,data(:,x)];
    train_label=[train_label,label(:,x)];
    test=[test,data(:,y)];
    test_label=[test_label,label(:,y)];
end

%% ************************问题一************************
%% 对训练集进行LDA降维,得到对应投影矩阵W;
[mappedX,mapping]=lda(train',train_label,2);
% % 绘制训练集的投影后的分布图
% for i=1:40
%     index=find(train_label==i);
%     plot(mappedX(index,1),mappedX(index,2),'.');
%     hold on;
% end

%% ***********************问题二*************************
%% 将投影矩阵W作用于测试集,并绘制出测试集投影后的分布图
mappedX_test=test'*mapping.M;
for i=1:40
    index=find(test_label==i);
    plot(mappedX_test(index,1),mappedX_test(index,2),'.');
    hold on;
end

%% ***********************问题三*************************
%% 使用支持向量机对投影后的训练集和测试集进行分类
model=svmtrain(train_label',mappedX);      % 训练模型
[predict_label, accuracy, dec_values]=svmpredict(test_label',mappedX_test,model); % 测试分类

%% ***********************问题四*************************
%% 绘制LDA函数的维度d与支持向量机精度的关系图
Accuracy=[];
for d=1:500
    [mappedX,mapping]=lda(train',train_label,d);    % 对训练集进行LDA降维至d维
    mappedX_test=test'*mapping.M;                   % 对测试集进行LDA降维
    model=svmtrain(train_label',mappedX);           % 训练模型
    [predict_label, accuracy, dec_values]=svmpredict(test_label',mappedX_test,model); % 测试分类
    Accuracy(1,d)=accuracy(1);
end
d=1:1:500;
plot(d,Accuracy);	% 绘制维度d与支持向量机精度的关系图

实验结果

图1. 测试样本在投影后的分布图
图2. 确定最佳维度

实验心得

通过本次“线性判别分析LDA与支持向量机SVM的综合实验”,我对线性判别分析LDA和支持向量机SVM的运用更加熟练。其中应当注意在使用LDA的函数lda时,数据集参数应当将样本作为一行存储,标签参数则形成一个行向量。
此外,在本次实验过程中(先划分训练集和测试集,然后对训练集进行LDA降维,并使用投影矩阵对测试集进行降维,最后用SVM对测试集进行预测),我发现在使用LDA降维至2-100任一维度时,使用SVM的进行预测后的预测精度总为2.5%。
但是对所有数据同时进行LDA降维后,再划分训练集和测试集,最后使用SVM对测试集进行预测发现预测精度可达98%。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Orange_Jet

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

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

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

打赏作者

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

抵扣说明:

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

余额充值