Em outras partes deste segmento, o usuário1149913 fornece ótimos conselhos (define um modelo probabilístico) e codifica uma abordagem poderosa (estimativa EM). Ainda há duas questões a serem abordadas:
Como lidar com desvios do modelo probabilístico (que são muito evidentes nos dados de 2011-2012 e um tanto evidentes nas ondulações dos pontos menos inclinados).
Como identificar bons valores iniciais para o algoritmo EM (ou qualquer outro algoritmo).
Para resolver o problema nº 2, considere usar uma transformação Hough . Este é um algoritmo de detecção de recurso que, para encontrar trechos lineares de recursos, pode ser computado com eficiência como uma transformação de Radon .
xyx , yna transformação Hough. Quando os recursos no gráfico original caem ao longo de uma linha comum, ou quase o suficiente para um, as coleções de curvas que eles produzem na transformação Hough tendem a ter uma interseção comum correspondente a essa linha comum. Ao encontrar esses pontos de maior intensidade na transformação de Hough, podemos ler boas soluções para o problema original.
Para começar com esses dados, recortei primeiro o material auxiliar (eixos, marcas de escala e rótulos) e, na medida certa, recortei os pontos obviamente periféricos no canto inferior direito e salpiquei ao longo do eixo inferior. (Quando esse material não é cortado, o procedimento ainda funciona bem, mas também detecta os eixos, os quadros, as seqüências lineares de ticks, as sequências lineares de etiquetas e até os pontos esporadicamente no eixo inferior!)
img = Import["http://i.stack.imgur.com/SkEm3.png"]
i = ColorNegate[Binarize[img]]
crop2 = ImageCrop[ImageCrop[i, {694, 531}, {Left, Bottom}], {565, 467}, {Right, Top}]
(Este e o restante do código estão no Mathematica .)
Para cada ponto nesta imagem corresponde uma faixa estreita de curvas na transformação Hough, visível aqui. São ondas senoidais:
hough2 = Radon[crop2, Method -> "Hough"] // ImageAdjust
Isso torna visualmente manifesto o sentido em que a questão é um problema de agrupamento de linhas : a transformação Hough a reduz a um problema de agrupamento de pontos , ao qual podemos aplicar qualquer método de agrupamento que desejar.
Nesse caso, o armazenamento em cluster é tão claro que o pós-processamento simples da transformação Hough foi suficiente. Para identificar os locais de maior intensidade na transformação, aumentei o contraste e embaçei a transformação em um raio de cerca de 1%: é comparável aos diâmetros dos pontos de plotagem na imagem original.
blur = ImageAdjust[Blur[ImageAdjust[hough2, {1, 0}], 8]]
Limiar o resultado reduziu-o a duas pequenas bolhas cujos centróides identificam razoavelmente os pontos de maior intensidade: estimam as linhas ajustadas.
comp = MorphologicalComponents[blur, 0.777]) // Colorize
0,777
O lado esquerdo da imagem corresponde a uma direção de 0 graus (horizontal) e, conforme olhamos da esquerda para a direita, esse ângulo aumenta linearmente para 180 graus. Interpolando, calculo que os dois blobs estão centrados em 19 e 57,1 graus, respectivamente. Também podemos ler as interceptações nas posições verticais dos blobs. Esta informação produz os ajustes iniciais:
width = ImageDimensions[blur][[1]];
slopes = Module[{x, y, z}, ComponentMeasurements[comp, "Centroid"] /.
Rule[x_, {y_, z_}] :> Round[((y - 1/2)/(width - 1)) 180., 0.1]
]
{19., 57.1}
De maneira semelhante, é possível calcular as interceptações correspondentes a essas pistas, dando os seguintes ajustes:
(A linha vermelha corresponde ao pequeno ponto rosa na imagem anterior e a linha azul corresponde ao blob aqua maior.)
Em grande parte, essa abordagem lidou automaticamente com a primeira questão: os desvios da linearidade eliminam os pontos de maior intensidade, mas normalmente não os alteram muito. Pontos francamente afastados contribuirão com ruído de baixo nível em toda a transformação Hough, que desaparecerá durante os procedimentos de pós-processamento.
Nesse ponto, é possível fornecer essas estimativas como valores iniciais para o algoritmo EM ou como um minimizador de probabilidade (que, dadas boas estimativas, convergirá rapidamente). Melhor, porém, seria usar um estimador de regressão robusto, como mínimos quadrados ponderados iterativamente . É capaz de fornecer um peso de regressão para cada ponto. Pesos baixos indicam que um ponto não "pertence" a uma linha. Explore esses pesos, se desejado, para atribuir cada ponto à sua linha correta. Depois de classificar os pontos, você pode usar mínimos quadrados comuns (ou qualquer outro procedimento de regressão) separadamente nos dois grupos de pontos.