2012-04-07 11 views
10

Actualmente utilizo la versión MATLAB de la máquina de vectores de soporte LIBSVM para clasificar mis datos. La documentación de LIBSVM menciona que la escala antes de aplicar SVM es muy importante y tenemos que usar el mismo método para escalar los datos de entrenamiento y prueba.escalando los datos de prueba para LIBSVM: implementación de MATLAB

El "mismo método de escalamiento" se explica como: Por ejemplo, supongamos que escaló el primer atributo de datos de entrenamiento de [-10, +10] a [-1, +1]. Si el primer atributo de los datos de prueba se encuentra en el rango [-11, +8], hay que escalar los datos de prueba para [-1.1, +0.8]

de escala los datos de entrenamiento en el rango de [0,1] se puede hacer usando el siguiente código de MATLAB:

(data - repmat(min(data,[],1),size(data,1),1))*spdiags(1./(max(data,[],1)-min(data,[],1))',0,size(data,2),size(data,2)) 

Pero no sé cómo escalar los datos de prueba correctamente.

Muchas gracias por su ayuda.

+0

mi pregunta es que si entrenar datos en el rango de [a, b] normalizados al rango [0,1], los datos de prueba en el rango de [c, d] normalizados a qué rango? – Lily

Respuesta

16

El código que usted da es esencialmente restar el mínimo y luego dividir por el rango. Necesita almacenar el mínimo y el rango de las características de datos de entrenamiento.

minimums = min(data, [], 1); 
ranges = max(data, [], 1) - minimums; 

data = (data - repmat(minimums, size(data, 1), 1)) ./ repmat(ranges, size(data, 1), 1); 

test_data = (test_data - repmat(minimums, size(test_data, 1), 1)) ./ repmat(ranges, size(test_data, 1), 1); 
+0

¡Muchas gracias! :) – Lily

+0

@Richante: Tu respuesta es muy útil. Solo quiero aclarar, "datos" aquí son los datos de entrenamiento y "test_data" son los datos de prueba? – Sid

+0

http://stackoverflow.com/questions/43408031/scaling-for-single-instance-in-matlab-for-libsvm?noredirect=1&lq=1 –

0

código de Richante es, por desgracia, no es correcto si hay columnas para las que todas las observaciones tiene el mismo valor (que puede suceder si los datos son escasos). Un ejemplo:

>> data = [1 2 3; 5 2 8; 7 2 100] 

data = 

    1  2  3 
    5  2  8 
    7  2 100 

>> test_data = [1 2 3; 4 5 6; 7 8 9]; 
>> minimums = min(data,[],1); 
>> ranges = max(data, [], 1) - minimums; 
>> data = (data - repmat(minimums, size(data, 1), 1)) ./ repmat(ranges, size(data, 1), 1); 
>> data 

data = 

     0  NaN   0 
    0.6667  NaN 0.0515 
    1.0000  NaN 1.0000 

Por lo tanto, debe verificar si hay columnas que tienen un solo valor. Pero, ¿qué pasa si solo hay un único valor en todo el conjunto de entrenamiento, pero hay varios valores en el conjunto de prueba? ¿Y qué hacemos en el escenario Deje uno salir, en el que solo hay una observación en el conjunto de prueba, luego si todos los valores en una columna del conjunto de entrenamiento es 0 y el valor correspondiente en el conjunto de prueba es 100? Estos son casos realmente degenerados, pero podría suceder. Sin embargo, cuando comprobé el svm_scale.c archivo en la biblioteca Libsvm, me di cuenta de esta parte:

void output(int index, double value) 
{ 
    /* skip single-valued attribute */ 
    if(feature_max[index] == feature_min[index]) 
     return; 

    if(value == feature_min[index]) 
     value = lower; 
    else if(value == feature_max[index]) 
     value = upper; 
    else 
     value = lower + (upper-lower) * 
      (value-feature_min[index])/ 
      (feature_max[index]-feature_min[index]); 

    if(value != 0) 
    { 
     printf("%d:%g ",index, value); 
     new_num_nonzeros++; 
    } 
} 

por lo que debemos pasar por alto estos casos? Realmente no lo sé Como ya he dicho, no soy una autoridad en este tema, así que voy a esperar otra respuesta, preferiblemente de los propios autores de Libsvm, para aclarar las cosas .....