【MATLAB】机器学习:基于相似性度量的二分类实验

实验内容

1.将MIT室内场景数据库中卧室、浴室作为正负样本,利用留出法完成训练集与测试集的划分(比例2:1),并使用测量夹角余弦的方式进行二分类(0为负,1为正),最后给出分类错误率和准确率,并绘制ROC曲线。
2.在1的基础上对测试集添加噪声,给出噪声情况下的分类错误率、准确率、ROC曲线。

实验代码

clear;clc;
%% 提取文件夹MIT室内场景的图片
img_path0="C:\machine learning\4.实验四\MIT室内场景2";
tab={'bathroom','bedroom'};
x1=[];  % 存放bathroom文件夹的图片
x2=[];  % 存放bedroom文件夹的图片
for i=1:size(tab,2)
   img_path1=strcat(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,[100,200]);             % 更改图片大小为100*200
       image=imnoise(image,'salt & pepper',0.1);    % 加入噪声密度:0.1的椒盐噪声
       if i==1
           x1=[x1,image(:)];    % 若为bathroom,则放入x1矩阵
       else
           x2=[x2,image(:)];    % 若为bedroom,则放入x2矩阵
       end
   end
end
%% 留出法划分训练样本和测试样本
% bathroom文件夹下的图片
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列的数据
% bedroom文件夹下的图片
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=[zeros(1,size(X1_1,2)),ones(1,size(X2_1,2))];    % 训练集标签
%% 夹角余弦求二分类
Predict_label=[];   % 测试集的预测标签向量
Xtest=im2double(Xtest);
Xtrain=im2double(Xtrain);
for i=1:size(Xtest,2)
    A(i)=sqrt(Xtest(:,i)'*Xtest(:,i));  % 测试集中第i列的模
    for j=1:size(Xtrain,2)
       B(j)=sqrt(Xtrain(:,j)'*Xtrain(:,j)); % 训练集中第j列的模
       cos(i,j)=sum(Xtest(:,i).*Xtrain(:,j))/(A(i)*B(j));   % 测试集第i列与训练集第j列的余弦值 
    end
    [num,index]=max(cos(i,:));  % 余弦的最大值
    Predict_label=[Predict_label,Xlabel(index)];
end
True_label=[zeros(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                     % 错误率
% 打乱测试集的预测标签和真实标签
n=randperm(size(Predict_label,2));
Predict_label_=Predict_label(:,n);
True_label_=True_label(:,n);
roc=plot_roc(Predict_label_,True_label_);

实验结果

图1. 问题1结果
图2. 问题2结果

实验心得

本次基于相似性度量的二分类实验过程中,需要结合前三次的实验——矩阵数据的划分、图像数据的提取与随机划分和基于最短距离的二分类实验。大致思路如下:①提取图像 ②划分样本 ③最大余弦值得到测试集的预测标签 ④求出正确率、错误率并利用自定义函数plot_roc画出ROC曲线。
在此过程中,加深了我对机器学习中的二分类、留出法、最短距离和最大余弦值等的理解。并且更加熟练地使用MATLAB中各类图片相关的函数,例如imread(读图片)、imresize(改变图片大小)、rgb2gray(彩图转为灰度图)、imnoise(降噪)和randperm(生成随机数)等。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Orange_Jet

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

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

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

打赏作者

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

抵扣说明:

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

余额充值