以下是我对此交叉验证的看法.我使用魔法创建虚拟数据(10)我也随机创建标签.想法如下,我们得到我们的数据和标签,并将它们与随机列结合起来.考虑遵循虚拟代码.
>> data = magic(4) data = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 >> dataRowNumber = size(data,1) dataRowNumber = 4 >> randomColumn = rand(dataRowNumber,1) randomColumn = 0.8147 0.9058 0.1270 0.9134 >> X = [ randomColumn data] X = 0.8147 16.0000 2.0000 3.0000 13.0000 0.9058 5.0000 11.0000 10.0000 8.0000 0.1270 9.0000 7.0000 6.0000 12.0000 0.9134 4.0000 14.0000 15.0000 1.0000
如果我们根据第1列对X进行排序,我们会随机排序数据.这将给我们交叉验证随机性.然后接下来就是根据交叉验证百分比划分X. 一个案例很容易实现这一点.让我们考虑%75%是火车案例,%25%是测试案例.我们这里的大小是4,然后是3/4 =%75和1/4是%25.
testDataset = X(1,:) trainDataset = X(2:4,:)
但是对于N交叉褶皱来说,实现这一点要困难得多.因为我们需要做N次.对于循环是必要的.适用于5个交叉折叠.我得到了,在第一个f
第1折:1 2用于测试,3:10用于火车
第二次折叠:3 4用于测试,1 2 5:10用于火车
第3折:5 6为测试,1:4 7:10为火车
第4折:7 8为测试,1:6 9:10为火车
第5折:9 10为测试,1:8为火车
以下代码是此过程的示例:
data = magic(10); dataRowNumber = size(data,1); labels= rand(dataRowNumber,1) > 0.5; randomColumn = rand(dataRowNumber,1); X = [ randomColumn data labels]; SortedData = sort(X,1); crossValidationFolds = 5; numberOfRowsPerFold = dataRowNumber / crossValidationFolds; crossValidationTrainData = []; crossValidationTestData = []; for startOfRow = 1:numberOfRowsPerFold:dataRowNumber testRows = startOfRow:startOfRow+numberOfRowsPerFold-1; if (startOfRow == 1) trainRows = [max(testRows)+1:dataRowNumber]; else trainRows = [1:startOfRow-1 max(testRows)+1:dataRowNumber]; end crossValidationTrainData = [crossValidationTrainData ; SortedData(trainRows ,:)]; crossValidationTestData = [crossValidationTestData ;SortedData(testRows ,:)]; end