我對一個非常小的數據使用交叉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 ...並且發生了很多情況,即值不均勻分佈在集合中。
我對一個非常小的數據使用交叉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 ...並且發生了很多情況,即值不均勻分佈在集合中。
對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