2010-11-30 6 views
8

Mi vector de características tiene componentes continuos (o de amplio alcance) y binarios. Si simplemente uso la distancia euclidiana, los componentes continuos tendrán un impacto mucho mayor:¿Cómo usar las características binarias y continuas en el algoritmo k-Nearest-Neighbor?

Representando simétrico vs. asimétrico como 0 y 1 y alguna relación menos importante que varía de 0 a 100, cambiando de simétrico a asimétrico tiene una pequeña distancia impacto en comparación con cambiar la proporción por 25.

Puedo agregar más peso a la simetría (por ejemplo, 0 o 100), pero ¿hay una mejor manera de hacerlo?

Respuesta

9

Puede intentar usar la distancia euclidiana normalizada, descrita, por ejemplo, al final de la primera sección here.

Simplemente escala cada característica (continua o discreta) por su desviación estándar. Esto es más sólido que, por ejemplo, escalar por el rango (max-min) según lo sugerido por otro afiche.

1

si he entendido bien su pregunta, la normalización (también conocido como 'cambio de escala) cada dimensión o columna en el conjunto de datos es la técnica convencional para tratar con más ponderación dimensiones, por ejemplo,

ev_scaled = (ev_raw - ev_min)/(ev_max - ev_min) 

En R, para ejemplo, se puede escribir esta función:

ev_scaled = function(x) { 
    (x - min(x))/(max(x) - min(x)) 
} 

que funciona de esta manera:

# generate some data: 
# v1, v2 are two expectation variables in the same dataset 
# but have very different 'scale': 
> v1 = seq(100, 550, 50) 
> v1 
    [1] 100 150 200 250 300 350 400 450 500 550 
> v2 = sort(sample(seq(.1, 20, .1), 10)) 
> v2 
    [1] 0.2 3.5 5.1 5.6 8.0 8.3 9.9 11.3 15.5 19.4 
> mean(v1) 
    [1] 325 
> mean(v2) 
    [1] 8.68 

# now normalize v1 & v2 using the function above: 
> v1_scaled = ev_scaled(v1) 
> v1_scaled 
    [1] 0.000 0.111 0.222 0.333 0.444 0.556 0.667 0.778 0.889 1.000 
> v2_scaled = ev_scaled(v2) 
> v2_scaled 
    [1] 0.000 0.172 0.255 0.281 0.406 0.422 0.505 0.578 0.797 1.000 
> mean(v1_scaled) 
    [1] 0.5 
> mean(v2_scaled) 
    [1] 0.442 
> range(v1_scaled) 
    [1] 0 1 
> range(v2_scaled) 
    [1] 0 1 
Cuestiones relacionadas