Подтвердить что ты не робот

Полный пример многоуровневого SVM с перекрестной проверкой с использованием Matlab

В настоящее время я запутался в реализации SVM с кросс-валидацией с использованием Matlab. В stackoverflow есть много сообщений, в которых упоминаются фрагменты информации о SVM и его перекрестная проверка; однако, нет полного примера, даже используя простейшие наборы данных "fishiris".

Я кратко изложил эти сообщения с проблемами следующим образом:

а. Бинарный и многоуровневый SVM: Ответил поддержка векторных машин в Matlab но без примера перекрестной проверки.

б. Перекрестная проверка с использованием SVM: Пример 10-кратной классификации SVM в MATLAB но без примера многоуровневого SVM.

с. Один-против-один и один против всех SVM: 1-против-1 можно найти по адресу поддержка векторных машин в Matlab 1-против-все можно найти по адресу Классификация нескольких классов в libsvm Multi-Class SVM (один против всех) Нет примера перекрестной проверки

д. libSVM и Matlab встроенный SVM (статистический инструментарий) Частично полный пример использования libSVM можно найти в 10-кратная перекрестная проверка в SVN с одним и тем же (с использованием LibSVM)

е. Оптимизация параметров Переподготовка после перекрестной проверки с помощью libsvm

Но все очень сложно для изучения и, в конечном итоге, развертывания SVM для их реальной проблемы, и это проблематично и ошибочно, просто глядя на эти предыдущие сообщения. По крайней мере, я глуп, чтобы решить проблему головоломки.

Почему мы не собираемся создавать легко понятные коды для SVM со следующими функциями?

а. Просто используйте данные "fisheriris".

В. Может использоваться для двоичной и многоуровневой задачи (ловушки могут быть выбраны как двоичные).

С. Внедрить перекрестное подтверждение.

Д. Реализуйте как "один против одного", так и "один против всех".

Е. Две версии с использованием libSVM и Matlab встроенных SVM соответственно. Поскольку svmtrain является одним и тем же именем для обоих пакетов, я предлагаю изменить его на libsvmtrain и MEX перед использованием. Мы также можем сравнить эти два метода.

F. В настоящее время из-за разделения данных обучения/тестирования результаты не всегда воспроизводимы. Можем ли мы это исправить?

F. (Необязательно) Добавить оптимизацию параметров.

G. (Необязательно) Добавить анализ ROC.

Мой старт - это некоторые коды, например:

#
% libSVM version_1
clc; clear all;

load fisheriris
[~,~,labels]            = unique(species);              % Labels: 1/2/3
data                    = zscore(meas);                 % Scale features
numInst                 = size(data,1);
numLabels               = max(labels);

%# Split training/testing
idx                     = randperm(numInst);
numTrain                = 100; 
numTest                 = numInst - numTrain;

trainData               = data(idx(1:numTrain),:);  
testData                = data(idx(numTrain+1:end),:);

trainLabel              = labels(idx(1:numTrain)); 
testLabel               = labels(idx(numTrain+1:end));

%# Train one-against-all models
model                   = cell(numLabels,1);
for k=1:numLabels
    model{k}                = libsvmtrain(double(trainLabel==k), trainData, '-c 1 -g 0.2 -b 1');
end

%# Get probability estimates of test instances using each model
prob                    = zeros(numTest,numLabels);
for k=1:numLabels
    [~,~,p]                 = svmpredict(double(testLabel==k), testData, model{k}, '-b 1');
    prob(:,k)               = p(:,model{k}.Label==1);    % Probability of class==k
end

% Predict the class with the highest probability
[~,pred]                = max(prob,[],2);
acc                     = sum(pred == testLabel) ./ numel(testLabel);    % Accuracy
C                       = confusionmat(testLabel, pred);                 % Confusion matrix
#
% Matlab build-in SVM version_1
clc; clear all;

load fisheriris
[g, gn]                 = grp2idx(species);     % Nominal class to numeric

% Split training and testing sets
[trainIdx, testIdx]     = crossvalind('HoldOut', species, 1/3);

pairwise                = nchoosek(1:length(gn),2);            % 1-vs-1 pairwise models
svmModel                = cell(size(pairwise,1),1);            % Store binary-classifers
predTest                = zeros(sum(testIdx),numel(svmModel)); % Store binary predictions

%# classify using one-against-one approach, SVM with 3rd degree poly kernel
for k=1:numel(svmModel)
    %# get only training instances belonging to this pair
    idx                     = trainIdx & any( bsxfun(@eq, g, pairwise(k,:)) , 2 );

    %# train
    svmModel{k}             = svmtrain(meas(idx,:), g(idx), ...
        'BoxConstraint',2e-1, 'Kernel_Function','polynomial', 'Polyorder',3);

    %# test
    predTest(:,k)           = svmclassify(svmModel{k}, meas(testIdx,:));
end
pred = mode(predTest,2);   % Voting: clasify as the class receiving most votes

%# performance
cmat                        = confusionmat(g(testIdx),pred);
acc                         = 100*sum(diag(cmat))./sum(cmat(:));
fprintf('SVM (1-against-1):\naccuracy = %.2f%%\n', acc);
fprintf('Confusion Matrix:\n'), disp(cmat)

Пожалуйста, не стесняйтесь добавлять свои, пока мы не закончим все миссии. Кто-то может также создать проект кода Google для нас, чтобы закончить это.

Большое спасибо.

4b9b3361