crossvalind是cross-valindation的縮寫,意即交叉檢驗。 常用的形式有:
① Indices =crossvalind('Kfold', N, K)
② [Train, Test] = crossvalind('HoldOut',N, P)
③ [Train, Test] = crossvalind('LeaveMOut',N, M)
④ [Train, Test] = crossvalind('Resubstitution',N, [P,Q])
①indices =crossvalind('Kfold', N, K):
該命令返回一個對於N個觀察樣本的K個fold(意為折,有“層”之類的含義,感覺還是英文意思更形象)的標記(indices)。該標記中含有相同(或者近似相同)比例的1—K的值,將樣本分為K個相斥的子集。在K-fold交叉檢驗中,K-1個fold用來訓練,剩下的一個用來測試。此過程循環K次,每次選取不同的fold作為測試集。K的缺省值為5。 使用程序:
[m n]=size(data); %data為樣本集合。每一行為一個觀察樣本
indices = crossvalind('Kfold',m,10); %產生10個fold,即indices里有等比例的1-10
for i=1:10
test=(indices==i); %邏輯判斷,每次循環選取一個fold作為測試集 train=~test;
%取test的補集作為訓練集,即剩下的9個fold
data_train=data(trian,:); %以上得到的數都為邏輯值,用與樣本集的選取
label_train=label(train,:); %label為樣本類別標簽,同樣選取相應的訓練集
data_test=data(test,:); %同理選取測試集的樣本和標簽 label_test=label(test,:);
end
②[Train, Test] = crossvalind('HoldOut',N, P):
該命令返回一個邏輯值的標記向量,從N個觀察樣本中隨機選取(或近似於)P*N個樣本作為測試集。故P應為0-1,缺省值為0.5。 使用程序:
groups=ismenber(label,1); %label為樣本類別標簽,生成一個邏輯矩陣groups,1用來邏輯判斷篩選
[train, test] = crossvalind('holdOut',groups); %將groups分類,默認比例1:1,即P=0.5
③[Train, Test] = crossvalind('LeaveMOut',N, M):
該命令返回一個邏輯值的標記向量,從N個觀察樣本中隨機選取M個樣本作為測試集。M的缺省值為1。值得注意的是,LeaveMOut在循環中使用不能保證產生的是互補集合,即每次循環的隨機選取是獨立的。如果要用互補的話還是使用Kfold命令。 使用程序:
[m,n]=size(data);
[train,test]=crossvalind('LeaveMOut',m,10)
svmStruct = svmtrain(data(train,:),groups(train));
classes = svmclassify(svmStruct,data(test,:));
cp=classperf(groups);
cr=cp.CorrectRate
⑤ [Train, Test] = crossvalind('Resubstitution',N, [P,Q]):
本函數為②的一個特殊情況。當我不想把P*N剩下的部分全部作為訓練集的時候使用該函數,用Q指定一個比例,選取Q*N作為訓練集。兩個集合的選取以最小化交集為原則。
http://wenku.baidu.com/link?url=0CT9ku1OCeqomT-iWTaiy6nEXxyU_TGv9txwDk3uIDe80dn1D-9LCiEsV-d1PHeoYoibpROA4MysEAEtN00aXiSXlxZe7Nvq3-VZWbMdv4K