在目前我的实验中训练样本主要有两种选择方式:(当让还有很多选择方式,比如我在人脸图像亲缘识别的实验中是将所有的数据当作训练样本,在将所有的数据作为测试样本来测试方法的识别率、还有比如交叉验证等很多方法,在这里记录的是目前的实验所用到的训练样本的选择方法)
1、在同类样本中随机的选取1/2或者2/3的样本作为训练样本剩下的作为测试样本,matlab代码;
[mtrain,ntrain] = size(Y);
[n m]=size(unique(gnd));
% %% 适合于每类样本数相同的情况
% k=ntrain/n;
% res=ceil(k/2);
% for i=1:n
% random=randperm(k);
% %向上去2/3的样本作为训练样本
% Wtrain(:,(i-1)*res+1:i*res)=Y(:,random(1:res)+(i-1)*k);
% Wtest(:,(i-1)*(k-res)+1:i*(k-res))=Y(:,random((res+1):k)+(i-1)*k);
%
% end
%
% %标签重构
% for i=1:n
% Trainlab((i-1)*res+1:i*res,:)=i; %训练样本标签
% Testlab((i-1)*(k-res)+1:i*(k-res),:)=i;%测试样本标签
% end
作个解释吧!若是实验想要实验效果很好,这个样本的选择是不错的,我在目前的实验室中识别效果达到100%,所有不得不选择第二种样本选择方式如下:
2、这个就是从所有样本随机的选取一定数量的样本作为训练样本,剩下作为测试样本,matlab代码如下:
%% 从所有样本中随机的选取一定数量的样本作为训练样本 剩下的作为测试样本
random=randperm(ntrain);
k=ceil(ntrain/2);
Wtrain(:,1:k)=Y(:,random(1:k));
Wtest(:,1:ntrain-k)=Y(:,random(k+1:ntrain));
实验的效果肯定赶不上第一个识别率,因为随机选取的有些类可能一个都没有选取到,获取一类样本的所有都当作训练样本了这里在添加一类,样本中每一类的样本数量不相等的情况下,在(1)中我是假设每一类的样本数量是相等的
3、每一类样本数量不相等的情况下的matlab代码:
[xlen1 ylen1]=size(gnd);
for i=1:xlen1
row_index = gnd(:,1) == i;
B = gnd(row_index,:);
[xlen2 ylen2]=size(B);
random=randperm(xlen2);
trlength=1;
telength=1;
k=ceil(xlen2/2);
Wtrain(:,trlength:trlength+k-1)=fea(:,random(1:k)+trlength-1);
Wtest(:,telength:telength+(xlen2-k)-1)=fea(:,random(k+1:xlen2)+trlength-1);
Trainlab(trlength:trlength+k,:)=i; %训练样本标签
Testlab(telength:telength+(xlen2-k),:)=i;%测试样本标签
trlength=trlength+xlen2;
telength=trlength+xlen2-k;
end
当然还有什么交叉验证等很多的设置情况,以后有涉及到再添加.....
二、如何在矩阵中添加元素(i表示行,j表示列)在i=j时添加一个元素0,其余的元素后移。在不该动现有的元素下改动代码:
在试验中遇到的情况是:这个解释不了,遇到这个情况的肯定可以轻松的理解这个花了我一上午的时间来完成,具体代码如下:
[xlen ylen]=size(x_yp);
Weig(:,1)=[0;x_yp(:,1)];
Weig(:,ylen)=[x_yp(:,ylen);0];
for i=2:ylen-1
Weig(:,i)=[x_yp(1:i-1,i);0;x_yp(i:xlen,i)];
end
三、取出值为某一个数的所有列、行
取出矩阵中某一列或者某一行的元素值为某个值的所有行或列,matlab代码:
row_index = gnd(:,1) == i;
B = gnd(row_index,:);
[xlen2 ylen2]=size(B);
四、随机的取出矩阵的行或列
代码如下:
random=randperm(ntrain);
Wtrain(:,1:k)=Y(:,random(1:k));