Detecção de outlier em conjuntos muito pequenos

12

Preciso obter um valor o mais preciso possível para o brilho de uma fonte de luz principalmente estável, dados os doze valores de luminosidade da amostra. O sensor é imperfeito, e a luz pode ocasionalmente "piscar" mais brilhante ou mais escura, o que pode ser ignorado, daí a minha necessidade de detecção externa (eu acho?).

Eu já li algumas abordagens aqui e não consigo decidir qual abordagem seguir. O número de discrepantes nunca é conhecido antecipadamente e geralmente será zero. O flicker geralmente é um desvio muito grande do brilho estável (o suficiente para realmente mexer com qualquer média obtida com um grande presente), mas não necessariamente.

Aqui está um conjunto de 12 medições para completar a questão:

295.5214, 277.7749, 274.6538, 272.5897, 271.0733, 292.5856, 282.0986, 275.0419, 273.084, 273.1783, 274.0317, 290.1837

Meu pressentimento é que provavelmente não existem discrepâncias nesse conjunto em particular, embora 292 e 295 pareçam um pouco altos.

Então, minha pergunta é: qual seria a melhor abordagem aqui? Devo mencionar que os valores provêm da distância euclidiana dos componentes RG e B da luz de um ponto zero (preto). Seria programaticamente doloroso, mas possível, voltar a esses valores, se necessário. A distância euclidiana foi usada como uma medida da "força geral", pois não estou interessado na cor, apenas na força da saída. No entanto, há uma chance razoável de que os tremores que eu mencionei tenham uma composição RGB diferente da saída usual.

No momento, estou brincando com algum tipo de função que se repetirá até que uma associação estável de medidas permitidas seja alcançada por:

  1. Encontrando o desvio padrão
  2. Colocando tudo fora, digamos, 2 SDs em uma lista de ignorados
  3. Recalculando a média e o DP com a lista de ignorados excluída
  4. Decidir quem ignorar com base na nova média e no desvio padrão (avaliar todos os 12)
  5. Repita até ficar estável.

Existe algum valor nessa abordagem?

Todos os comentários aceitos com gratidão!

technorabble
fonte
Por mais doloroso que seja, vale a pena prosseguir com sua especulação de que um tremulação possa realmente ter diferentes componentes RGB (embora às vezes a uma distância semelhante do preto). Outra opção é simplesmente usar a mediana em vez da média, dependendo do seu objetivo.
26714 Wayne Wayne

Respostas:

7

Os valores extremos em amostras pequenas podem sempre ser muito difíceis de detectar. Na maioria dos casos, na verdade, eu recomendaria que, se você sentir que seus dados não estão corrompidos, um valor "irregular" pode não ser problemático e sua exclusão pode ser irracional. Provavelmente, o uso de técnicas estatísticas robustas será mais sensato e mais próximo de uma solução intermediária. Você tem uma pequena amostra; tente fazer com que cada ponto de amostra conte. :)

Em relação à sua abordagem sugerida: eu não aplicaria apressadamente uma suposição de normalidade para seus dados com uma regra 68-95-99.7 (como você parece fazer de alguma forma com sua regra heurística 2SD). A desigualdade de Chebyshev assume pela primeira vez uma regra de 75-88.9-93.8, claramente menos rígida. Outras " regras " também existem; a seção Identificando outliers no lema Outlier na wikipedia possui um pacote de heurísticas.

Aqui está outra: Uma referência de livro gratuito que eu me deparei sobre o assunto, o NIST / SEMATECH e-Handbook of Statistical Methods , apresenta a seguinte idéia de Iglewicz e Hoaglin (1993): Use scores modificados, de modo que:MZM

Mi=.6745(xix~)/MAD

onde é a sua mediana e MAD é o desvio absoluto médio da sua amostra. Então assuma que valores absolutos de acima de 3,5 são discrepantes em potencial. É uma sugestão semi-paramétrica (como a maioria é, o parâmetro aqui é o ). No seu exemplo, ele excluiria marginalmente o seu 295,5, mas manteria claramente a sua medida 292,6 ... (Pelo que vale a pena, não excluiria nenhum valor do seu exemplo). M3,5x~M3.5

Novamente, dado que você tem uma amostra muito pequena, se você acredita que sua amostra não está obviamente corrompida (um ser humano de 9'4 "de altura), aconselhamos que você não exclua os dados às pressas. Seus" suspeitos de erros "podem ser dados incorruptos; seu uso poderia realmente ajudar e não prejudicar sua análise.

usεr11852
fonte
11
Um ponto pequeno, mas muito possivelmente um que poderia morder, especialmente se sua documentação for lida ou citada de maneira descuidada: Aconselho fortemente contra a notação para mediana, dado seu uso muito comum como média. Estranhamente, ou não, nenhuma notação parece comumente usada para mediana, mas quase tudo seria melhor que , por exemplo, med ou . ˉ x ˜ xx¯x¯x~
Nick Cox
11
+1 para uma forte ênfase no valor de resumos robustos. Veja também outros tópicos neste site.
Nick Cox
11
@NickCox: Bom ponto, eu não sei o que estava pensando em primeiro lugar. Mudou agora. Obrigado pela sugestão.
precisa saber é o seguinte
0

Aponte o primeiro - pode valer a pena voltar à cor rgb. Raramente é bom jogar fora os dados, e a magnitude do vetor rgb não é a única maneira de representar o brilho - o brilho percebido é diferente, assim como o valor no HSV.

Mas colocando isso de lado e lidando com os dados que você possui, você já pensou em formar isso como um problema de classificação em vez de modelar e fazer algum aprendizado de máquina? Você tem uma entrada, que é um vetor com 12 valores reais (as leituras de brilho). Você tem uma saída, que é um vetor de 12 valores binários (1 = inlier, 0 = outlier). Obtenha vários conjuntos de leitura de brilho e identifique-os manualmente, mostrando qual leitura de brilho em cada conjunto é uma inlier / outlier. Algo assim:

x1 = {212,0, 209,6, 211,5, , 213,0}, y1 = {1,0,1, , 1}...

x2 = {208,1, 207,9, 211,2, , 208,2}, y2 = {1,1,0, , 1}...

x3 = {223,4, 222,9, 222,8, , 223,0}, y3 = {1,1,1, , 1}...

Em seguida, execute o lote inteiro através de um classificador de algum tipo:

  • Você pode usar um único classificador que produz 12 valores binários diferentes - uma rede neural permite configurar isso com bastante facilidade.
  • Ou você pode usar um classificador binário padrão (por exemplo, SVMlite ) e treinar 12 modelos diferentes, um classificando se cada elemento da saída é um inlier / outlier.

E pronto! Não é preciso se preocupar em tentar encontrar a 'regra' que separa inliers de outliers. Basta obter alguns conjuntos de dados que sejam sensatos e deixar a máquina fazer isso por você :)

~~~

EDIT: Aliás, o método proposto, onde você encaixa iterativamente um gaussiano e depois classifica cada amostra a mais de 2 desvios-padrão como um outlier, parece muito com um algoritmo de maximização de expectativa. Algo assim:

  • Um único componente gaussiano (modelando os inliers)
  • Um componente de plano de fundo uniforme (os valores extremos)
  • Alguma probabilidade anterior de cada um que depende de maneira não óbvia da largura do gaussiano (a regra 'classificar em 2 desvios padrão').
  • Classificação difícil na etapa da expectativa.

Se você seguir esse caminho, pode valer a pena pesquisar nos algoritmos EM e verificar quais suposições você está construindo em seu modelo.

Pat
fonte