Как обозначить учебные проекции, полученные СПС, чтобы использовать их для обучения СВМ для классификации? МАТЛАБ
У меня есть "обучающий набор" образов. Я сформировал "собственное пространство". Теперь мне нужно обозначить проекции, чтобы обучить 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 ответа:
Если вы пытаетесь распознать более одного человека, вы должны создать один отдельный файл данных для каждого человека и один отдельный 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');