MATLAB:10倍交叉验证,不使用现有功能

add*_*ons 3 matlab machine-learning cross-validation

我有一个矩阵(我想在MatLab中你称之为结构)或数据结构:

  data: [150x4 double]
labels: [150x1 double]
Run Code Online (Sandbox Code Playgroud)

这是我的matrix.data看起来像假设我用矩阵的名称加载我的文件:

5.1000    3.5000    1.4000    0.2000
4.9000    3.0000    1.4000    0.2000
4.7000    3.2000    1.3000    0.2000
4.6000    3.1000    1.5000    0.2000
5.0000    3.6000    1.4000    0.2000
5.4000    3.9000    1.7000    0.4000
4.6000    3.4000    1.4000    0.3000
5.0000    3.4000    1.5000    0.2000
4.4000    2.9000    1.4000    0.2000
4.9000    3.1000    1.5000    0.1000
5.4000    3.7000    1.5000    0.2000
4.8000    3.4000    1.6000    0.2000
4.8000    3.0000    1.4000    0.1000
4.3000    3.0000    1.1000    0.1000
5.8000    4.0000    1.2000    0.2000
5.7000    4.4000    1.5000    0.4000
5.4000    3.9000    1.3000    0.4000
5.1000    3.5000    1.4000    0.3000
5.7000    3.8000    1.7000    0.3000
5.1000    3.8000    1.5000    0.3000
Run Code Online (Sandbox Code Playgroud)

这是我的matrix.labels看起来像

 1
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1
Run Code Online (Sandbox Code Playgroud)

我试图在不使用MatLab中的任何现有功能的情况下创建10个交叉折叠验证,并且由于我对MatLab知识非常有限,因此我无法继续使用我所掌握的功能.任何帮助都会很棒.

这是我到目前为止所做的,我相信这可能不是matlab方式,但我对matlab很新.

function[output] = fisher(dataFile, number_of_folds)
    data = load(dataFile);
    %create random permutation indx
    idx = randperm(150);
    output = data.data(idx(1:15),:);
end
Run Code Online (Sandbox Code Playgroud)

Ati*_*gur 5

以下是我对此交叉验证的看法.我使用魔法创建虚拟数据(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
Run Code Online (Sandbox Code Playgroud)

如果我们根据第1列对X进行排序,我们会随机排序数据.这将给我们交叉验证随机性.然后接下来就是根据交叉验证百分比划分X. 一个案例很容易实现这一点.让我们考虑%75%是火车案例,%25%是测试案例.我们这里的大小是4,然后是3/4 =%75和1/4是%25.

testDataset = X(1,:)
trainDataset = X(2:4,:)
Run Code Online (Sandbox Code Playgroud)

但是对于N交叉褶皱来说,实现这一点要困难得多.因为我们需要做N次.对于循环是必要的.适用于5个交叉折叠.我得到了,在第一个f

  1. 第1折:1 2用于测试,3:10用于火车
  2. 第二次折叠:3 4用于测试,1 2 5:10用于火车
  3. 第3折:5 6为测试,1:4 7:10为火车
  4. 第4折:7 8为测试,1:6 9:10为火车
  5. 第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
Run Code Online (Sandbox Code Playgroud)