L'estimation petit temps de décalage entre les deux séries
J'ai deux fois de la série, et je soupçonne qu'il y a un décalage entre eux, et je veux l'estimation de ce temps de décalage.
Cette question a été posée dans:
Trouver la différence de phase entre les deux (inharmoniques) des ondes et trouver le temps de décalage entre les deux formes d'onde mais dans mon cas, le décalage est plus petite que la résolution des données. par exemple, les données sont disponibles à l'heure de la résolution, et le décalage temporel est à seulement quelques minutes(voir l'image).
La cause de cela est que l'enregistreur de données utilisées pour mesurer les valeurs de la série a quelques minutes de décalage en son temps.
Des algorithmes qui peuvent estimer cette maj, de préférence sans l'aide de l'interpolation?
- (+1) Belle question. D'intérêt, pourquoi êtes-vous l'interdiction de l'utilisation de l'interpolation?
- j'ai juste pensé que si vous voulez estimer le passage à la haute précision alors vous avez besoin pour interpoler à une très haute résolution. et depuis j'ai beaucoup de données, je voulais éviter cela.
- Il me semble que les séries de fourier peut être utile si vos données sont à peu près périodiques...
- Avez-vous une sorte de synchronisation des événements qui se produisent dans les deux temps de la série?
- Si les données ressemble à rien dans le graphique, il est très périodique et une FFT pourrais vous montrer le changement. Bien que la FFT est elle-même une interpolation...avez-vous un exemple de données pour nous de test, ce qui est intéressant.7
- Que les données n'est en fait pas très périodique. C'est la mi-périodique (périodicité implique que la dérivée de l'une des extrémités du domaine est le même que bien), mais il pourrait travailler sur OK.
- J'ai vu FFT donner des résultats raisonnables pour beaucoup plus laid de données.
- Sûr qu'il peut. Il n'y a aucune raison de croire qu'il devrait a priori (pour autant que je suis au courant). De toute façon, n'hésitez pas à jeter un coup d'oeil à la FFT la solution que j'ai posté ci-dessous (vous peut-être plus familier avec ce genre de choses que je suis). Je serais heureux de le convertir à une communauté wiki si d'autres voulaient contribuer et de faire mieux.
- Vous pouvez la croix-corréler les deux séries de données à l'aide de changements près de la suspicion de décalage de la valeur; la maximisation de la corrélation croisée va vous donner le temps de décalage. Depuis que vous êtes à la recherche d'un changement de fois plus petite que la résolution de votre écran, une accélération continue (sous-échantillonnage) méthode de corrélation est nécessaire.
- non, les données de rayonnement solaire et de la prévision du rayonnement solaire, donc il n'y a pas d'événements que simultanément l'effet bothseries(si j'ai bien compris votre question).
- si vous me donnez votre adresse e-mail malade vous envoyer les données
- La figure ci-contre est une journée claire et la série a l'air très corrélés et lisse, mais pour la plupart des jours de l'année, les données sont des choses très différentes, les prévisions sont bien pire, et la série est moins lisse.
Vous devez vous connecter pour publier un commentaire.
C'est un problème intéressant. Voici une tentative de solution partielle à l'aide de transformées de fourier. Elle s'appuie sur les données modérément périodique. Je ne suis pas sûr si elle va travailler avec vos données (où les produits dérivés dans les points de terminaison ne semblent pas correspondre).
Une rapide inspection de la sortie imprimée montre que les fréquences les plus
puissance (N=1,N=2) donner des estimations raisonnables, N=3 est OK aussi, si vous regardez la
valeur absolue (np.absolue), même si je suis à une perte d'expliquer pourquoi ce serait.
Peut-être quelqu'un de plus en plus familiers avec les mathématiques peuvent le prendre à partir de là pour donner une meilleure réponse...
L'un des liens que vous avez fourni a la bonne idée (en fait, je suis en train de faire à peu près la même chose ici)
Cela a le résultat suivant:
Il pourrait être nécessaire de vérifier
Noter que le argmax() de la corrélation indique la position de l'alignement, il doit être multipliée par la longueur de
b-a = 10-0 = 10
et N pour obtenir la valeur réelle.La vérification de la source de corréler Source il n'est pas évident que la fonction importée à partir d'sigtools se comporte. Pour les grands ensembles de données circulaire de corrélation (via les transformées de Fourier Rapides) est beaucoup plus rapide que la simple méthode. Je suppose que c'est ce qui est mis en œuvre dans sigtools mais je ne peux pas dire pour sûr. Recherchez le fichier dans mon python2.7 dossier retourné la compilation C pyd fichier.
shift = (x[1]-x[0])/4.0
. C'est un test réaliste en comparaison avec l'OP de la demande ("le temps de déplacement est plus petite que la résolution des données")C'est un très intéressant problème. A l'origine, j'allais suggérer une corrélation croisée basée sur une solution similaire à user948652 de l'. Cependant, à partir de la description du problème, il y a deux problèmes avec cette solution:
Comme un résultat de ces deux questions, je pense que l'application directement de la corrélation croisée solution est susceptible d'augmenter votre temps de décalage, en particulier sur les jours où le prédites et les valeurs mesurées ont une très faible corrélation les uns aux autres.
Dans mon commentaire ci-dessus, j'ai demandé si vous aviez tous les événements qui se produisent dans les deux séries, et vous avez dit que vous n'avez pas. Toutefois, en fonction de votre domaine, je pense que vous avez effectivement deux:
Même si le reste du signal est mal corrélée, le lever et le coucher du soleil doit être un peu corrélés, car ils vont augmenter de façon monotone à partir de /diminution de la nuit le temps de référence. Alors, voici une solution possible, sur la base de ces deux événements, qui devrait à la fois de minimiser l'interpolation nécessaire, et de ne pas être dépendant sur la corrélation croisée des mal-signaux corrélés.
1. Trouver approximative de Lever/Coucher du soleil
Cela devrait être assez facile, il suffit de prendre le premier et le dernier points de données qui sont plus élevés que la nuit, le plat de ligne, d'étiquette et de ceux de l'approximatif, le lever et le coucher du soleil. Puis, je me concentrerais sur les données, ainsi que les points immédiatement sur chaque côté, c'est à dire:
Il y a plusieurs façons de mettre en œuvre
get_sunrise()
etget_sunset()
selon le degré de rigueur dont vous avez besoin dans votre analyse. Je voudrais utilisernumpy.diff
, seuil à une valeur spécifique, et de prendre le premier et le dernier points au-dessus de cette valeur. Vous pouvez aussi lire la nuit des données à partir d'un grand nombre de fichiers, calculer la moyenne & l'écart type, et les premier et dernier points de données qui dépassent, disons,0.5 * st_dev
de la nuit des données en temps. Vous pouvez également faire une sorte de cluster à base de modèle d'appariement, en particulier si les différentes classes de la journée (c'est à dire, ensoleillé vs en partie nuageux vs très nuageux) ont fortement stéréotypée lever du soleil/coucher du soleil événements.2. Rééchantillonnage Des Données
Je ne pense pas qu'il y est de toute façon de résoudre ce problème sans interpolation. Je voudrais utiliser le ré-échantillonner les données à un taux d'échantillonnage supérieur à la maj. Si le décalage est à l'échelle de minutes, puis suréchantillonner à 1 minute ou 30 secondes.
Alternativement, on peut utiliser une spline cubique pour interpoler les données (voir ici).
3. Gaussien De Convolution
Puisqu'il y a quelques interpolation, alors nous ne savons pas quelle est la réelle lever et coucher du soleil ont été prédites. Donc, nous pouvons convolution du signal avec une gaussienne, de représenter cette incertitude.
4. Corrélation Croisée
L'utilisation de la corrélation croisée de la méthode dans user948652 la réponse à obtenir le time shift.
Il y a beaucoup de questions sans réponse dans cette méthode qui exigerait l'examen et l'expérimentation avec les données de manière plus spécifique à ongles vers le bas, comme quelle est la meilleure méthode pour identifier le lever du soleil/coucher du soleil, quelle est la largeur de la fenêtre gaussienne devrait être, etc. Mais c'est la façon dont je commence à attaquer le problème.
Bonne chance!
En effet, le problème intéressant, mais pas encore de réponse satisfaisante. Essayons de changer cela...
Vous dites que vous préférez ne pas utiliser l'interpolation, mais, ce que je comprends de votre commentaire, ce que vous avez vraiment dire, c'est que vous voulez éviter de suréchantillonnage à une résolution plus élevée. Une solution de base permet l'utilisation d'une méthode des moindres carrés avec une interpolation linéaire de la fonction, mais sans suréchantillonnage à une résolution plus élevée:
Un exemple d'exécution donne une assez précise de la solution:
Si l'on inclut le bruit dans le décalée Y:
On obtient quelque peu des résultats moins précis:
L'exactitude en vertu de la présence de bruit améliore lorsque plus de données seront disponibles, par exemple avec:
Un résultat typique est:
J'ai utilisé avec succès (dans le canal awgn) appariés filtre approche, qui donne de l'énergie de pointe m[n] à l'indice n; puis le montage d'un 2ème degré polynôme f(n) pour m[n-1], m[n], m[n+1] et de trouver le minimum par définition de f'(n)==0.
La réponse n'est pas nécessairement absolument linéaire, surtout si l'autocorrélation du signal n'est pas s'évanouir à m[n-1], m[n+1].
Optimiser la meilleure solution
Pour les contraintes, à savoir que la solution est à phase décalée par une petite quantité de moins que la méthode d'échantillonnage, une simple descente du simplexe algorithme fonctionne bien. J'ai modifié l'exemple de problème de @mgilson pour montrer comment faire cela. Notez que cette solution est robuste, en ce qu'elle peut gérer le bruit.
De la fonction d'erreur: Il y a peut être plus optimale des choses à optimiser, mais cela fonctionne étonnamment bien:
Qui est, de minimiser la distance Euclidienne entre les deux courbes en seulement ajuster l'axe des x (phase).
Un exemple d'exécution donne: