Detecção de outlier online


10

Desejo processar imagens de microscopia segmentadas automaticamente para detectar imagens e / ou segmentações defeituosas, como parte de um pipeline de geração de imagens de alto rendimento. Há vários parâmetros que podem ser calculados para cada imagem e segmentação brutas e que se tornam "extremos" quando a imagem está com defeito. Por exemplo, uma bolha na imagem resultará em anomalias, como um tamanho enorme em uma das "células" detectadas ou uma contagem anormalmente baixa de células para todo o campo. Estou procurando uma maneira eficiente de detectar esses casos anômalos. Idealmente, eu preferiria um método que possua as seguintes propriedades (aproximadamente em ordem de conveniência):

  1. não requer limites absolutos predefinidos (embora porcentagens predefinidas estejam OK);

  2. não requer ter todos os dados na memória, ou mesmo ter visto todos os dados; seria bom que o método fosse adaptável e atualize seus critérios à medida que vê mais dados; (obviamente, com algumas probabilidades pequenas, podem ocorrer anomalias antes que o sistema tenha visto dados suficientes e sejam perdidos etc.)

  3. é paralelizável: por exemplo, em um primeiro turno, muitos nós trabalhando em paralelo produzem anomalias candidatas intermediárias, que passam por uma segunda rodada de seleção após a conclusão da primeira rodada.

As anomalias que estou procurando não são sutis. Eles são do tipo claramente óbvio se olharmos para um histograma dos dados. Mas o volume de dados em questão e o objetivo final de realizar essa detecção de anomalias em tempo real à medida que as imagens são geradas, impedem qualquer solução que exija inspeção de histogramas por um avaliador humano.

Obrigado!


Estou certo de que seu problema é essencialmente univariado?
user603

11
Poste alguns dados, pois isso pode me ajudar a "ver" o problema que você tem. Eu estou familiarizado com o histograma destacando o outlier e posso fornecer algumas orientações sobre uma maneira eficiente de detectar esses casos anômalos usando métodos estatísticos, em vez de inspecionar histogramas por um avaliador humano. Veja uma discussão recente sobre a detecção de aleatoriedade stats.stackexchange.com/questions/12955/… É claro que você está tentando detectar violações determinísticas da aleatoriedade.
IrishStat

Você pode nos dar mais detalhes? Os parâmetros são contínuos ou discretos? Que distribuição têm os parâmetros para imagens não defeituosas? Gaussiano? Os parâmetros são independentes ou correlacionados? Aproximadamente quantos parâmetros você extrai, por imagem? Quantas imagens por segundo você precisa ser capaz de manipular (ou qual latência por imagem é aceitável)? Talvez você possa mostrar alguns histogramas para alguns parâmetros típicos, em um grande conjunto de dados de imagens não defeituosas, e depois mostrar o histograma correspondente para imagens defeituosas? Isso pode ajudar a encontrar uma boa solução.
DW

Respostas:


3

Você já pensou em algo como um classificador de uma classe?

Você precisaria de um conjunto de treinamento de imagens conhecidas, que são usadas para treinar um classificador que tenta distinguir entre "imagens como o conjunto de treinamento" e tudo o mais. Há uma tese de David Tax que provavelmente possui mais informações do que você realmente precisa sobre o assunto, mas que pode ser um bom ponto de partida.

Além de exigir um conjunto de treinamento, parece que ele atenderia aos seus requisitos:

  • Os parâmetros são aprendidos com os dados (sem ad-hockery aqui)

  • Depois de obter o modelo, não há necessidade de manter os dados na memória.

  • Da mesma forma, o classificador treinado pode ser executado em quantos nós você tiver.

Dependendo da sua aplicação, você poderá treinar um classificador que pode ser reparado uma vez e reutilizá-lo para diferentes tipos de amostras / corantes / manchas / floróforos / etc. Como alternativa, você pode conseguir que os usuários classifiquem manualmente alguns dos primeiros lotes de cada execução - imagino que um humano possa verificar pelo menos 5-8 exemplos / minuto com uma boa interface.



1

Existem muitas abordagens possíveis, mas é difícil saber o que pode ser melhor na sua situação sem mais informações.

Rn

  • Armazene os vetores de recursos de todas as imagens anteriores, juntamente com sua classificação, em disco. Periodicamente (digamos, uma vez por dia), treine um algoritmo de aprendizado nesses dados e use o algoritmo resultante para classificar novas imagens. O espaço em disco é barato; Essa solução pode ser pragmática e eficaz para converter um algoritmo de aprendizado offline em um que possa ser usado na sua configuração online.

  • Armazene os vetores de recursos de uma amostra aleatória de 1.000 (ou 1.000.000) imagens anteriores, juntamente com sua classificação. Treine periodicamente um algoritmo de aprendizado nesta subamostra.

    Observe que você pode atualizar com eficiência essa subamostra de maneira on-line usando truques padrão . Isso é interessante apenas se houver alguma razão pela qual é difícil armazenar todos os vetores de recursos de todas as imagens anteriores (o que parece difícil de imaginar, para mim, mas quem sabe).

  • nccn

    nμnσμiiσix|xiμi|cσiiμσ

    Essa abordagem supõe que cada parâmetro de uma imagem não defeituosa tenha uma distribuição gaussiana e que os parâmetros sejam independentes. Essas suposições podem ser otimistas. Existem muitas variantes mais sofisticadas desse esquema que eliminam a necessidade dessas suposições ou melhoram o desempenho; este é apenas um exemplo simples para lhe dar uma ideia.

Em geral, você pode procurar algoritmos online e algoritmos de streaming.


DW Um modelo / filtro ARIMA é uma otimização de "uma média corrente", em que o número de termos (N) e os pesos específicos a serem aplicados são empiricamente identificados. Um modelo em particular e obviamente presuntivo é adivinhar em "N" o número de valores a serem usados ​​na "média corrente" e depois compor a inanidade assumindo que os pesos são iguais entre si.
IrishStat

@IrishStat, Não sei se entendi o seu comentário. Caso minha escrita não estivesse clara, eu não estava sugerindo o ARIMA, embora isso também possa ser considerado. Eu estava sugerindo algo muito mais simples: acompanhar a média de todas as observações até agora e o desvio padrão. Cada vez que você vê uma nova observação, é possível atualizar a média e o desvio padrão (desde que você acompanhe o número de observações vistas até agora) com métodos padrão. Pode ser simplista, mas não vejo por que isso seria insano.
DW

0

Rn

Se os outliers forem bastante óbvios, um truque simples que funcionaria é o seguinte. Construa uma função de hash sensível à localidade a partir de seus vetores. (Um hash aleatório simples como o lado de um conjunto de hiperplanos aleatórios no qual o vetor se encaixa pode funcionar. Isso produziria um vetor booleano como o valor do hash.) Agora, ao receber vetores, você calcula o valor do hash do vetor e armazena o valor de hash (o vetor booleano no caso de hiperplanos) e as contagens em um dicionário. Você também armazena o número total de vetores vistos até o momento. A qualquer momento, você pode sinalizar um determinado vetor como um erro externo se o número total de vetores que colidem com ele no hash for menor que uma porcentagem predefinida do total.

Você pode ver isso como construir um histograma de forma incremental. Mas como os dados não são univariados, usamos o truque de hash para fazê-lo se comportar como ele.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.