3

簡単にするために、1000 個のサンプルがあるとしましょう (それぞれがベクトルです)。

ランダムにではなく、トレーニングとテストのためにデータを分割したいので、たとえば、4 分割のクロス検証が必要な場合は、次のように取得する必要があります

fold1 : 列車 = 1:250; test= 251:1000
fold2 : 列車 = 251:500、テスト = [1:250 ; 501:1000]
fold3 : トレーニング = 501:750、テスト = [1:500; 751:1000]
fold4 : トレーニング = 751:1000、テスト = 1:750

私はCVPARTITIONを知っていますが、知る限り-データをランダムに分割します-これは必要なものではありません。

そのためのコードを書くことができると思いますが、おそらく使用できる関数があると考えました。


(1) データは既にシャッフルされており、実験を簡単に再現できる必要があります。

4

3 に答える 3

3

一般的にそれを行う関数は次のとおりです。

function [test, train] = kfolds(data, k)

  n = size(data,1);

  test{k,1} = [];
  train{k,1} = [];

  chunk = floor(n/k);

  test{1} = data(1:chunk,:);
  train{1} = data(chunk+1:end,:);

  for f = 2:k
      test{f} = data((f-1)*chunk+1:(f)*chunk,:);
      train{f} = [data(1:(f-1)*chunk,:); data(f*chunk+1:end, :)];
  end
end

これはエレガントな 1 ライナーではありませんが、かなり堅牢で、kサンプル数の要素である必要はなく、2D マトリックスで動作し、インデックスではなく実際のセットを出力します。

于 2013-11-05T11:25:54.600 に答える
2

トレーニング中およびテスト中のサンプルでフォールドk*nに分割したいサンプルがあると仮定します(質問で、)。 それでkn(k-1)*nk = 4n = 250

 >> foldId = kron( 1:k, ones(1,n) );

foldId各サンプルが属するトレーニング フォールドのインデックスを示します。

フォールドのf場合、次を使用してトレーニング サンプルとテスト サンプルのインデックスを取得できます。

 >> trainIdx = find( foldId == f );
 >> testIdx  = find( foldId ~= f );

( の代わりに論理インデックスを使用するfindと、少し高速化できます)。

于 2013-11-05T11:11:25.087 に答える
1

kデータセットを長さの折り畳みに分割するには、n次を使用できます。

f=arrayfun(@(x)struct('train',x*n+(1:n),'test',setdiff(1:n*k,x*n+(1:n))), 0:k-1);

ここで、フィールドを持ち、対応する折り畳みのインデックスを含むf構造体配列です。たとえばandと fold の場合:traintestn=5k=32

>> f(2).train
ans =
     6     7     8     9    10
>> f(2).test
ans =
     1     2     3     4     5    11    12    13    14    15

データを直接抽出することもできます。あなたのデータがn*k行の2Dマトリックスであるとしましょう

E=arrayfun(...
@(x) struct('train', D(x*n+(1:n),:), ...
            'test',  D(setdiff(1:n*k, x*n+(1:n)),:)), 0:k-1)

あなたのデータが

D = [(1:15).^2; (1:15).^3].';

fold2の場合、以下Eが含まれます。

>> E(2).train
ans =
          36         216
          49         343
          64         512
          81         729
         100        1000
>> E(2).test
ans =
           1           1
           4           8
           9          27
          16          64
          25         125
         121        1331
         144        1728
         169        2197
         196        2744
         225        3375
于 2013-11-05T12:04:58.957 に答える