support - máquinas de vectores de soporte en matlab
maquinas de soporte vectorial mineria de datos (2)
¿Podría dar un ejemplo de clasificación de 4 clases usando Support Vector Machines (SVM) en matlab algo así como:
atribute_1 atribute_2 atribute_3 atribute_4 class
1 2 3 4 0
1 2 3 5 0
0 2 6 4 1
0 3 3 8 1
7 2 6 4 2
9 1 7 10 3
MATLAB no es compatible con multiclass SVM en este momento. Puede usar svmtrain
(2-classes) para lograr esto, pero sería mucho más fácil usar un paquete SVM estándar.
He usado LIBSVM y puedo confirmar que es muy fácil de usar.
%%# Your data
D = [
1 2 3 4 0
1 2 3 5 0
0 2 6 4 1
0 3 3 8 1
7 2 6 4 2
9 1 7 10 3];
%%# For clarity
Attributes = D(:,1:4);
Classes = D(:,5);
train = [1 3 5 6];
test = [2 4];
%%# Train
model = svmtrain(Classes(train),Attributes(train,:),''-s 0 -t 2'');
%%# Test
[predict_label, accuracy, prob_estimates] = svmpredict(Classes(test), Attributes(test,:), model);
SVMs fueron diseñados originalmente para la clasificación binaria. Luego se han ampliado para manejar problemas de clase múltiple. La idea es descomponer el problema en muchos problemas de clase binaria y luego combinarlos para obtener la predicción.
Un enfoque llamado uno contra todos , construye tantos clasificadores binarios como clases, cada uno entrenado para separar una clase del resto. Para predecir una nueva instancia, elegimos el clasificador con el mayor valor de función de decisión.
Otro enfoque llamado uno contra uno (que creo que se usa en LibSVM), construye k(k-1)/2
clasificadores binarios, capacitados para separar cada par de clases entre sí, y usa un esquema de votación por mayoría (máximo estrategia de ganar) para determinar la predicción de salida.
También hay otros enfoques, como el uso del Código de salida de corrección de errores (ECOC) para crear muchos clasificadores binarios algo redundantes, y utilizar esta redundancia para obtener clasificaciones más robustas (utiliza la misma idea que los códigos de Hamming ).
Ejemplo (uno contra uno):
%# load dataset
load fisheriris
[g gn] = grp2idx(species); %# nominal class to numeric
%# split training/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)
Aquí hay un resultado de muestra:
SVM (1-against-1):
accuracy = 93.75%
Confusion Matrix:
16 0 0
0 14 2
0 1 15