Как обозначить учебные проекции, полученные СПС, чтобы использовать их для обучения СВМ для классификации? МАТЛАБ


У меня есть "обучающий набор" образов. Я сформировал "собственное пространство". Теперь мне нужно обозначить проекции, чтобы обучить SVM. Проекции "грани 1" на собственное пространство должны быть помечены +1, а проекции всех других граней на собственное пространство должны быть помечены -1.

Я не знаю, как это делать.Любые предложения были бы очень полезны!

Я сформировал собственное пространство, используя следующее :

    function [signals,V] = pca2(data)
    [M,N] = size(data); 
    data = reshape(data, M*N,1); % subtract off the mean for each dimension 
    mn = mean(data,2); 
    data = bsxfun(@minus, data, mean(data,1)); 
    % construct the matrix Y 
    Y = data'*data / (M*N-1); 
    [V D] = eigs(Y, 10); % reduce to 10 dimension 
    % project the original data 
    signals = data * V; 
3 2

3 ответа:

Если вы пытаетесь распознать более одного человека, вы должны создать один отдельный файл данных для каждого человека и один отдельный SVM для каждого человека. Это происходит потому, что SVM ориентированы на разделение на два класса.

Это пример использования libsvm для Matlab (здесь - полный код), предположим, что у вас есть данные в файле:

[person1_label, person1_inst] = libsvmread('../person1');
[person2_label, person2_inst] = libsvmread('../person2');
[person3_label, person3_inst] = libsvmread('../person3');

model1 = svmtrain(person1_label, person1_inst, '-c 1 -g 0.07 -b 1');
model2 = svmtrain(person2_label, person2_inst, '-c 1 -g 0.07 -b 1');
model3 = svmtrain(person3_label, person3_inst, '-c 1 -g 0.07 -b 1');

Чтобы проверить одну грань, нужно применить все модели и получить максимальный выход (при использовании svmpredict вы должны использовать '-b 1', чтобы получить оценки вероятности.

Кроме того, в Matlab вам не нужно использовать svmread или svmwrite, Вы можете передать непосредственно данные:

training_data = [];%Your matrix that contains 4 feature vectors
person1_label =[1,1,-1,-1];
person2_label = [-1,-1,1,-1];
person3_label = [-1,-1,-1,1];

model1 = svmtrain(person1_label, person_inst, '-c 1 -g 0.07 -b 1');
model2 = svmtrain(person2_label, person_inst, '-c 1 -g 0.07 -b 1');
model3 = svmtrain(person3_label, person_inst, '-c 1 -g 0.07 -b 1');
label = ones(N,1);% N samples in total, +1 represents face 1
for i=1:N 
    % For each face image, you run
    [signals,V] = pca2(data); % ith data
    if ....  % other faces than face 1
        label(i) = -1;
    end
    face(i,:) = reshape(signals,1,[]);
end
model = svmtrain(label,face);

Похоже, что вы не можете тренировать SVM... Вот пример того, как можно обучить MATLAB SVM:

%Generate 100 positive points (the data is a circle)
r = sqrt(rand(100,1)); % radius
t = 2*pi*rand(100,1); % angle
dataP = [r.*cos(t), r.*sin(t)]; % points

%Generate 100 negative points (the data is a circle)
r2 = sqrt(3*rand(100,1)+1); % radius
t2 = 2*pi*rand(100,1); % angle
dataN = [r2.*cos(t2), r2.*sin(t2)]; % points

data3 = [dataN;dataP];
theclass = ones(200,1);
theclass(1:100) = -1; %First 100 points are negative

%Train the SVM
cl = svmtrain(data3,theclass,'Kernel_Function','rbf');