0

Matlab で 1 つを除外するクロス検証を使用する方法を教えてください。使用したデータが小さいためです。真陽性には 10 個のデータ トレーニングを使用し、偽陽性には 10 個のデータ トレーニングを使用します。ここで見つけたコードを試しました。これは私のトレーニング関数です:

Function [ C,F ] = classification_test_samesize()

    dn='D:\thesis\mthesis\code program\FalsePositive\'
    db=dir(strcat(dn,'*.dcm'));
    F=[];
    C=[];

    for(i=1:1:length(db))
        name=db(i).name;
        name=strcat(dn,name);
        im1=dicomread(name);
        [out] = func_feature(im1);
        f = [out];
        F = [F;f];
        C=[C;-1];

    end

    % false positive is -1 th class


    dn='D:\thesis\mthesis\code program\TruePositive\'
    db=dir(strcat(dn,'*.dcm'));

    for(i=1:1:length(db))
        name=db(i).name;
        name=strcat(dn,name);
        im1=dicomread(name);
        [out] = func_feature(im1);
        f = [out];
        F = [F;f];
        C=[C;1];
        % true positive is 1 th class
    end
end

これが私の主な機能です。

clc

direktori= uigetdir;
slash = '\';
direktori=strcat(direktori,slash);
dn=direktori;
db=dir(strcat(dn,'*.dcm'));
ftest=[];

for(i=1:1:length(db))
    name=db(i).name;
    name=strcat(dn,name);

    im1=dicomread(name);
    [out] = func_feature(im1);
    f = [out];
    ftest = [ftest;f];
end

[C,F] = classification_test_samesize();
svmStruct = svmtrain(F,C,'showplot',true,'Kernel_Function','rbf');
result_class = svmclassify(svmStruct,ftest,'showplot',true);

メイン関数では、テスト フォルダーを呼び出してデータをテストしました。ただし、この場合は、データのテストに 1 つを除外するクロス検証を使用したいので、ディレクトリが再び呼び出されることはありません。これを解決するのを手伝ってもらえますか? したがって、トレーニング データの 1 つを使用してテストできます。

4

1 に答える 1

1

私の最初の例はあなたを混乱させたので、私はあなたの完全なコードをもう一度見ました、そして私はあなたが望むものを達成するためのより簡単な方法があると思います。まず、分類関数を次に示します。元の関数とよく似ていますが、データを取り出そうとはしていません。代わりに、計算後にいくつかのデータポイントを選択します。

Function [ C,F ] = classification_test_samesize(fpDir, tpDir)
% compute the C and F for files in the two directories given
db=dir(fullfile(fpDir,'*.dcm')); % preferred to strcat
F=[];
C=zeros(numel(db), 1);
%
% don't use 'i' as variable name - it is built in, and means "sqrt(-1)"
for ii= 1:numel(db)
    name=fullfile(fpDir, db(ii).name); % the correct way to concatenate directory and file name
    im1=dicomread(name);
    % I would like to think you could pre-allocate size for F
    % and use F(ii)=func_feature(im1); directly?
    F = [F; func_feature(im1)];
    C(ii) = -1;   
    fprintf(1, 'file name: %s; class -1\n', db(ii).name); 
end

% false positive is -1 th class

db=dir(fullpath(tpDir,'*.dcm'));
%
for ii = 1:numel(db)
    im1=dicomread(fullfile(tpDir, db(ii).name);
    F = [F; func_feature(im1)];
    C = [C;1];
    fprintf(1, 'file name: %s; class 1\n', db(ii).name);
% true positive is 1 th class
end
end

真の負のディレクトリと真の正のディレクトリに対応する2つのパラメータを使用してこの関数を呼び出します。この時点で、すべての計算が完了します。これで、これらのデータのどれをトレーニングに使用し、どれをテストに使用するかを選択できます。

clc    
% pick the number of the file we are using for test instead of training:

[C,F] = classification_test_samesize('D:\thesis\mthesis\code program\FalsePositive\', ...
    'D:\thesis\mthesis\code program\TruePositive\');

% now we are going to pick some of these for training, and others for verification
numTest = 5; % whatever number you want to set aside for verification
% >>>> changed the next three lines <<<<
randomIndx = randperm(1:numel(C));
testVal = randomIndx(1:numTest);
trainingSet = randomIndex(numTest+1:end);

% do the training: this uses those elements from F and C which are chosen for training:
Ctrain = C(trainingSet);
Ftrain = F(trainingSet);

disp('The following values now exist in "C":')
display(unique(Ctrain)); % this is to confirm there are exactly two classes...

svmStruct = svmtrain(Ftrain,Ctrain,'showplot',true,'Kernel_Function','rbf');

% finally, classify the other values:
result_class = svmclassify(svmStruct,F(testVal),'showplot',true);

ここから持っていっていただければと思います...

于 2013-03-11T17:46:05.790 に答える