J'ai un ensemble de données qui n'est pas ordonné de manière particulière, mais qui présente clairement deux tendances distinctes. Une régression linéaire simple ne conviendrait pas vraiment ici à cause de la distinction claire entre les deux séries. Existe-t-il un moyen simple d’obtenir les deux courbes de tendance linéaires indépendantes?
Pour mémoire, j'utilise Python et je suis assez à l'aise avec la programmation et l'analyse des données, y compris l'apprentissage automatique, mais je suis prêt à passer à R si cela est absolument nécessaire.
time-series
python
curve-fitting
jbbiomed
la source
la source
Réponses:
Pour résoudre votre problème, une bonne approche consiste à définir un modèle probabiliste qui correspond aux hypothèses sur votre jeu de données. Dans votre cas, vous voulez probablement un mélange de modèles de régression linéaire. Vous pouvez créer un modèle de "mélange de régresseurs" similaire à un modèle de mélange gaussien en associant différents points de données à différentes composantes du mélange.
J'ai inclus du code pour vous aider à démarrer. Le code implémente un algorithme EM pour un mélange de deux régresseurs (il devrait être relativement facile de l'étendre à des mélanges plus volumineux). Le code semble être assez robuste pour les ensembles de données aléatoires. Toutefois, contrairement à la régression linéaire, les modèles de mélange ont des objectifs non convexes. Par conséquent, pour un jeu de données réel, vous devrez peut-être exécuter quelques essais avec différents points de départ aléatoires.
la source
Ailleurs dans ce fil, user1149913 fournit d'excellents conseils (définir un modèle probabiliste) et du code pour une approche puissante (estimation EM). Deux problèmes restent à résoudre:
Comment gérer les écarts par rapport au modèle probabiliste (ce qui est très évident dans les données de 2011-2012 et quelque peu évident dans les ondulations des points moins inclinés).
Comment identifier de bonnes valeurs de départ pour l'algorithme EM (ou tout autre algorithme).
Pour résoudre le problème n ° 2, utilisez une transformation de Hough . Il s'agit d'un algorithme de détection de caractéristiques qui, pour rechercher des étendues linéaires de caractéristiques, peut être efficacement calculé comme une transformation de Radon .
Pour commencer à utiliser ces données, j'ai d'abord découpé les éléments auxiliaires (axes, graduations et étiquettes) et, pour faire bonne mesure, découpé les points manifestement périphériques en bas à droite et saupoudrés le long de l'axe du bas. (Lorsque cette opération n'est pas supprimée, la procédure fonctionne toujours correctement, mais elle détecte également les axes, les images, les séquences linéaires de graduations, les séquences linéaires d'étiquettes et même les points situés sporadiquement sur l'axe inférieur!)
(Ceci et le reste du code sont dans Mathematica .)
A chaque point de cette image correspond une plage de courbes étroite dans la transformation de Hough, visible ici. Ce sont des ondes sinusoïdales:
Cela montre visuellement que la question est un problème de regroupement de lignes : la transformation de Hough la réduit à un problème de regroupement de points auquel nous pouvons appliquer n'importe quelle méthode de regroupement.
Dans ce cas, le regroupement est tellement clair qu'un simple post-traitement de la transformation de Hough a suffi. Pour identifier les emplacements de plus grande intensité dans la transformation, j'ai augmenté le contraste et rendu floue la transformation sur un rayon d'environ 1%: cela est comparable aux diamètres des points de tracé de l'image d'origine.
Seuil du résultat réduit à deux blobs minuscules dont les centroïdes identifient raisonnablement les points de plus grande intensité: ceux-ci estiment les lignes ajustées.
Le côté gauche de l'image correspond à une direction de 0 degré (horizontal) et, en regardant de gauche à droite, cet angle augmente linéairement jusqu'à 180 degrés. En interpolant, je calcule que les deux blobs sont centrés à 19 et 57,1 degrés, respectivement. Nous pouvons également lire les interceptions à partir des positions verticales des blobs. Cette information donne les ajustements initiaux:
De la même manière, on peut calculer les intersections correspondant à ces pentes, en donnant ces ajustements:
(La ligne rouge correspond au minuscule point rose de la photo précédente et la ligne bleue à la plus grande goutte aqua.)
Dans une large mesure, cette approche a automatiquement résolu le premier problème: les écarts par rapport à la linéarité effacent les points d'intensité maximale, mais ne les modifient généralement pas beaucoup. Franchement, les points périphériques contribueront au bruit de bas niveau tout au long de la transformation de Hough, qui disparaîtra au cours des procédures de post-traitement.
À ce stade, vous pouvez fournir ces estimations en tant que valeurs de départ pour l'algorithme EM ou pour un minimiseur de vraisemblance (qui, avec de bonnes estimations, convergeront rapidement). Cependant, il serait préférable d’utiliser un estimateur de régression robuste tel que les moindres carrés repondérés de manière itérative . Il est capable de fournir un poids de régression à chaque point. Des poids faibles indiquent qu'un point n'appartient pas à une ligne. Exploitez ces poids, si vous le souhaitez, pour affecter chaque point à la ligne appropriée. Ensuite, après avoir classé les points, vous pouvez utiliser les moindres carrés ordinaires (ou toute autre procédure de régression) séparément sur les deux groupes de points.
la source
rotation
, qui avait été fixée à zéro à l'origine et ne faisait donc aucune différence.J'ai trouvé cette question liée à une autre question . J'ai en fait fait des recherches universitaires sur ce genre de problème. S'il vous plaît vérifier ma réponse "racine carrée" montage? Une méthode d'adaptation avec plusieurs minima pour plus de détails.
L'approche basée sur la transformation de Hough de whuber est une très bonne solution pour les scénarios simples comme celui que vous avez donné. J'ai travaillé sur des scénarios avec des données plus complexes, telles que:
Mes co-auteurs et moi avons noté ce problème comme un problème d'association de données. Lorsque vous essayez de le résoudre, le problème principal est généralement combinatoire en raison de la quantité exponentielle de combinaisons de données possibles.
Nous avons une publication " Mélanges superposés de processus gaussiens pour le problème d'association de données " où nous avons abordé le problème général des courbes à N avec une technique itérative, donnant de très bons résultats. Vous pouvez trouver le code Matlab lié dans le document.
[Mise à jour] Une implémentation Python de la technique OMGP est disponible dans la bibliothèque GPClust .
J'ai un autre article dans lequel nous avons assoupli le problème afin d'obtenir un problème d'optimisation convexe, mais celui-ci n'a pas encore été accepté pour publication. Il est spécifique à 2 courbes, donc cela fonctionnerait parfaitement sur vos données. Fais moi savoir si tu es intéressé.
la source
user1149913 a une excellente réponse (+1), mais il me semble que votre collection de données s'est effondrée à la fin de 2011; il vous faudrait donc supprimer cette partie de vos données, puis exécuter plusieurs fois des choses avec différents aléatoires. coefficients de départ pour voir ce que vous obtenez.
Une façon simple de faire les choses serait de séparer vos données en deux ensembles à l’œil, puis d’utiliser la technique de modèle linéaire à laquelle vous êtes habitué. Dans R, ce serait la
lm
fonction.Ou adapter deux lignes à l'œil. En R, vous utiliseriez
abline
cela.Les données sont mélangées, ont des valeurs aberrantes et se défont à la fin. Pourtant, vous avez deux lignes assez évidentes. Par conséquent, je ne suis pas sûr qu'une méthode sophistiquée en vaille la peine.
la source