Basta saber se alguém está familiarizado com o agrupamento de entradas nominais. Eu estive olhando o SOM como uma solução, mas aparentemente ele só funciona com recursos numéricos. Existem extensões para recursos categóricos? Especificamente, eu estava pensando em "Dias da semana" como possíveis recursos. Obviamente, é possível convertê-lo em um recurso numérico (por exemplo, seg - dom correspondente aos n. 1-7), mas a distância euclidiana entre sol e seg (1 e 7) não seria a mesma que a distância de seg a ter (1 e 2). ) Todas as sugestões ou idéias serão muito apreciadas.
11
Respostas:
Fundo:
A maneira mais lógica de transformar a hora é em duas variáveis que oscilam para frente e para trás fora de sincronia. Imagine a posição do ponteiro de fim de hora de um relógio de 24 horas. A
x
posição oscila para frente e para trás fora de sincronia com ay
posição. Para um relógio de 24 horas você pode fazer isso comx=sin(2pi*hour/24)
,y=cos(2pi*hour/24)
.Você precisa de ambas as variáveis ou o movimento adequado ao longo do tempo é perdido. Isso se deve ao fato de que a derivada do pecado ou cos muda no tempo, enquanto a
(x,y)
posição varia suavemente à medida que viaja ao redor do círculo unitário.Por fim, considere se vale a pena adicionar um terceiro recurso para rastrear o tempo linear, que pode ser construído como horas (ou minutos ou segundos) desde o início do primeiro registro ou um carimbo de data / hora do Unix ou algo semelhante. Esses três recursos fornecem proxies para a progressão cíclica e linear do tempo, por exemplo, você pode retirar fenômenos cíclicos como ciclos de sono no movimento das pessoas e também crescimento linear como população versus tempo.
Exemplo de se está sendo realizado:
Agora vamos tentar:
Você mal consegue ver que há alguns horários após a meia-noite incluídos no cluster verde antes da meia-noite. Agora vamos reduzir o número de clusters e mostrar que antes e depois da meia-noite podem ser conectados em um único cluster com mais detalhes:
Veja como o cluster azul contém horários anteriores e posteriores à meia-noite agrupados no mesmo cluster ...
Você pode fazer isso por hora, dia da semana, semana do mês, dia do mês, estação do ano ou qualquer outra coisa.
fonte
As variáveis nominais comuns são codificadas quando usadas no SOM (por exemplo, uma variável com 1 na segunda-feira 0 para não segunda-feira, outra na terça-feira etc.).
Você pode incorporar informações adicionais criando categorias combinadas de dias adjacentes. Por exemplo: segunda e terça-feira, terça e quarta-feira, etc. No entanto, se seus dados estiverem relacionados ao comportamento humano, geralmente será mais útil usar o dia da semana e o fim de semana como categorias.
fonte
Para variáveis nominais, a codificação típica em uma rede neural ou em um contexto de engenharia elétrica é chamada de "um quente" - um vetor de todos os 0s, com um 1 na posição apropriada para o valor da variável. Para os dias da semana, por exemplo, há sete dias, portanto seus vetores de um calor seriam de sete. Então, segunda-feira seria representada como [1 0 0 0 0 0 0], terça-feira como [0 1 0 0 0 0 0]] etc.
Como Tim sugeriu, essa abordagem pode ser generalizada facilmente para abranger vetores de recursos booleanos arbitrários, em que cada posição no vetor corresponde a um recurso de interesse em seus dados, e a posição é definida como 1 ou 0 para indicar a presença ou ausência dos mesmos. característica.
Depois de ter vetores binários, a distância de Hamming se torna uma métrica natural, embora a distância euclidiana também seja usada. Para vetores binários muito quentes, o SOM (ou outro aproximador de função) naturalmente interpola entre 0 e 1 para cada posição do vetor. Nesse caso, esses vetores são frequentemente tratados como parâmetros de uma distribuição Boltzmann ou softmax no espaço da variável nominal; esse tratamento também fornece uma maneira de usar os vetores em algum tipo de cenário de divergência de KL.
Variáveis cíclicas são muito mais complicadas. Como Arthur disse nos comentários, você precisa definir uma métrica de distância que incorpore a natureza cíclica da variável.
fonte
Supondo que o dia da semana (dow) vá de [0, 6], em vez de projetar dados em um círculo, outra opção é usar:
Para entender o porquê, considere o dow como um relógio
diff entre 6 e 1 pode ser 6 - 1 = 5 (indo no sentido horário de 1 a 6) ou 7 - (6 - 1) = 2. Tomar o mínimo de ambas as opções deve ser suficiente.
Em geral, você pode usar:
min(abs(diff), range - abs(diff))
fonte
Eu codifiquei com sucesso Dias da semana (e Meses do ano) como tupla de (cos, sin) como whuber destacado em seu comentário. Do que a distância euclidiana utilizada.
Este é um exemplo de código em r:
A distância euclidiana entre 0 e 6 é igual a 0 e 1.
fonte