一、写在最前面
注:本实验源码过于繁冗,后请教老师和同学后代码得到较大提升。具体可参考
图像识别2:图像多分类实验中的实验五源码。
本次实验的源码无学习参考价值,仅做自我成长路径的反思用。
一、实验目的
进行基于相似性度量的二分类实验,并绘制相关ROC曲线。以方便对两种或两种以上不同相似度试验,进行算法性能的比较。
二、实验内容
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<tempdis) tempdis=distance;tempj=k; % 如果距离最小则判断为同一类型 train{1,j}(1,end)=train{1,k}(1,end); % 将最短距离的训练集标签赋值给测试集 end end % 计算错误个数 if(train{1,j}(1,end)~=Xlable(j)) flag=flag+1; end end % 计算每个测试集的错误率和准确率 rateerrors(i)=flag/size(btest,1); rateture(i)=1-rateerrors(i); % sprintf('错误率为:%.2f 正确率为:%.2f',rateerrors,rateture) end % 计算五次划分的错误率和准确率均值 meanerrors=mean(rateerrors(:)); meanture=mean(rateture(:)); sprintf('错误率为:%.2f 正确率为:%.2f',meanerrors,meanture) % 2.将MIT室内场景数据库中机场、面包房作为正负样本, % 利用留出法完成训练集与测试集的划分,并使用测量最短距离的方式进行二分类, % 最后给出分类错误率和准确率。 %% 设置参数 clc;clear;close all; path='D:\Desktop\大三上\神经网络\实验三\数据\MIT室内场景'; ObjDir1='\airport_inside'; ObjDir2='\bakery'; 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、负-1样本,给出训练样本的标签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、负-1样本,给出训练样本的标签Xlabel XLable=-1*ones(img_num,1); phi2=[phi2 XLable]; % 列拼接两个矩阵 phi=[phi1;phi2]; %% 留出法划分互斥的训练集和测试集 % 二维数组五次二划分 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=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<tempdis) tempdis=distance;tempj=k; % 如果距离最小则判断为同一类型 train{1,j}(1,end)=train{1,k}(1,end); % 将最短距离的训练集标签赋值给测试集 end end % 计算错误个数 if(train{1,j}(1,end)~=Xlable(j)) flag=flag+1; end end % 计算每个测试集的错误率和准确率 rateerrors(i)=flag/size(btest,1); rateture(i)=1-rateerrors(i); % sprintf('错误率为:%.2f 正确率为:%.2f',rateerrors,rateture) end % 计算五次划分的错误率和准确率均值 meanerrors=mean(rateerrors(:)); meanture=mean(rateture(:)); sprintf('错误率为:%.2f 正确率为:%.2f',meanerrors,meanture) % 3.对MIT室内场景数据库中的测试集添加噪声, % 然后使用测量最短距离的方式进行二分类,给出噪声情况下的分类错误率和准确率。 %% 设置参数 clc;clear;close all; path='D:\Desktop\大三上\神经网络\实验三\数据\MIT室内场景'; ObjDir1='\airport_inside'; ObjDir2='\bakery'; 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); %读取图片 % 加载样本图像到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]); phi1(pn,:)=double(reshape(Image,1,[])); end % 将机场和面包房分别作为正1、负-1样本,给出训练样本的标签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 %逐次取出图片 % 将图像数据保存于phi2 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]); phi2(pn,:)=double(reshape(Image,1,[])); end % 将机场和面包房分别作为正1、负-1样本,给出训练样本的标签Xlabel XLable=-1*ones(img_num,1); phi2=[phi2 XLable]; % 列拼接两个矩阵 phi=[phi1;phi2]; %% 留出法划分互斥的训练集和测试集 % 二维数组五次二划分 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=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<tempdis) tempdis=distance;tempj=k; % 如果距离最小则判断为同一类型 train{1,j}(1,end)=train{1,k}(1,end); % 将最短距离的训练集标签赋值给测试集 end end % 计算错误个数 if(train{1,j}(1,end)~=Xlable(j)) flag=flag+1; end end % 计算每个测试集的错误率和准确率 rateerrors(i)=flag/size(btest,1); rateture(i)=1-rateerrors(i); % sprintf('错误率为:%.2f 正确率为:%.2f',rateerrors,rateture) end % 计算五次划分的错误率和准确率均值 meanerrors=mean(rateerrors(:)); meanture=mean(rateture(:)); sprintf('错误率为:%.2f 正确率为:%.2f',meanerrors,meanture)
实验四
% 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