Eu tenho um conjunto de dados que não são ordenados de maneira específica, mas quando plotados claramente têm duas tendências distintas. Uma regressão linear simples não seria realmente adequada aqui devido à clara distinção entre as duas séries. Existe uma maneira simples de obter as duas linhas de tendência lineares independentes?
Para constar, estou usando Python e estou razoavelmente confortável com programação e análise de dados, incluindo aprendizado de máquina, mas estou disposto a pular para R se for absolutamente necessário.
time-series
python
curve-fitting
jbbiomed
fonte
fonte
Respostas:
Para resolver seu problema, uma boa abordagem é definir um modelo probabilístico que corresponda às suposições sobre o seu conjunto de dados. No seu caso, você provavelmente deseja uma mistura de modelos de regressão linear. Você pode criar um modelo de "mistura de regressores" semelhante a um modelo de mistura gaussiano associando diferentes pontos de dados a diferentes componentes de mistura.
Eu incluí algum código para você começar. O código implementa um algoritmo EM para uma mistura de dois regressores (deve ser relativamente fácil estender para misturas maiores). O código parece ser bastante robusto para conjuntos de dados aleatórios. No entanto, diferentemente da regressão linear, os modelos de mistura têm objetivos não convexos; portanto, para um conjunto de dados real, você pode precisar executar algumas tentativas com diferentes pontos de partida aleatórios.
fonte
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 .
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!)
(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:
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.
Limiar o resultado reduziu-o a duas pequenas bolhas cujos centróides identificam razoavelmente os pontos de maior intensidade: estimam as linhas ajustadas.
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:
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.
fonte
rotation
, que foi definida como zero originalmente e, portanto, não fez diferença.Encontrei esta questão vinculada a outra questão . Na verdade, eu fiz pesquisas acadêmicas sobre esse tipo de problema. Por favor, verifique a minha resposta "Menos raiz quadrada". Um método de ajuste com vários mínimos para obter mais detalhes.
A abordagem baseada em transformação de Hough da whuber's é uma solução muito boa para cenários simples como o que você deu. Trabalhei em cenários com dados mais complexos, como este:
Meus co-autores e eu denotamos isso como um problema de "associação de dados". Quando você tenta resolvê-lo, o principal problema geralmente é combinatório devido à quantidade exponencial de combinações de dados possíveis.
Temos uma publicação " Misturas sobrepostas de processos gaussianos para o problema de associação de dados ", onde abordamos o problema geral das curvas N com uma técnica iterativa, obtendo resultados muito bons. Você pode encontrar o código Matlab vinculado no documento.
[Atualização] Uma implementação em Python da técnica OMGP pode ser encontrada na biblioteca GPClust .
Tenho outro artigo em que relaxamos o problema para obter um problema de otimização convexa, mas ele ainda não foi aceito para publicação. É específico para 2 curvas, por isso funcionaria perfeitamente em seus dados. Deixe-me saber se você está interessado.
fonte
user1149913 tem uma excelente resposta (+1), mas parece-me que sua coleta de dados desmoronou no final de 2011; portanto, você teria que cortar essa parte dos dados e ainda executar algumas vezes com aleatoriamente diferentes coeficientes iniciais para ver o que você recebe.
Uma maneira simples de fazer as coisas seria separar seus dados em dois conjuntos por olho e, em seguida, usar qualquer técnica de modelo linear com a qual você esteja acostumado. Em R, seria a
lm
função.Ou ajuste duas linhas a olho nu. Em R você usaria
abline
para fazer isso.Os dados são confusos, apresentam discrepâncias e desmoronam no final, mas os olhos têm duas linhas bastante óbvias, então não tenho certeza se um método sofisticado vale a pena.
fonte