【MATLAB】机器学习:基于最短距离的二分类实验

实验内容

1.根据ABERDEEN人脸数据库,将男士和女士分别作为正、负样本,利用留出法完成训练集与测试集的划分,并使用测量最短距离的方式进行二分类,最后给出分类错误率和准确率。
2.将MIT室内场景数据库中机场、面包房作为正负样本,利用留出法完成训练集与测试集的划分,并使用测量最短距离的方式进行二分类,最后给出分类错误率和准确率。
3.对MIT室内场景数据库中的测试集添加噪声,然后使用测量最短距离的方式进行二分类,给出噪声情况下的分类错误率和准确率。

实验代码

%% ***************问题1*****************
%  ************ABERDEEN人脸数据库***********
clear;clc;
%% 提取文件夹ABERDEEN人脸数据库
img_path0="C:\machine learning\3.实验三\ABERDEEN人脸数据库";
tab={'adrian','alison'};
x1=[];  % 存放adrian数据库的图片
x2=[];  % 存放alison数据库的图片
for i=1:size(tab,2)
    img_path1=fullfile(img_path0,tab{i});
    img_path2=strcat(img_path1,'*.jpg');
    img_list=dir(img_path2);
    for j=1:size(img_list)
        img_path=strcat(img_path1,num2str(i),'.jpg');
        image=imread(img_path);
        if size(image,3)==3    % 若为彩图,则转化为灰度图
           image=rgb2gray(image);
        end
        image=imresize(image,[500,300]);    % 更改图片大小为500*300
        if i==1     % 若为adrian,则放入x1矩阵
           x1=[x1,image(:)]; 
        else        % 若为alison,则放入x2矩阵
           x2=[x2,image(:)];
        end
    end
end
%% 留出法划分训练样本和测试样本
% adrian图片集
n1=randperm(5);
X1_1=x1(:,n1(:,1:3));   % X1_1存放x1中任意3列的数据
X1_2=x1(:,n1(:,4:5));   % X1_2存放x1中剩余2列的数据
% alison图片集
n2=randperm(4);
X2_1=x2(:,n2(:,1:2));   % X2_1存放x2中任意2列的数据
X2_2=x2(:,n2(:,3:4));   % X2_2存放x2中剩余2列的数据
% 组合成训练集和测试集,并给训练集贴上标签
Xtrain=[X1_1,X2_1];     % 训练集
Xtest=[X1_2,X2_2];      % 测试集
Xlabel=[1,1,1,-1,-1];   % 训练集标签
%% 最短距离进行二分类
Predict_label=[];       % 测试集的预测标签
for i=1:size(Xtest,2)
   temp=Xtest(:,i);
   tmp=repmat(temp,1,size(Xtrain,2));
   dist=sqrt(sum((tmp-Xtrain).^2,1));           % 计算距离
   [num,index]=min(dist);
   Predict_label=[Predict_label,Xlabel(index)]; % 确定所属标签
end
True_label=[1,1,-1,-1]; % 测试集的真实标签
f=(Predict_label==True_label);
acc=sum(f)/size(True_label,2)   % 准确率
error=1-acc                     % 错误率

%% ***************问题2*****************
%  *************MIT室内场景数据库***********
clear;clc;
%% 提取文件夹MIT室内场景的图片
img_path0="C:\machine learning\3.实验三\MIT室内场景";
tab={'airport_inside','bakery'};
x1=[];  % 存放airport_inside文件夹的图片
x2=[];  % 存放bakery文件夹的图片
for i=1:size(tab,2)
   img_path1=fullfile(img_path0,tab{i},'\');
   img_path2=strcat(img_path1,'*.jpg');
   img_list=dir(img_path2);
   for j=1:size(img_list)
       img_name=img_list(j).name;
       img_path=strcat(img_path1,img_name);
       image=imread(img_path);
       if size(image,3)==3  % 若为彩图,则转化为灰度图
           image=rgb2gray(image);
       end
       image=imresize(image,[500,800]); % 更改图片大小为500*800
       if i==1
           x1=[x1,image(:)];    % 若为airport_inside,则放入x1矩阵
       else
           x2=[x2,image(:)];    % 若为bakery,则放入x2矩阵
       end
   end
end
%% 留出法划分训练样本和测试样本
load 'x1.mat';
load 'x2.mat';
% airport_inside文件夹下的图片
n1=randperm(size(x1,2));
n1_part1=n1(1:round(length(n1)*(2/3)));
n1_part2=n1(1+round(length(n1)*(2/3)):end);
X1_1=x1(:,n1_part1);    % X1_1存放x1中任意2/3列的数据
X1_2=x1(:,n1_part2);    % X1_2存放x1中剩余1/3列的数据
% badery文件夹下的图片
n2=randperm(size(x2,2));
n2_part1=n2(1:round(length(n2)*(2/3)));
n2_part2=n2(1+round(length(n2)*(2/3)):end);
X2_1=x2(:,n2_part1);    % X2_1存放x2中任意2/3列的数据
X2_2=x2(:,n2_part2);    % X2_2存放x2中剩余1/3列的数据
% 组合成训练集和测试集,并给训练集贴上标签
Xtrain=[X1_1,X2_1];    % 训练集
Xtest=[X1_2,X2_2];     % 测试集
Xlabel=[ones(1,size(X1_1,2)),-ones(1,size(X2_1,2))];    % 训练集标签
%% 最短距离求二分类
Predict_label=[];   % 测试集的预测标签
for i=1:size(Xtest,2)
   temp=Xtest(:,i);
   tmp=repmat(temp,1,size(Xtrain,2));
   dist=sqrt(sum((tmp-Xtrain).^2,1));   % 计算距离
   [num,index]=min(dist);
   Predict_label=[Predict_label,Xlabel(index)]; % 确定所属标签
end
True_label=[ones(1,size(X1_2,2)),-ones(1,size(X2_2,2))];    % 测试集的真实标签
f=(Predict_label==True_label);
acc=sum(f)/size(True_label,2)   % 准确率
error=1-acc                     % 错误率

%% ***************问题3*****************
%  **************加入椒盐噪声***************
image=imnoise(image,'salt & pepper',0.1);    % 加入噪声密度:0.1的椒盐噪声

实验心得

通过本次实验,我学会了利用最短距离对样本进行二分类。具体步骤为:提取图片-划分训练集和测试集-计算最短距离对应的标签进行分类。其中,在用二分法进行划分训练集和测试集时,需要循环10次求出不同的测试集的预测标签,然后对10次结果的进行取平均值得到最终的正确率和错误率。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Orange_Jet

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

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

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

打赏作者

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

抵扣说明:

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

余额充值