Tengo un conjunto de datos que no está ordenado de ninguna manera en particular, pero cuando se traza claramente tiene dos tendencias distintas. Una regresión lineal simple realmente no sería adecuada aquí debido a la clara distinción entre las dos series. ¿Hay una manera simple de obtener las dos líneas de tendencia lineales independientes?
Para el registro, estoy usando Python y estoy bastante cómodo con la programación y el análisis de datos, incluido el aprendizaje automático, pero estoy dispuesto a saltar a R si es absolutamente necesario.
time-series
python
curve-fitting
jbbiomed
fuente
fuente
Respuestas:
Para resolver su problema, un buen enfoque es definir un modelo probabilístico que coincida con los supuestos sobre su conjunto de datos. En su caso, probablemente desee una mezcla de modelos de regresión lineal. Puede crear un modelo de "mezcla de regresores" similar a un modelo de mezcla gaussiana asociando diferentes puntos de datos con diferentes componentes de la mezcla.
He incluido un código para que comiences. El código implementa un algoritmo EM para una mezcla de dos regresores (debería ser relativamente fácil de extender a mezclas más grandes). El código parece ser bastante robusto para conjuntos de datos aleatorios. Sin embargo, a diferencia de la regresión lineal, los modelos de mezcla tienen objetivos no convexos, por lo que para un conjunto de datos real, es posible que deba ejecutar algunas pruebas con diferentes puntos de partida aleatorios.
fuente
En otra parte de este hilo, user1149913 proporciona excelentes consejos (define un modelo probabilístico) y codifica un enfoque poderoso (estimación EM). Quedan dos cuestiones por abordar:
Cómo hacer frente a las desviaciones del modelo probabilístico (que son muy evidentes en los datos de 2011-2012 y algo evidentes en las ondulaciones de los puntos menos inclinados).
Cómo identificar buenos valores iniciales para el algoritmo EM (o cualquier otro algoritmo).
Para abordar el n. ° 2, considere usar una transformación Hough . Este es un algoritmo de detección de características que, para encontrar extensiones lineales de características, se puede calcular de manera eficiente como una transformación de Radón .
Conceptualmente, la transformación de Hough representa conjuntos de líneas. Una línea en el plano se puede parametrizar por su pendiente, , y su distancia, , desde un origen fijo. Un punto en este sistema de coordenadas tanto designa una sola línea. Cada punto en el diagrama original determina un lápiz de líneas que pasan por ese punto: este lápiz aparece como una curva en la transformación de Hough. Cuando las entidades en el diagrama original caen a lo largo de una línea común, o lo suficientemente cerca de una, entonces las colecciones de curvas que producen en la transformación de Hough tienden a tener una intersección común correspondiente a esa línea común. Al encontrar estos puntos de mayor intensidad en la transformación de Hough, podemos leer buenas soluciones al problema original.y x , yx y x,y
Para comenzar con estos datos, primero recorté los elementos auxiliares (ejes, marcas y etiquetas) y, por si acaso, recorté los puntos obviamente externos en la parte inferior derecha y los rocié a lo largo del eje inferior. (Cuando ese material no se recorta, el procedimiento aún funciona bien, ¡pero también detecta los ejes, los marcos, las secuencias lineales de ticks, las secuencias lineales de etiquetas e incluso los puntos que se encuentran esporádicamente en el eje inferior!)
(Este y el resto del código están en Mathematica ).
A cada punto de esta imagen corresponde un rango estrecho de curvas en la transformación de Hough, visible aquí. Son ondas sinusoidales:
Esto hace que se manifieste visualmente el sentido en que la pregunta es un problema de agrupación de líneas : la transformación de Hough lo reduce a un problema de agrupación de puntos , al que podemos aplicar cualquier método de agrupación que nos guste.
En este caso, la agrupación es tan clara que basta el simple procesamiento posterior de la transformación de Hough. Para identificar ubicaciones de mayor intensidad en la transformación, aumenté el contraste y difuminé la transformación en un radio de aproximadamente 1%: eso es comparable a los diámetros de los puntos de la trama en la imagen original.
Limitar el resultado lo redujo a dos pequeñas burbujas cuyos centroides identifican razonablemente los puntos de mayor intensidad: estos estiman las líneas ajustadas.
(El umbral de se encontró empíricamente: produce solo dos regiones y la más pequeña de las dos es casi lo más pequeña posible).0.777
El lado izquierdo de la imagen corresponde a una dirección de 0 grados (horizontal) y, al mirar de izquierda a derecha, ese ángulo aumenta linealmente a 180 grados. Interpolando, calculo que los dos blobs están centrados a 19 y 57.1 grados, respectivamente. También podemos leer las intersecciones de las posiciones verticales de los blobs. Esta información produce los ajustes iniciales:
De manera similar, uno puede calcular las intersecciones correspondientes a estas pendientes, dando estos ajustes:
(La línea roja corresponde al pequeño punto rosa en la imagen anterior y la línea azul corresponde a la gota de aguamarina más grande).
En gran medida, este enfoque ha abordado automáticamente el primer problema: las desviaciones de la linealidad difuminan los puntos de mayor intensidad, pero generalmente no los cambian demasiado. Los puntos periféricos francos contribuirán con el ruido de bajo nivel a lo largo de la transformación de Hough, que desaparecerá durante los procedimientos de postprocesamiento.
En este punto, se pueden proporcionar estas estimaciones como valores iniciales para el algoritmo EM o para un minimizador de probabilidad (que, dadas buenas estimaciones, convergerán rápidamente). Sin embargo, sería mejor utilizar un estimador de regresión robusto, como los mínimos cuadrados reponderados de forma iterativa . Es capaz de proporcionar un peso de regresión a cada punto. Los pesos bajos indican que un punto no "pertenece" a una línea. Explote estos pesos, si lo desea, para asignar cada punto a su línea adecuada. Luego, una vez clasificados los puntos, puede usar mínimos cuadrados ordinarios (o cualquier otro procedimiento de regresión) por separado en los dos grupos de puntos.
fuente
rotation
, que originalmente se estableció en cero y, por lo tanto, no hizo ninguna diferencia.Encontré esta pregunta vinculada a otra pregunta . Realmente hice investigación académica sobre este tipo de problema. Por favor, compruebe mi respuesta "¿Raíz cuadrada mínima"? Un método de ajuste con mínimos mínimos para más detalles.
El enfoque basado en la transformación Hough de Whuber es una muy buena solución para escenarios simples como el que usted proporcionó. Trabajé en escenarios con datos más complejos, como este:
Mis coautores y yo denotamos esto como un problema de "asociación de datos". Cuando intenta resolverlo, el problema principal suele ser combinatorio debido a la cantidad exponencial de posibles combinaciones de datos.
Tenemos una publicación " Mezclas superpuestas de procesos gaussianos para el problema de asociación de datos " donde abordamos el problema general de las curvas N con una técnica iterativa, dando muy buenos resultados. Puede encontrar el código de Matlab vinculado en el documento.
[Actualización] Una implementación de Python de la técnica OMGP se puede encontrar en la biblioteca GPClust .
Tengo otro documento en el que relajamos el problema para obtener un problema de optimización convexo, pero aún no se ha aceptado su publicación. Es específico para 2 curvas, por lo que funcionaría perfectamente en sus datos. Déjame saber si estás interesado.
fuente
user1149913 tiene una excelente respuesta (+1), pero me parece que su recopilación de datos se desmoronó a fines de 2011, por lo que tendría que cortar esa parte de sus datos y luego ejecutar las cosas varias veces con diferentes aleatorias coeficientes iniciales para ver lo que obtienes.
Una manera sencilla de hacer las cosas sería separar los datos en dos conjuntos a simple vista, luego usar cualquier técnica de modelo lineal a la que esté acostumbrado. En R, sería la
lm
función.O ajuste dos líneas a simple vista. En R usarías
abline
para hacer esto.Los datos están confusos, tienen valores atípicos y se desmoronan al final, pero a simple vista tiene dos líneas bastante obvias, por lo que no estoy seguro de que un método elegante valga la pena.
fuente