Algoritmo para segmentação de dados de sequência

8

Eu tenho uma grande sequência de vetores de comprimento N. Preciso de algum algoritmo de aprendizado não supervisionado para dividir esses vetores em segmentos M.

Por exemplo:

insira a descrição da imagem aqui

O K-means não é adequado, porque coloca elementos semelhantes de locais diferentes em um único cluster.

Atualizar:

Os dados reais são assim:

insira a descrição da imagem aqui

Aqui, vejo três clusters: [0..50], [50..200], [200..250]

Atualização 2:

Usei k-means modificados e obtive este resultado aceitável:

insira a descrição da imagem aqui

Fronteiras dos clusters: [0, 38, 195, 246]

generall
fonte
2
A qualidade da pergunta deve ser melhorada para obter uma resposta adequada, por exemplo, todas as seqüências sempre mudam no mesmo ponto (como você ilustrou no exemplo)?
Kasra Manshaei
Meus dados reais são mais complicados. É uma lista de vetores de 9 dimensões. Vou adicionar uma imagem à seção principal.
Generall

Respostas:

8

Por favor, veja o meu comentário acima e esta é a minha resposta de acordo com o que entendi da sua pergunta:

Como você afirmou corretamente, você não precisa de Clustering, mas de Segmentação . Na verdade, você está procurando pontos de mudança em suas séries temporais. A resposta realmente depende da complexidade dos seus dados. Se os dados são tão simples quanto o exemplo acima, você pode usar a diferença de vetores que ultrapassa os pontos de mudança e definir um limite para detectar esses pontos como abaixo: insira a descrição da imagem aqui Como você vê, por exemplo, um limite de 20 (ou seja, e ) detectará os pontos. Obviamente, para dados reais, você precisa investigar mais para encontrar os limites.dx<20dx>20

Pré-processando

Observe que há uma troca entre a localização exata do ponto de mudança e o número exato de segmentos, ou seja, se você usar os dados originais, encontrará os pontos de mudança exatos, mas todo o método é sensível ao ruído, mas se você suavizar seus sinais primeiro, você pode não encontrar as mudanças exatas, mas o efeito do ruído será muito menor, conforme mostrado nas figuras abaixo:

insira a descrição da imagem aqui insira a descrição da imagem aqui

Conclusão

Minha sugestão é suavizar seus sinais primeiro e optar por um método simples de agrupamento (por exemplo, usando GMM s) para encontrar uma estimativa precisa do número de segmentos nos sinais. Dada essa informação, você pode começar a encontrar pontos de mudança limitados pelo número de segmentos encontrados na parte anterior.

Espero que tudo tenha ajudado :)

Boa sorte!

ATUALIZAR

Felizmente, seus dados são bem diretos e limpos. Eu recomendo fortemente algoritmos de redução de dimensionalidade (por exemplo, PCA simples ). Eu acho que revela a estrutura interna dos seus clusters. Depois de aplicar o PCA aos dados, você pode usar k-significa muito, muito mais fácil e mais preciso.

Uma solução séria (!)

De acordo com seus dados, vejo que a distribuição generativa de diferentes segmentos é diferente, o que é uma grande chance para você segmentar suas séries temporais. Veja isto (original , arquivo , outra fonte ), que provavelmente é a melhor e mais avançada solução para o seu problema. A principal idéia por trás deste artigo é que, se diferentes segmentos de uma série temporal forem gerados por diferentes distribuições subjacentes, você poderá encontrar essas distribuições, defini-las como a verdade fundamental para sua abordagem de agrupamento e encontrar clusters.

Por exemplo, assuma um vídeo longo no qual os primeiros 10 minutos em que alguém anda de bicicleta, nos segundos 10 minutos em que ele está correndo e no terceiro em que está sentado. você pode agrupar esses três segmentos diferentes (atividades) usando essa abordagem.

Kasra Manshaei
fonte
Obrigado pela resposta detalhada. Como você pode ver acima, eu não posso usar limites para minha sequência de dados real, acho que é muito complicada para isso. Estou tentando modificar o algoritmo k-means, ele considerará a condição da sequência (o elemento só pode pertencer a um dos dois clusters vizinhos). Espero que não reinvente a roda. :)
Generall
1
Eu acho que seus dados não são tão barulhentos (ou seja, complicados) e você pode optar por coisas limiares. o ponto é que você tem uma impressão dos dados para que você possa usar um tipo de algoritmo supervisionado, ou seja, tentando aprender limites (e espero que ele generalize bem!). Eu também atualizar a minha resposta para uma solução agradável :)
Kasra Manshaei
Obrigado pelos links interessantes, eu acho, que podem ser usados ​​para meu propósito, mas, por enquanto, uso o k-means nas minhas modificações, o que me dá resultados aceitáveis ​​(foto em questão).
Generall
1
resultados muito bons! jogada inteligente. Estou orgulhoso de você: D Boa sorte!
Kasra Manshaei
1

Sabe-se que o cluster K-means fornece mínimos locais, dependendo da sua inicialização inicial dos centros de cluster.

No entanto, a segmentação k-means pode, eu acho, ser resolvida globalmente, pois não permitimos nada na busca da solução.

Pude ver pelos seus comentários que você conseguiu alcançar uma segmentação. Você poderia dar algum feedback, por favor? Sua solução é a melhor solução? Ou você se contentou com uma solução boa o suficiente?

Nolatar
fonte
A segmentação K-means também pode fornecer mínimos locais, porque você ainda precisa escolher os medoóides \ centróides iniciais. Minha solução atual é boa o suficiente para mim, mas não posso afirmar que é a melhor. Posso compartilhar detalhes da minha solução, se você estiver interessado nela.
Generall
Depende de como você o implementa. Enquanto isso, descobri em alguma literatura que, para segmentação, é possível encontrar o mínimo global, em tempo polinomial.
Nolatar
0

Apenas como sugestão: você pode tentar usar o algoritmo DBSCAN, pois ele geralmente funciona muito melhor do que o K-means para clustering

Caso contrário, se você quiser tentar algo novo para agrupar e aprender algumas coisas interessantes, sugiro que tente alguma Análise de Dados Topológicos através de diagramas persistentes. Vou deixar aqui uma introdução fácil e agradável :)

https://towardsdatascience.com/persistent-homology-with-examples-1974d4b9c3d0

Davide ND
fonte