图像识别1:基于相似性度量的二分类实验
- 一、实验目的:
- 二、实验内容:
-
- (1)算法设计
- (2)算法实现
-
- 0.1 参数设置
- 1.1 图像数据的提取
- 1.2 矩阵拼接和归一化
- 1.3 留出法划分互斥的训练集和测试集
- 1.4 保存二划分的数据集并重新读取
- 1.5 夹角余弦相似度训练
- 1.6 绘制ROC曲线
- 2.1 椒盐噪声图片的处理
- 三、实验结果:
- 四、实验心得:
- 五、实验源码
-
- 实验一
- 实验二
- 实验三
- 实验四
一、实验目的: 进行基于相似性度量的二分类实验,并绘制相关ROC曲线。以方便对两种或两种以上不同相似度试验,进行算法性能的比较。
二、实验内容: 【图像识别|图像识别1(基于相似性度量的二分类实验)】1.将MIT室内场景数据库中卧室、浴室作为正负样本,利用留出法完成训练集与测试集的划分(比例2:1),并使用测量夹角余弦的方式进行二分类(0为负,1为正),最后给出分类错误率和准确率,并绘制ROC曲线。 2.在1基础上对测试集添加噪声,给出噪声情况下的分类错误率、准确率、ROC曲线。
(1)算法设计 首先对部分参数设置。
针对问题一,1.首先完成图像数据的提取,2.数据矩阵归一化,3.留出法划分训练样本Xtrain与测试样本Xtest,同时给出训练样本的标签Xlabel,4.保存二划分数据集并保存,5. 夹角余弦相似度训练,并与原数据集标签进行比对,计算十次二划分错误率均值,6.绘制ROC曲线。
针对问题二,采用imnoise 函数得到0.2椒盐噪声图像,当图像中存在椒盐噪声时,获得训练样本Xtrnoise和测试样本Xtenoise。然后处理步骤与问题一完全一致。
(2)算法实现 0.1 参数设置
为了提高程序的复用性,在最前面对程序的部分参数进行设置。
文章图片
1.1 图像数据的提取
通过for循环读取指定路径下单个文件夹的所有图像,通过rgb2gray函数将有颜色的RGB图像转灰度图像。由于图像大小可能不一致,因此需要使用imresize函数调整为统一大小,本文采用[64,64]格式存储。之后将64*64的数据拉成1行,方便后面数据处理。
由于本文为分别对机场和卧室的数据进行提取,因此在读取文件夹下所有图片后,可以直接在1行的数据基础上,增加1列。该列为标签栏,浴室和卧室分别作为正1、负0样本。
对该算法进行实现,以机场为例。
文章图片
1.2 矩阵拼接和归一化
为了(1)避免具有不同物理意义和量纲的输入变量不能平等使用,(2)bp中常采用sigmoid函数作为转移函数,归一化能够防止净输入绝对值过大引起的神经元输出饱和现象,(3)保证输出数据中数值小的不被吞食,采用归一化的简化计算方式,即将有量纲的表达式,经过变换化为无量纲的表达式,成为纯量。
先将上面提取后的两个矩阵列拼接成一个矩阵,然后对合并后的矩阵进行归一化处理。这里需要注意的是,矩阵最后一列作为标签栏不参与归一化处理。
文章图片
1.3 留出法划分互斥的训练集和测试集
在实验一中,学习了如何划分互斥的训练集和测试集,在这里稍作修改即可套用。
首先通过randperm函数得到一个打乱序列的b,该序列包含(1,n),本文中n为合并后矩阵的行数。由于题目要求的2:1划分容易出现不完美分割的情况,因此对划分的数量进行取整操作。然后c,d两个序列分别取打乱序列的前60%、后40%,根据c,d两个序列的数值取原矩阵对应的列数,最后将按顺序将每次划分结果对应保存于对应的训练集和测试集中,完成随机划分为训练样本Xtrain与测试样本Xtest,同时给出训练样本的标签Xlabel
此处数据变化较多,可以写两行代码打印一次变量,方便及时对已写代码进行检验。
文章图片
1.4 保存二划分的数据集并重新读取
为了提高算法的健壮性,方便后面代码报错后重跑,这里设计了一个保存并重新读取的环节。该操作的意义为:将图片读取并划分数据集的板块,与后面训练的步骤分开。
文章图片
1.5 夹角余弦相似度训练
新建元胞数组读取数据集,不在保存数据集上直接操作。夹角余弦相似度训练需要两层循环,第一层为测试集数据的遍历,第二层为测试集数据与训练集的夹角余弦相似度比对,以将更相似的训练集标签赋值给测试集,如果余弦值越接近1,则两个向量越相似。其中,通过pdist(B,‘cosine’)函数计算夹角余弦。
然后将得到的赋值结果与原数据集标签进行比对,计算错误个数,方便计算错误率绘制ROC曲线,以将不同处理方式得到的不同结果进行比对。如实验三的欧式距离。
最后计算十次二划分的错误率均值,并将其作为错误率计算结果,采用sprintf函数进行结构化打印。
文章图片
文章图片
1.6 绘制ROC曲线
灵敏度是指正样本标记为正的百分率,特异度是负样本标记为负的百分率。将连续变量设定出多个不同的临界值,在每个临界值处计算出相应的灵敏度TPR(sensitivity)和特异度FTR(specificity),再以灵敏度为纵坐标,以1—特异度为横坐标绘制成ROC曲线。
ROC曲线下与坐标轴围成的面积AUC(Area Under Curve), 这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。AUC越接近1.0,检测方法真实性越高; 等于0.5时,则真实性最低,无应用价值。
文章图片
文章图片
2.1 椒盐噪声图片的处理
椒盐噪声与问题一的区别,只在于图像的处理部分。
本文采用imnoise 函数得到0.2椒盐噪声图像,这里如果复用问题一的代码,发现会报有关3*的错误。因此需要判断是否为RGB图像(是否为三维图像),如果是RGB图像则将其转为灰度图像(二维图像),然后进行与问题一相同的处理。
文章图片
三、实验结果: 问题一得到结果为:
ans =
‘错误率为:0.23 正确率为:0.77’
问题二(加入噪声后)得到结果为:
ans =
'错误率为:0.44正确率为:0.56'
ROC结果图分别为:
文章图片
文章图片
四、实验心得: 通过本次实验,熟练掌握了留出法对测试数据集与训练集的划分,基本了解了机器学习的基本流程,欧式距离和夹角余弦两种方法对测试集标签的赋值方式。对数学与编程的应用中有了更深的理解,在老师和同学的帮助下,代码的时空复杂度降低,并且复用性得到了较大的提升。
五、实验源码 实验一
%% 二维数组二划分
clear,clc
a=1:160;
%生成列序列
aa=rand(1000,160);
%随机生成数组
% 五次二划分
for i=1:5
% 划分训练集和测试集比例(6:4划分)
b=randperm(160);
%打乱列序列
c=b(1:length(b)*0.6);
%取打乱序列的前60%
d=b(length(b)*0.6:end);
%取打乱序列的后40% %end直到数组结尾atrain=aa(:,c);
%(:,:)为取原矩阵行和列,(:,1:50)为取原矩阵行,列取前五十个
atest=aa(:,d);
%(:,d)为取原矩阵行,列取随机40%的列
train{1,i}=atrain;
%保存在train的(1,1)cell
test{1,i}=atest;
end
%% 保存五次二划分的数据集
save ('train.mat','train');
save ('test.mat','test');
%% 读取五次二划分
clear;
clc
load train.mat
load test.mat
实验二
% 1.根据ABERDEEN人脸数据库,FERET人脸数据库中的部分人脸图像,完成图像数据的提取,
% 并将其随机划分为训练样本Xtrain与测试样本Xtest,同时给出训练样本的标签Xlabel。
% 若图像大小不一致,使用imresize函数调整为统一大小。
%% 设置参数
clc;
clear;
close all;
ObjDir='D:\Desktop\大三上\神经网络\实验二\人脸库\ABERDEEN人脸数据库';
ObjDir1='D:\Desktop\大三上\神经网络\实验二\人脸库\FERET人脸库';
OutPutDir='D:\Desktop\大三上\神经网络\实验二\人脸库\2\';
OutPutDir1='D:\Desktop\大三上\神经网络\实验二\人脸库\3\';
%% 读取指定路径下单个文件夹所有图像
cd (ObjDir);
%切换到指定路径下
allfigs=struct2cell(dir('*.jpg'));
%只处理jpg文件
[w,img_num]=size(allfigs);
%获得文件的个数
phi=zeros(img_num,64*64);
for pn=1:img_num %逐次取出图片 % 将图像数据保存于phi
image_name=allfigs{1,pn};
%allfigs{1,pn}存储每个图片的名字
img_origin=imread(image_name);
%读取图片
% 加载样本图像到30*(64*64)的矩阵中,每一行代表一幅图像
% 注意!!!读图之前需要进行灰度二值化
I1=rgb2gray(img_origin);
% RGB图像转灰度图像
Image=imresize(I1,[64,64]);
phi(pn,:)=double(reshape(Image,1,[]));
%fprintf('%d %s\n',pn,strcat(ObjDir,image_name));
%显示正在处理的图像
%I1=rgb2gray(img_origin);
% RGB图像转灰度图像
%figure('name','灰度图'),imshow(I1);
%saveas(gcf,[OutPutDir,num2str(pn),'.jpg']);
%将处理后的图片保存到目标文件夹
% gcf 当前图像
end
% 增加XLable,第一位为1,第二位为2
XLable=[1;
1;
1;
1;
1;
2;
2;
2;
2];
phi=[phi XLable];
%% 读取指定路径下多个文件夹全部图像
% p = genpath(ObjDir1);
% 获得文件夹下所有子文件的路径,这些路径存在字符串p中,以';
'分割
% length_p = size(p,2);
%字符串p的长度
% path = {};
%建立一个单元数组,数组的每个单元中包含一个目录
% temp = [];
% % 'D:\Desktop\神经网络\EduRecivedFiles\人脸库\FERET人脸库;
% % D:\Desktop\神经网络\EduRecivedFiles\人脸库\FERET人脸库\FERET-001;
% % D:\Desktop\神经网络\EduRecivedFiles\人脸库\FERET人脸库\FERET-002;
% % D:\Desktop\神经网络\EduRecivedFiles\人脸库\FERET人脸库\FERET-003;
'
% for i = 1:length_p %寻找分割符';
',一旦找到,则将路径temp写入path数组中
%if p(i) ~= ';
'
%temp = [temp p(i)];
%else
%temp = [temp '\'];
%在路径的最后加入 '\'
%path = [path ;
temp];
%temp = [];
%end
% end
% clear p length_p temp;
% %至此获得data文件夹及其所有子文件夹(及子文件夹的子文件夹)的路径,并存于数组path中
% %下面逐一文件夹中读取图像
% file_num = size(path,1);
% 子文件夹的个数
% for i = 1:file_num
%file_path =path{i};
% 图像文件夹路径
%cd (file_path);
%切换到指定路径下
%allfigs=struct2cell(dir('*.tif'));
%只处理tif文件
%[w,img_num]=size(allfigs);
%获得文件的个数
%if img_num > 0
%for pn=1:img_num %逐次取出图片
%image_name=allfigs{1,pn};
%allfigs{1,pn}存储每个图片的名字
%img_origin=imread(image_name);
%读取图片
%% 加载样本图像到30*(64*64)的矩阵中,每一行代表一幅图像
%% 注意!!!读图之前需要进行灰度二值化
%I1=uint8(img_origin);
% 转灰度图像
%% 注意:图像是二维图形,rgb2gray是针对三维图像的。直接将图像转成 uint8
%Image=imresize(I1,[64,64]);
%phi(pn,:)=double(reshape(Image,1,[]));
%%fprintf('%d %s\n',pn,strcat(ObjDir,image_name));
%显示正在处理的图像
%%I1=rgb2gray(img_origin);
% RGB图像转灰度图像
%%figure('name','灰度图'),imshow(I1);
%%saveas(gcf,[OutPutDir,num2str(pn),'.jpg']);
%将处理后的图片保存到目标文件夹
%% gcf 当前图像
%end
%% 将图像数据保存于phi
%end
% end
%% 划分训练集
% 二维数组五次二划分
for i=1:5
% 划分训练集和测试集比例(6:4划分)
b=randperm(img_num);
%打乱列序列
c=b(1:round(img_num*0.6));
%取打乱序列的前60%
d=b(round(img_num*0.6):end);
%取打乱序列的后40% %end直到数组结尾atrain=phi(c,:);
%(:,:)为取原矩阵行和列,(:,1:50)为取原矩阵列,行取前60%
atest=phi(d,:);
%(:,d)为取原矩阵列,行取随机40%的行
Xtrain{1,i}=atrain;
%保存在train的(1,1)cell
Xtest{1,i}=atest;
end
% 保存五次二划分的数据集
save ('Xtrain.mat','Xtrain');
save ('Xtest.mat','Xtest');
%% 读取五次二划分
% clear;
clc
% load Xtrain.mat
% load Xtest.mat
% 2.图像中存在椒盐噪声时,获得训练样本Xtrnoise和测试样本Xtenoise
%% 设置参数
clc;
clear;
close all;
ObjDir='D:\Desktop\神经网络\EduRecivedFiles\人脸库\ABERDEEN人脸数据库';
ObjDir1='D:\Desktop\神经网络\EduRecivedFiles\人脸库\FERET人脸库';
OutPutDir='D:\Desktop\神经网络\EduRecivedFiles\人脸库\2\';
OutPutDir1='D:\Desktop\神经网络\EduRecivedFiles\人脸库\3\';
%% 读取指定路径下单个文件夹所有图像
cd (ObjDir);
%切换到指定路径下
allfigs=struct2cell(dir('*.jpg'));
%只处理jpg文件
[w,img_num]=size(allfigs);
%获得文件的个数
phi=zeros(img_num,64*64);
for pn=1:img_num %逐次取出图片 % 将图像数据保存于phi
image_name=allfigs{1,pn};
%allfigs{1,pn}存储每个图片的名字
img_origin=imread(image_name);
%读取图片
% 加载样本图像到30*(64*64)的矩阵中,每一行代表一幅图像
I0=imnoise(img_origin,'salt & pepper',0.2);
%加入噪声密度:0.2的椒盐噪声
% 注意!!!读图之前需要进行灰度二值化
I1=rgb2gray(I0);
% RGB图像转灰度图像
I1=imnoise(I1,'salt & pepper',0.2);
%加入噪声密度:0.2的椒盐噪声
Image=imresize(I1,[64,64]);
phi(pn,:)=double(reshape(Image,1,[]));
end
% 增加XLable,第一位为1,第二位为2
XLable=[1;
1;
1;
1;
1;
2;
2;
2;
2];
phi=[phi XLable];
%% 划分训练集
% 二维数组五次二划分
for i=1:5
% 划分训练集和测试集比例(6:4划分)
b=randperm(img_num);
%打乱列序列
c=b(1:round(img_num*0.6));
%取打乱序列的前60%
d=b(round(img_num*0.6):end);
%取打乱序列的后40% %end直到数组结尾atrain=phi(:,c);
%(:,:)为取原矩阵行和列,(:,1:50)为取原矩阵行,列取前五十个
atest=phi(:,d);
%(:,d)为取原矩阵行,列取随机40%的列
Xtrnoise{1,i}=atrain;
%保存在train的(1,1)cell
Xtenoise{1,i}=atest;
end
%% 保存五次二划分的数据集
save ('Xtrnoise.mat','Xtrnoise');
save ('Xtenoise.mat','Xtenoise');
实验三
注:本实验源码过于繁冗,后请教老师和同学后代码得到较大提升。具体可参考实验五源码。
本源码无学习参考价值,仅做自我成长路径的反思用。
% 1.根据ABERDEEN人脸数据库,先完成图像数据的提取,
% 利用留出法划分为训练样本Xtrain与测试样本Xtest,
% 将男士和女士分别作为正1、负-1样本,给出训练样本的标签Xlabel。
% 若图像大小不一致,使用imresize函数调整为统一大小,二灰度处理
% 然后使用测量最短距离的方式进行二分类,最后给出分类错误率和准确率。
%% 设置参数
clc;
clear;
close all;
ObjDir='D:\Desktop\大三上\神经网络\实验三\数据\ABERDEEN人脸数据库';
OutPutDir='D:\Desktop\神经网络\EduRecivedFiles\人脸库\2\';
a=10;
%留出法划分次数
%% 读取指定路径下单个文件夹所有图像
cd (ObjDir);
%切换到指定路径下
allfigs=struct2cell(dir('*.jpg'));
%只处理jpg文件
[w,img_num]=size(allfigs);
%获得文件的个数
phi=zeros(img_num,64*64);
for pn=1:img_num %逐次取出图片 % 将图像数据保存于phi
image_name=allfigs{1,pn};
%allfigs{1,pn}存储每个图片的名字
img_origin=imread(image_name);
%读取图片
% 加载样本图像到30*(64*64)的矩阵中,每一行代表一幅图像
% 注意!!!读图之前需要进行灰度二值化
% fprintf('%d %s\n',pn,strcat(ObjDir,image_name));
%显示正在处理的图像
I1=rgb2gray(img_origin);
% RGB图像转灰度图像
Image=imresize(I1,[64,64]);
phi(pn,:)=double(reshape(Image,1,[]));
end
% 将男士和女士分别作为正1、负-1样本,给出训练样本的标签Xlabel
XLable=[1;
1;
1;
1;
1;
-1;
-1;
-1;
-1];
phi=[phi XLable];
%% 留出法划分互斥的训练集和测试集
% 二维数组五次二划分
for i=1:a
% 划分训练集和测试集比例(2:1划分)
b=randperm(img_num);
%打乱列序列
e=round(img_num*2/3);
c=b(1:e);
%取打乱序列的前60%
d=b(e+1:end);
%取打乱序列的后40% %end直到数组结尾atrain=phi(c,:);
%(:,:)为取原矩阵行和列,(:,1:50)为取原矩阵列,行取前60%
atest=phi(d,:);
%(:,d)为取原矩阵列,行取随机40%的行
Xtrain{1,i}=atrain;
%保存在train的(1,1)cell
Xtest{1,i}=atest;
end
% 保存五次二划分的数据集
save ('Xtrain.mat','Xtrain');
save ('Xtest.mat','Xtest');
save('A.mat','a');
%% 读取五次二划分
clear;
clc
load Xtrain.mat
load Xtest.mat
load A.mat
%% 欧式距离判断测试集和哪个训练集最相似,然后把该训练集的标签给该测试集
for i=1:a % a为二划分次数
% {}为元胞数组
btrain=Xtrain{1,i};
%读取保存在train的(1,1)cell
btest=Xtest{1,i};
tempdis=inf;
tempj=0;
Xlable=zeros(1,size(btest,1));
flag=0;
% 记录错误个数
for j=1:size(btest,1) % 测试集的3行数据逐一进行比对
test{1,j}=ones(size(btest,2),1);
% size(A,2)得到A的列数
test{1,j}=btest(j,:);
Xlable(j)=test{1,j}(1,end);
% 读取测试集标签
for k=1:size(btrain,1) % 分别与训练集的5行数据一一比对
train{1,k}=ones(size(btrain,2),1);
train{1,k}=btrain(k,:);
% 计算两者之间的欧式距离
distance=sqrt(sum(abs(test{1,j}-train{1,k})).^2);
%sum(x.^2)计算数组的平方和
if(distance
实验四
% 1.将MIT室内场景数据库中卧室、浴室作为正负样本,利用留出法完成训练集与测试集的划分(比例2:1),
% 并使用测量夹角余弦的方式进行二分类(0为负,1为正),
% 最后给出分类错误率和准确率,并绘制ROC曲线。
%% 设置参数
clc;
clear;
close all;
path='D:\Desktop\大三上\神经网络\实验四\MIT室内场景2';
ObjDir1='\bathroom';
ObjDir2='\bedroom';
a=10;
%留出法划分次数
%% 读取指定路径下单个文件夹所有图像
% 读取机场的图片并处理
cd ([path,ObjDir1]);
%切换到指定路径下
allfigs=struct2cell(dir('*.jpg'));
%只处理jpg文件
[w,img_num]=size(allfigs);
%获得文件的个数
phi1=zeros(img_num,64*64);
for pn=1:img_num %逐次取出图片 % 将图像数据保存于phi1
image_name=allfigs{1,pn};
%allfigs{1,pn}存储每个图片的名字
img_origin=imread(image_name);
%读取图片
I1=rgb2gray(img_origin);
% RGB图像转灰度图像
Image=imresize(I1,[64,64]);
phi1(pn,:)=double(reshape(Image,1,[]));
end
% 将浴室和卧室分别作为正1、负0样本,给出训练样本的标签Xlabel
XLable=ones(img_num,1);
phi1=[phi1 XLable];
% 读取卧室的图片并处理
cd ([path,ObjDir2]);
%切换到指定路径下
allfigs=struct2cell(dir('*.jpg'));
%只处理jpg文件
[w,img_num]=size(allfigs);
%获得文件的个数
phi2=zeros(img_num,64*64);
for pn=1:img_num %逐次取出图片 % 将图像数据保存于phi
image_name=allfigs{1,pn};
%allfigs{1,pn}存储每个图片的名字
img_origin=imread(image_name);
%读取图片
% I1=rgb2gray(img_origin);
% RGB图像转灰度图像
Image=imresize(I1,[64,64]);
phi2(pn,:)=double(reshape(Image,1,[]));
end
% 将浴室和卧室分别作为正1、负0样本,给出训练样本的标签Xlabel
XLable=zeros(img_num,1);
phi2=[phi2 XLable];
%% 列拼接两个矩阵并归一化
phi=[phi1;
phi2];
% 矩阵归一化
phihead=phi(:,1:end-1);
[phihead,PS]=mapminmax(phihead);
%[phi,PS]中phi为归一化后数值,PS为一种对应关系
% phi(1:end-1,:)为除标签栏(最后一列)之外归一化
phi=[phihead,phi(:,end)];
%% 留出法划分互斥的训练集和测试集
% 二维数组a次二划分
for i=1:a
% 划分训练集和测试集比例(2:1划分)
b=randperm(length(phi(:,1)));
%打乱列序列
e=round(length(phi(:,1))*2/3);
c=b(1:e);
%取打乱序列的前60%
d=b(e+1:end);
%取打乱序列的后40% %end直到数组结尾atrain=phi(c,:);
%(:,:)为取原矩阵行和列,(:,1:50)为取原矩阵列,行取前60%
atest=phi(d,:);
%(:,d)为取原矩阵列,行取随机40%的行
Xtrain{1,i}=atrain;
%保存在train的(1,1)cell
Xtest{1,i}=atest;
end
%% 保存五次二划分的数据集
save ('Xtrain.mat','Xtrain');
save ('Xtest.mat','Xtest');
save('A.mat','a');
% 读取五次二划分
clear;
clc
load Xtrain.mat
load Xtest.mat
load A.mat
%% 夹角余弦判断测试集和哪个训练集最相似,然后把该训练集的标签给该测试集
for i=1:a % a为二划分次数
% {}为元胞数组
btrain=Xtrain{1,i};
%读取保存在train的(1,1)cell
btest=Xtest{1,i};
tempdis=-inf;
tempj=0;
Xlable{1,i}=zeros(1,size(btest,1));
count=0;
% 记录错误个数
for j=1:size(btest,1) % 测试集的几行数据逐一进行比对
test{1,j}=ones(size(btest,2),1);
% size(A,2)得到A的列数
test{1,j}=btest(j,:);
Xlable{1,i}(j)=test{1,j}(1,end);
% 读取测试集标签
for k=1:size(btrain,1) % 分别与训练集的几行数据一一比对
train{1,k}=ones(size(btrain,2),1);
train{1,k}=btrain(k,:);
% 计算两者之间的夹角余弦
B=[test{1,j};
train{1,k}];
%将后续进行计算的两行代码放到一个矩阵
distance=1-pdist(B,'cosine');
%计算夹角余弦
if(distance>tempdis) %余弦值越接近1,两个向量越相似
tempdis=distance;
tempj=k;
% 如果距离最大则判断为同一类型
% test{1,j}(1,end)=train{1,k}(1,end);
% 将夹角余弦最短的训练集标签赋值给测试集
res=train{1,k}(1,end);
end
end
ress(j)=res;
% 计算错误个数
if(res~=Xlable{1,i}(j))
count=count+1;
end
% 将分类器对测试集的分类结果合并成一行
Xlable{1,i}(j)=test{1,j}(1,end);
% 读取分类器对测试集的分类结果标签
end
% 计算每个测试集的错误率和准确率
rateerrors(i)=count/size(btest,1);
rateture(i)=1-rateerrors(i);
% sprintf('错误率为:%.2f正确率为:%.2f',rateerrors,rateture)
end
% 计算a次划分的错误率和准确率均值
meanerrors=mean(rateerrors(:));
meanture=mean(rateture(:));
sprintf('错误率为:%.2f正确率为:%.2f',meanerrors,meanture)
%% 绘制ROC曲线
title('ROC曲线')
for i=1:a % a为二划分次数
subplot(2,5,i);
auc=plot_roc(ress,btest(:,end)');
end
% 2.对测试集添加噪声,给出噪声情况下的分类错误率、准确率、ROC曲线
%% 设置参数
clc;
clear;
close all;
path='F:\study\机器学习\机器学习实验四\MIT室内场景2';
ObjDir1='\bathroom';
ObjDir2='\bedroom';
a=10;
%留出法划分次数
%% 读取指定路径下单个文件夹所有图像
% 读取机场的图片并处理
cd ([path,ObjDir1]);
%切换到指定路径下
allfigs=struct2cell(dir('*.jpg'));
%只处理jpg文件
[w,img_num]=size(allfigs);
%获得文件的个数
phi1=zeros(img_num,64*64);
for pn=1:img_num %逐次取出图片 % 将图像数据保存于phi1
image_name=allfigs{1,pn};
%allfigs{1,pn}存储每个图片的名字
img_origin=imread(image_name);
%读取图片
I0=imnoise(img_origin,'salt & pepper',0.2);
%加入噪声密度:0.2的椒盐噪声
I1=rgb2gray(I0);
% RGB图像转灰度图像
Image=imresize(I1,[64,64]);
phi1(pn,:)=double(reshape(Image,1,[]));
end
% 将浴室和卧室分别作为正1、负0样本,给出训练样本的标签Xlabel
XLable=ones(img_num,1);
phi1=[phi1 XLable];
% 读取卧室的图片并处理
cd ([path,ObjDir2]);
%切换到指定路径下
allfigs=struct2cell(dir('*.jpg'));
%只处理jpg文件
[w,img_num]=size(allfigs);
%获得文件的个数
phi2=zeros(img_num,64*64);
for pn=1:img_num %逐次取出图片 % 将图像数据保存于phi
image_name=allfigs{1,pn};
%allfigs{1,pn}存储每个图片的名字
img_origin=imread(image_name);
%读取图片
if(ndims(img_origin)==3)
img_origin=rgb2gray(img_origin);
% RGB图像转灰度图像
end
I1=imnoise(img_origin,'salt & pepper',0.2);
%加入噪声密度:0.2的椒盐噪声
Image=imresize(I1,[64,64]);
phi2(pn,:)=double(reshape(Image,1,[]));
end
% 将浴室和卧室分别作为正1、负0样本,给出训练样本的标签Xlabel
XLable=zeros(img_num,1);
phi2=[phi2 XLable];
%% 列拼接两个矩阵并归一化
phi=[phi1;
phi2];
% 矩阵归一化
phihead=phi(:,1:end-1);
[phihead,PS]=mapminmax(phihead);
%[phi,PS]中phi为归一化后数值,PS为一种对应关系
% phi(1:end-1,:)为除标签栏(最后一列)之外归一化
phi=[phihead,phi(:,end)];
%% 留出法划分互斥的训练集和测试集
% 二维数组a次二划分
for i=1:a
% 划分训练集和测试集比例(2:1划分)
b=randperm(length(phi(:,1)));
%打乱列序列
e=round(length(phi(:,1))*2/3);
c=b(1:e);
%取打乱序列的前60%
d=b(e+1:end);
%取打乱序列的后40% %end直到数组结尾atrain=phi(c,:);
%(:,:)为取原矩阵行和列,(:,1:50)为取原矩阵列,行取前60%
atest=phi(d,:);
%(:,d)为取原矩阵列,行取随机40%的行
Xtrain{1,i}=atrain;
%保存在train的(1,1)cell
Xtest{1,i}=atest;
end
%% 保存五次二划分的数据集
save ('Xtrain.mat','Xtrain');
save ('Xtest.mat','Xtest');
save('A.mat','a');
% 读取五次二划分
clear;
clc
load Xtrain.mat
load Xtest.mat
load A.mat
%% 夹角余弦判断测试集和哪个训练集最相似,然后把该训练集的标签给该测试集
for i=1:a % a为二划分次数
% {}为元胞数组
btrain=Xtrain{1,i};
%读取保存在train的(1,1)cell
btest=Xtest{1,i};
tempdis=-inf;
tempj=0;
Xlable{1,i}=zeros(1,size(btest,1));
count=0;
% 记录错误个数
for j=1:size(btest,1) % 测试集的几行数据逐一进行比对
test{1,j}=ones(size(btest,2),1);
% size(A,2)得到A的列数
test{1,j}=btest(j,:);
Xlable{1,i}(j)=test{1,j}(1,end);
% 读取测试集标签
for k=1:size(btrain,1) % 分别与训练集的几行数据一一比对
train{1,k}=ones(size(btrain,2),1);
train{1,k}=btrain(k,:);
% 计算两者之间的夹角余弦
B=[test{1,j};
train{1,k}];
%将后续进行计算的两行代码放到一个矩阵
distance=1-pdist(B,'cosine');
%计算夹角余弦
if(distance>tempdis) %余弦值越接近1,两个向量越相似
tempdis=distance;
tempj=k;
% 如果距离最大则判断为同一类型
% test{1,j}(1,end)=train{1,k}(1,end);
% 将夹角余弦最短的训练集标签赋值给测试集
res=train{1,k}(1,end);
end
end
ress(j)=res;
% 计算错误个数
if(res~=Xlable{1,i}(j))
count=count+1;
end
% 将分类器对测试集的分类结果合并成一行
Xlable{1,i}(j)=test{1,j}(1,end);
% 读取分类器对测试集的分类结果标签
end
% 计算每个测试集的错误率和准确率
rateerrors(i)=count/size(btest,1);
rateture(i)=1-rateerrors(i);
% sprintf('错误率为:%.2f正确率为:%.2f',rateerrors,rateture)
end
% 计算a次划分的错误率和准确率均值
meanerrors=mean(rateerrors(:));
meanture=mean(rateture(:));
sprintf('错误率为:%.2f正确率为:%.2f',meanerrors,meanture)
%% 绘制ROC曲线
title('噪声处理后的ROC曲线')
for i=1:a % a为二划分次数
subplot(2,5,i);
auc=plot_roc(ress,btest(:,end)');
end
推荐阅读
- 实践|图像识别2(图像多分类实验)
- 随机森林 | GBDT | XGBOOST | LightGBM 比较
- 单片机|(3)下位机部分-水下管道智能巡检-方案STM32+树梅派+python+opencv—水下机器人
- machine|GridSearchCV调参方法
- 计算机视觉|Anomaly Detection 异常检测之 CSI(Contrasting shifted instances论文解读)
- 机器学习|Python实现词云舞
- python相关学习|用python批量修改图片名称!超级简单
- Darkent|Darknet-Yolo系列(一)利用 Darknet 在自己的数据集上训练 Yolov4-tiny 模型
- 文本特征提取