Detectando Clusters em uma Sequência Binária

8

Eu tenho uma sequência binária como 11111011011110101100000000000100101011011111101111100000000000011010100000010000000011101111

Onde clusters de 1s são seguidos por um número maior de zeros, como na figura abaixo (preto significa 1):

insira a descrição da imagem aqui

Eu gostaria de aplicar uma técnica (preferencialmente em R ou em Python) em que eu possa detectar automaticamente esses clusters de 1s e produzir extensões (indicadas como linhas vermelhas na imagem). Eu sei que alguém poderia fazer isso com um limite, ou seja, dizendo que dois clusters devem ser separados por pelo menos n 0s para serem clusters, mas me pergunto se existem outros métodos estabelecidos que não usem limites predefinidos .

Qualquer ideia?

wnstnsmth
fonte

Respostas:

5

Eu evitaria chamá-los de "clusters". Com essa terminologia, você acaba se distraindo em técnicas multidimensionais da mineração de dados o tempo todo.

Seu problema é uma configuração unidimensional muito mais simples. E ainda mais simples: você nem tem coordenadas, mas uma matriz de zeros e uns.

Nunca haverá uma solução única para o seu problema . Porque um usuário pode querer ler "códigos de barras" de alta resolução, enquanto o outro usuário tem muito ruído.

Então, no final, você precisará ter um parâmetro. Você tem várias opções: tamanhos absolutos de gap, tamanhos relativos de gap, largura de banda do kernel etc.

Uma abordagem "baseada em kernel" muito simples seria mapear cada pixel para o número de pixels definido em -10 ... + 10. Portanto, são 21 células, o valor será de 0 a 21. Agora, procure um mínimo local. Aumente o tamanho da janela, se começar a dividir as execuções que você ainda não deseja dividir.

Possui QUIT - Anony-Mousse
fonte
Obrigado. A sugestão com o kernel e o mínimo local é realmente semelhante ao que o @EngrStudent propôs, certo? Ainda não compreendo completamente o que se entende por isso. Como posso procurar um mínimo local de maneira baseada em máquina? Ou seja, como posso calcular a primeira derivada da "função" sem conhecer a função em si, mas apenas os valores?
Wnstnsmth
Sim, provavelmente é o mesmo que o EngrStudent sugeriu. A estimativa da densidade do núcleo é uma técnica muito padrão para suavização. Também é usado em todo o lugar no processamento de imagens! É um mínimo local se não houver um valor menor de vizinho ... é tão simples assim se você tiver um conjunto de dados discreto.
QuIT - Anony-Mousse
2

A referência 1 nas páginas 49-55 possui uma boa seção sobre métodos baseados em kernel que podem ser úteis aqui. Se eu estivesse fazendo isso, examinaria uma soma ponderada dos valores reais e sua primeira derivada, pois poderia ser um melhor indicador de "informação".

Referência: http://amzn.com/0198538642 "Redes neurais para reconhecimento de padrões", de Christopher Bishop. (1995)

EngrStudent
fonte
1
a primeira derivada numérica em relação ao índice é "diff". Portanto, se você tiver muitos "uns" seguidos, a derivada será zeros. Se você tiver alguns esparsos, toda vez que alternar, o diff será maior. Você pode usar o EWMA como um kernel pobre do homem. en.wikipedia.org/wiki/Exponential_smoothing . Como funciona? Faz uma média ponderada de uma janela de valores. Uma função do kernel faz algo relacionado, mas um pouco mais complexo. Às vezes, é necessária uma janela para uma janela muito maior e, em seguida, calcula uma função com base nos valores nela. Às vezes, a função se parece com um pdf.
precisa saber é o seguinte
1
Somando o diff e os valores brutos, você obtém informações quando são escassos e densos.
EngrStudent
Você poderia elaborar sua resposta e comentar com uma pequena sequência de exemplo? Eu tenho um problema muito similar.
Arun Jose
O valor absoluto de um diff é um detector de borda. Se você tiver uma sequência como 000111000 e fizer o diff, obtém 00100 (-1) 00. A localização do 1 no diff mostra a borda ascendente e o -1 mostra a borda descendente. Se você pegasse o valor absoluto do diff e, em seguida, somasse, obteria 2 arestas toal. Se você teve a sequência 010101010, seu diff absoluto é 11111111, que soma 8 arestas. Há uma contagem de arestas substancialmente mais alta. Se você NÃO fizer diferença no abdômen e usá-lo em uma soma contínua, ele informará quantos 1 ou 0 você tem em uma linha.
EngrStudent
Sob quais critérios você diria que uma sequência de 1 chega ao fim e começa? Como você determina o tamanho da janela?
Arun Jose
0

O problema tem alguma semelhança com o processamento de imagem. Você tem uma imagem binária com altura de um pixel e deseja obter algum tipo de segmentação .

A natureza da imagem de entrada sugere um filtro morfológico para suavizar as regiões, por exemplo, fechar . Você precisaria escolher o elemento estruturador que determina a "ligação" dos clusters. No final, isso é bastante semelhante à sua abordagem. Você também pode suavizar a imagem usando filtros de convolução, por exemplo, borrão ou kernel gaussiano e aplicar um limite escolhido para reinicializá-la.

Se você pode tratar tudo 1como um ponto, sua posição na sequência como uma coordenada e pode compor alguma métrica de distância, poderá usar praticamente todos os algoritmos de clustering padrão existentes. Por exemplo, você pode usar cluster hierárquico (escolher um critério de ligação e um limite), pode usar k-means ou um EM com um modelo de mistura gaussiano (escolha o número de clusters que procura).

Mas não creio que você possa eventualmente fugir sem ter que predefinir a sensibilidade do algoritmo pelo menos.

moooeeeep
fonte