fitcsvm - svm matlab ejemplo
usando kernels precalculados con libsvm (1)
Parece que ya ha resuelto el problema ... De acuerdo con el archivo README incluido en el paquete MATLAB:
Para usar kernel precalculado, debe incluir un número de serie de muestra como la primera columna de los datos de entrenamiento y prueba.
Déjame ilustrar con un ejemplo:
%# read dataset
[dataClass, data] = libsvmread(''./heart_scale'');
%# split into train/test datasets
trainData = data(1:150,:);
testData = data(151:270,:);
trainClass = dataClass(1:150,:);
testClass = dataClass(151:270,:);
numTrain = size(trainData,1);
numTest = size(testData,1);
%# radial basis function: exp(-gamma*|u-v|^2)
sigma = 2e-3;
rbfKernel = @(X,Y) exp(-sigma .* pdist2(X,Y,''euclidean'').^2);
%# compute kernel matrices between every pairs of (train,train) and
%# (test,train) instances and include sample serial number as first column
K = [ (1:numTrain)'' , rbfKernel(trainData,trainData) ];
KK = [ (1:numTest)'' , rbfKernel(testData,trainData) ];
%# train and test
model = svmtrain(trainClass, K, ''-t 4'');
[predClass, acc, decVals] = svmpredict(testClass, KK, model);
%# confusion matrix
C = confusionmat(testClass,predClass)
La salida:
*
optimization finished, #iter = 70
nu = 0.933333
obj = -117.027620, rho = 0.183062
nSV = 140, nBSV = 140
Total nSV = 140
Accuracy = 85.8333% (103/120) (classification)
C =
65 5
12 38
Actualmente estoy trabajando en la clasificación de imágenes con diferentes descriptores de imágenes. Como tienen sus propias métricas, estoy usando kernels precalculados. Entonces, dadas estas matrices de kernel NxN (para un total de N imágenes) quiero entrenar y probar un SVM. Aunque no tengo mucha experiencia en el uso de SVM.
Lo que me confunde es cómo ingresar la información para el entrenamiento. Usando un subconjunto del kernel MxM (M es el número de imágenes de entrenamiento), entrena el SVM con M características. Sin embargo, si lo entendí correctamente, esto me limita a usar datos de prueba con cantidades similares de características. Intentar utilizar un núcleo secundario de tamaño MxN causa ciclos infinitos durante el entrenamiento y, en consecuencia, el uso de más características cuando las pruebas dan resultados pobres.
Esto da como resultado el uso de un entrenamiento de igual tamaño y conjuntos de pruebas que dan resultados razonables. Pero si solo quisiera clasificar, decir una imagen, o entrenar con una cantidad dada de imágenes para cada clase y probar con el resto, esto no funciona en absoluto.
¿Cómo puedo eliminar la dependencia entre el número de imágenes de entrenamiento y las características, para que pueda probar con cualquier cantidad de imágenes?
Estoy usando libsvm para MATLAB, los kernels son matrices de distancia que oscilan entre [0,1].