Questa domanda è correlata al libro "ricette numeriche in C++", quindi sarà riservata alle persone che ne conoscono un po 'oltre a ottimizzazione multidimensionale.Ricette numeriche/Ricerca radice multidimensionale (utilizzando newt): Come minimizzare l'errore massimo
Sto scrivendo un programma che ha bisogno di cercare una radice multidimensionale e, per risolverlo, sto usando il metodo di ricerca della radice di newton multidimensionale, ovvero la procedura "newt".
Per chi è interessato ai dettagli, sto cercando di adattare un modello 3D deformabile a una vista steresocica di un oggetto, basata su alcuni punti funzione (punti funzione visti da due telecamere).
Per questo, sto usando la procedura di Newt con il seguente:
- 11 Parametri di ingresso: mio modello deformabile può essere modellata con 11 parametri (composto da 5 parametri geometrici e 6 deegres di libertà per la posizione dell'oggetto 3D):
- 14 Parametri di uscita per cui ho bisogno di trovare la radice: in base ai punti funzione identificati dalla telecamera e dato un set su "parametri di input", posso calcolare un set di distanze tra i punti caratteristica visti dalla fotocamera e il loro lo teorico cazione. Ho 7 di questi punti, quindi mi danno 14 parametri (7 distanze 2, poiché calcolo le distanze su entrambe le fotocamere)
Il mio problema è che ho più parametri di output (14) rispetto ai parametri di input (11): ogni volta che chiamo "newt", l'algoritmo converge sempre, tuttavia troverà una soluzione che minimizza quasi perfettamente gli 11 parametri di prima uscita, ma che ha molti errori sui 3 parametri rimanenti.
Tuttavia, desidero che gli errori siano suddivisi uniformemente tra i parametri di uscita.
Ho già provato gli approcci descritti di seguito:
- provare a combinare i parametri di uscita 14 in 11 parametri (per esempio, si prende la media di alcune distanze, invece di utilizzare entrambe le distanze). Tuttavia non sono soddisfatto al 100% con questo approccio
- Mix diverse soluzioni con il seguente principio:
- chiamata mnewt e memorizzare i trovato radice
- Modificare l'ordine del parametro 14 uscita
- Calling mnewt ancora e memorizzare il trovato radice
- calcolare una soluzione è la media delle due radici trovati
Qualcuno sa di un approccio più generico, in cui l'algoritmo di individuazione delle radici favorirebbe un errore suddiviso uniformemente tra i parametri di output, invece di favorire i primi parametri?
Perché non impostare una sola "metrica di distanza", ad es. somma delle distanze quadrate su tutti i 7 punti caratteristica, quindi eseguire una routine di ottimizzazione. Levenberg-Marquardt sembra giusto. –
L'ho già provato, ed è stato un fallimento. Se leggi l'ottimizzazione multidimensionale del libro NR, vedrai (e credo) che è una cattiva idea provare e trasformare una ricerca radice multidim in una ricerca minima (come da tuo suggerimento): finisci per provare a minimizzare una funzione che ha * lotti * di minimi locali e * lotti * di zone piatte in una direzione (cioè il derivato su un componente è nullo: un incubo per metodi newton) –
Tuttavia, cercherò di eseguire una minimizzazione intorno il punto di partenza dato da newt. Forse sarà meno incline a convergere verso un minimo locale falso. –