2017-01-08 3 views
2

J'utilise actuellement Python pour comparer deux ensembles de données différents (xDAT et yDAT) qui sont composés de 240 mesures de distance prises sur une certaine durée. Cependant, l'ensemble de données xDAT est compensé par une quantité non linéaire. Cette quantité non linéaire est égale à la largeur d'un milieu dynamique dépendant du temps, que j'appelle le niveau-A. Plus précisément, xDAT mesure de l'origine au sommet de niveau-A, tandis que yDAT mesure de l'origine au bas du niveau-A. Voir le diagramme suivant:ajustement de courbe et estimation de paramètre en Python

enter image description here

Afin de comparer les deux courbes, je dois fist appliquer une correction à XDAT pour compenser son décalage (la largeur du niveau A). Pour l'instant, j'ai joué avec différents degrés de numpy.polyfit. I.e.:

coefs = np.polynomial.polynomial.polyfit(xDAT, yDAT, 5) 
polyEST=[] 
for i in range(0,len(x-DAT)): 
    polyEST.append(coefs[0] + coefs[1]*xDAT[i] + coefs[2]*pow(xDAT[i],2) + coefs[3]*pow(xDAT[i],3) + coefs[4]*pow(xDAT[i],4) + coefs[5]*pow(xDAT[i],5)) 

Le problème avec l'utilisation de cette méthode est que lorsque je conspire Polyest (qui est la version corrigée de XDAT), l'intrigue ne correspond toujours pas la tendance de yDAT et reste compensée. S'il vous plaît voir la figure ci-dessous, où XDAT = bleu, corrigé XDAT = rouge, et yDAT = vert:

enter image description here

Idéalement, le XDAT corrigé devrait rester encore plus bruyant que le yDAT, mais l'oscillation générale et tendance les courbes devraient correspondre.

J'apprécierais grandement de mettre en œuvre une technique différente d'ajustement de courbe et d'estimation de paramètre afin de corriger le décalage non linéaire causé par le niveau-A.

Merci.

+0

Je ne pense pas que ce que vous essayez de faire soit clair. Vous appelez 'polyfit' comme si' xDAT' et 'yDAT' sont les coordonnées' x'- et 'y'- d'un seul ensemble de points d'échantillonnage, cependant, la description et l'intrigue de votre problème suggèrent qu'ils ne sont pas liés en tant que tels. – Stelios

+0

Par votre description le décalage est par une constante. L'utilisation d'un polynôme de degré> 0 semble être la mauvaise approche. De plus, à partir de votre intrigue, xDat et yDat ne semblent pas alignés, c'est-à-dire que xDat n'est clairement pas yDat +/- une constante, il semble également être "retourné" ou déphasé. –

+0

Merci Stelios. Dans l'introduction, j'ai mentionné que xDAT et yDAT sont des ensembles de données de 240 points. Chacun de ces points correspond à une mesure à un moment précis ... les deux ensembles de données ont été mesurés à intervalles de temps égaux. J'ai utilisé polyfit pour dériver un polynôme qui décrit la différence entre les deux ensembles de données, et j'ai ensuite utilisé ce polynôme pour corriger le décalage observé dans xDAT.Je suis convaincu qu'il existe une méthode plus appropriée pour corriger le décalage de niveau A observé dans xDAT plutôt que np.polyfit. – LexStJ

Répondre

0

La réponse dépend de ce qu'est le niveau A. Si elle est indépendante, la première ligne doit être quelque chose comme

coefs = np.polynomial.polynomial.polyfit(numpy.arange(xDAT.size), yDAT-xDAT, 5)

Cela donnera un polyfit d'un A indépendant dessiné, puis la correction x doit être

xDAT+np.polynomial.polynomial.polyval(numpy.arange(xDAT.size),coefs)

Si A dépend des variables (comme il semble être), vous ne voulez pas polyfit, car cela ne fait que régresser la partie réelle de l'oscillation (la partie «ressort» d'un système ressort-amortisseur), ce qui explique pourquoi votre corrected_xDat est en phase avec xDat au lieu de yDat. Pour régresser quelque chose comme ça, vous devrez utiliser des transformées de Fourier (ce qui n'est pas ma spécialité).