Me pregunto si alguien está familiarizado con la agrupación de entradas nominales. He estado buscando en SOM como una solución, pero aparentemente solo funciona con características numéricas. ¿Hay alguna extensión para las características categóricas? Específicamente me preguntaba acerca de 'Días de la semana' como posibles características. Por supuesto, es posible convertirlo en una función numérica (es decir, lunes a domingo correspondiente a los números 1-7), sin embargo, la distancia euclidiana entre Sol y lunes (1 y 7) no sería la misma que la distancia de lunes a martes (1 y 2 ) Cualquier sugerencia o idea sería muy apreciada.
11
Respuestas:
Antecedentes:
La forma más lógica de transformar la hora es en dos variables que se desvían de la sincronización. Imagine la posición de la manecilla de fin de hora de un reloj de 24 horas. La
x
posición oscila de un lado a otro fuera de sincronización con lay
posición. Para un reloj de 24 horas se puede lograr esto conx=sin(2pi*hour/24)
,y=cos(2pi*hour/24)
.Necesita ambas variables o se pierde el movimiento adecuado a través del tiempo. Esto se debe al hecho de que la derivada de sin o cos cambia en el tiempo, mientras que la
(x,y)
posición varía suavemente a medida que viaja alrededor del círculo unitario.Finalmente, considere si vale la pena agregar una tercera característica para rastrear el tiempo lineal, que se puede construir como horas (o minutos o segundos) desde el comienzo del primer registro o una marca de tiempo Unix o algo similar. Estas tres características proporcionan proxies para la progresión cíclica y lineal del tiempo, por ejemplo, puede extraer fenómenos cíclicos como los ciclos de sueño en el movimiento de las personas y también el crecimiento lineal como la población frente al tiempo.
Ejemplo de si se está logrando:
Ahora probémoslo:
Apenas puede ver que hay algunos momentos posteriores a la medianoche incluidos con el clúster verde anterior a la medianoche. Ahora reduzcamos el número de clústeres y demostremos que antes y después de la medianoche se pueden conectar en un solo clúster con más detalle:
Vea cómo el clúster azul contiene horas anteriores y posteriores a la medianoche que se agrupan en el mismo clúster ...
Puede hacer esto por tiempo, día de la semana, semana del mes, día del mes, temporada o cualquier cosa.
fuente
Las variables nominales comunes se codifican de forma ficticia cuando se usan en SOM (por ejemplo, una variable con un 1 para el lunes 0 para no el lunes, otra para el martes, etc.).
Puede incorporar información adicional creando categorías combinadas de días adyacentes. Por ejemplo: lunes y martes, martes y miércoles, etc. Sin embargo, si sus datos se relacionan con el comportamiento humano, a menudo es más útil usar Weekday y Weekend como categorías.
fuente
Para las variables nominales, la codificación típica en una red neuronal o contexto de ingeniería eléctrica se denomina "one-hot" , un vector de todos los 0, con un 1 en la posición adecuada para el valor de la variable. Para los días de la semana, por ejemplo, hay siete días, por lo que sus vectores calientes serían de longitud siete. Entonces el lunes se representaría como [1 0 0 0 0 0 0], el martes como [0 1 0 0 0 0 0], etc.
Como Tim sugirió, este enfoque se puede generalizar fácilmente para abarcar vectores de características booleanas arbitrarias, donde cada posición en el vector corresponde a una característica de interés en sus datos, y la posición se establece en 1 o 0 para indicar la presencia o ausencia de ese característica.
Una vez que tiene vectores binarios, la distancia de Hamming se convierte en una métrica natural, aunque también se usa la distancia euclidiana. Para vectores binarios de un solo calor, el SOM (u otro aproximador de función) naturalmente interpolará entre 0 y 1 para cada posición del vector. En este caso, estos vectores a menudo se tratan como los parámetros de una distribución de Boltzmann o softmax en el espacio de la variable nominal; Este tratamiento también proporciona una forma de utilizar los vectores en algún tipo de escenario de divergencia KL.
Las variables cíclicas son mucho más complicadas. Como dijo Arthur en los comentarios, usted mismo necesitaría definir una métrica de distancia que incorpore la naturaleza cíclica de la variable.
fuente
Suponiendo que el día de la semana (dow) pase de [0, 6], en lugar de proyectar datos en un círculo, otra opción es usar:
Para entender por qué, considera el dow como un reloj
diff entre 6 y 1 podría ser 6 - 1 = 5 (yendo en sentido horario de 1 a 6) o 7 - (6 - 1) = 2. Tomar el mínimo de ambas opciones debería ser el truco.
En general puedes usar:
min(abs(diff), range - abs(diff))
fuente
He codificado con éxito los Días de la semana (y los Meses del año) como tupla de (cos, sin) como whuber destacó en su comentario. De la distancia euclidiana utilizada.
Este es un ejemplo de código en r:
La distancia euclidiana entre 0 y 6 es igual a 0 y 1.
fuente