J'ai une liste de x, y points idéaux, et une deuxième liste de x, y points mesurés. Ce dernier a un certain décalage et un peu de bruit. J'essaye d '"ajuster" ce dernier à celui-là. Donc, extraire le décalage x, y de ce dernier par rapport au premier.Optimisation par traduction pour mapper un x, y ensemble de points sur un autre
Je suis quelques exemples de scipy.optimize.leastsq
, mais j'ai du mal à le faire fonctionner. Voici mon code:
import random
import numpy as np
from scipy import optimize
# Generate fake data. Goal: Get back dx=0.1, dy=0.2 at the end of this exercise
dx = 0.1
dy = 0.2
# "Actual" (ideal) data.
xa = np.array([0,0,0,1,1,1])
ya = np.array([0,1,2,0,1,2])
# "Measured" (non-ideal) data. Add the offset and some randomness.
xm = map(lambda x: x + dx + random.uniform(0,0.01), xa)
ym = map(lambda y: y + dy + random.uniform(0,0.01), ya)
# Plot each
plt.figure()
plt.plot(xa, ya, 'b.', xm, ym, 'r.')
# The error function.
#
# Args:
# translations: A list of xy tuples, each xy tuple holding the xy offset
# between 'coords' and the ideal positions.
# coords: A list of xy tuples, each xy tuple holding the measured (non-ideal)
# coordinates.
def errfunc(translations, coords):
sum = 0
for t, xy in zip(translations, coords):
dx = t[0] + xy[0]
dy = t[1] + xy[1]
sum += np.sqrt(dx**2 + dy**2)
return sum
translations, coords = [], []
for xxa, yya, xxm, yym in zip(xa, ya, xm, ym):
t = (xxm-xxa, yym-yya)
c = (xxm, yym)
translations.append(t)
coords.append(c)
translation_guess = [0.05, 0.1]
out = optimize.leastsq(errfunc, translation_guess, args=(translations, coords), full_output=1)
print out
Je reçois l'erreur:
errfunc() takes exactly 2 arguments (3 given)"
Je ne sais pas pourquoi il dit 3 arguments que je ne lui ai donné deux. Quelqu'un peut-il aider?
====
RÉPONSE:
Je pensais à ce mal. Tout ce que j'ai à faire est de prendre la moyenne des dx et dy - cela donne le bon résultat.
n = xa.shape[0]
dx = -np.sum(xa - xm)/n
dy = -np.sum(ya - ym)/n
print dx, dy
Argh, Python Je vous maudis. Eh bien, le changer en def errfunc (translation_guess, translations, coords): ... ne fonctionne pas - et je ne vois pas non plus un moyen d'utiliser réellement translation_guess à l'intérieur de errfunc. Des pointeurs? Avoir un échantillon de code de travail? – dnh37
Je n'ai aucun code de travail en utilisant ceci, mais je suis heureux d'essayer d'aider.Je ne pense pas que je comprends tout à fait ce que votre fonction essaie de faire. En haut, vous dites que vous cherchez le décalage, mais vous décrivez les «traductions» comme étant le décalage. Pouvez-vous clarifier? – Noam
Bien sûr. Tracez simplement les lignes "plt.plot" incluses dans le code. Vous verrez des points bleus et des points rouges. Les points bleus sont exacts, les points rouges ont une traduction et du bruit. (La translation est commune à tous les points rouges - dans ce cas, dx = 0.1, dy = 0.2 Le bruit est spécifique à chaque point rouge.) Au final, j'essaie de retrouver le dx = 0.1, dy = 0.2 que j'ai artificiellement mis dans les données au début. Cela a-t-il du sens? Donc, je peux savoir à quel point les points rouges sont décalés par rapport aux points bleus. – dnh37