2013-03-11 2 views
0

Можете ли вы помочь мне, как использовать разрешение на перекрестное подтверждение в Matlab? Потому что данные, которые я использовал, невелики. Я использую 10 тренировок данных для истинных положительных и 10 тренировок данных для ложных срабатываний. Я попробовал код, который я нашел здесь. Это моя обучающая функция:Оставьте одно из перекрестных проверок в matlab

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

Поскольку мой первый пример оставил вас в замешательстве, я взглянул на ваш полный код, и я думаю, что у меня есть более простой способ добиться того, чего вы хотите. Во-первых, здесь есть функция классификации: она выглядит как оригинал, но я не пытаюсь принимать какие-либо данные из - вместо этого, мы выберем ряд точек данных после расчета:

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 

Вы вызываете эту функцию с двумя параметрами, соответствующими истинному отрицательному и истинному положительному каталогу, - в этот момент вы выполняете все вычисления. Теперь вы можете выбрать, какие из этих данных вы будете использовать для обучения, и которые для тестирования.

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); 

Я надеюсь, что вы можете взять его отсюда ...

+0

Большое спасибо за ваш ответ. но я очень новичок в Matlab. Я все еще запутался, как назвать функцию im my main, которая была исправлена ​​вами. потому что я должен поставить два параметра, которые являются leaveOutFP и leaveOutTP. Я надеюсь, что и может помочь мне решить эту проблему .. спасибо – user2157806

+0

есть какая-то ошибка, когда я запустить его «Ошибка при помощи svmtrain (строка 335) Y должен содержать ровно две группы по методу„SMO“. Ошибка в основной (строка 15) svmStruct = svmtrain (Ftrain, Ctrain, 'showplot', правда, 'Kernel_Function', 'RBF'); у вас есть какие-либо идеи, чтобы решить эту проблему большое спасибо за вашу помощь – user2157806

+0

Пожалуйста, проверьте, что размер 'Ctrain' есть и какие значения в нем. Я ожидаю, что это будет вектор-столбец с только« 1 »и« -1 »в нем - если это не так, нам нужно выяснить, почему нет. как я обнаружил возможную проблему при вычислении 'testVal' - как написано, вы можете получить повторяющиеся значения. Я иду t o обновить этот код сейчас. – Floris

Смежные вопросы