2012-04-15 52 views
1

我對一個非常小的數據使用交叉valind函數...但是我發現它給了我不正確的結果。這是否應該發生?爲什麼crossvalind失敗?

我有Matlab的R2012a,這裏是我的輸出

crossvalind('KFold',1:1:11,5) 

ans = 

2 
5 
1 
3 
2 
1 
5 
3 
5 
1 
5 

通知沒有set 4 ..這是一個錯誤?我期望每集至少有2個元素,但它在一箇中給我0 ...並且發生了很多情況,即值不均勻分佈在集合中。

回答

2

crossvalind的幫助表示您正在使用的表單是:crossvalind(METHOD, GROUP, ...)。在這種情況下,GROUP是例如數據的類標籤。所以1:11因爲第二個參數在這裏很混亂,因爲它表明沒有兩個例子具有相同的標籤。我認爲這是非常不尋常的,如果該功能有些奇怪,你不應該感到驚訝。

我試圖做:

numel(unique(crossvalind('KFold', rand(11, 1) > 0.5, 5))) 

,並可靠地給5結果,這正是我所期望的;我的例子將對應於一個兩級問題(我猜想,作爲一般規則,你會想要類似numel(unique(group)) <= numel(group)/folds) - 我的假設是它試圖在第K次摺疊中有每個類的一個示例,並且至少有兩個例子在其他所有,摺疊大小不超過1的區別 - 但我沒有看過代碼來驗證這一點。

你的意思去做,這是可能的:

crossvalind('KFold', 11, 5); 

這將計算5倍的11個數據點 - 這並不打算做任何巧妙搭配標籤,所以你將來一定會有是K褶皺。

然而,在你的問題,如果你真的有極少數的數據點,那麼它可能是更好的做留一交叉驗證,你可以用做:

crossvalind('LeaveMOut', 11, 1); 

雖然美好方法是:

for leave_out=1:11 
    fold_number = (1:11) ~= leave_out; 
    <code here; where fold_number is 0, this is the leave-one-out example. fold_number = 1 means that the example is in the main fold.> 
end