Ho una funzione compare_images(k, a, b)
che confronta due 2D-array a
e b
Come forzare passi più grandi sulle funzioni scipy.optimize?
All'interno del funcion, ho applicare un gaussian_filter
con sigma=k
-a
La mia idea è quella di stimare quanto devo per lisciare immagine a
in modo che esso per essere simile all'immagine b
il problema è la mia funzione compare_images
restituirà solo valori diversi se k
variazione è sopra 0.5
, e se lo faccio fmin(compare_images, init_guess, (a, b)
di solito rimane bloccata al valore init_guess
.
Credo che il problema è fmin
(e minimize
) tende a iniziare con piccoli passi, che nel mio caso si riprodurre il valore esatto stesso rendimento per compare_images
, e così il metodo pensa già trovato un minimo. Proverò solo un paio di volte.
C'è un modo per forzare fmin
o qualsiasi altra funzione di riduzione da scipy
per eseguire passi più grandi? O esiste un metodo più adatto alle mie esigenze?
MODIFICA: Ho trovato una soluzione temporanea. In primo luogo, come raccomandato, ho usato xtol=0.5
e superiore come argomento per fmin
. Anche in questo caso, ho ancora avuto alcuni problemi e alcune volte fmin
restituire init_guess
. Ho quindi creato un ciclo semplice in modo che se fmin == init_guess
, vorrei generare un altro, casuale init_guess
e riprovare.
È piuttosto lento, naturalmente, ma ora ho avuto modo di correre. Ci vorranno 20 ore circa per eseguirlo per tutti i miei dati, ma non avrò bisogno di farlo di nuovo.
In ogni caso, per spiegare meglio il problema per coloro che sono ancora interessati a trovare una soluzione migliore:
- Ho 2 immagini,
A
eB
, contenente alcuni dati scientifici. A
sembra alcuni punti con valore variabile (è una matrice di in cui ciascun punto valutati rappresenta cui si è verificato un evento ed è intensità)B
sembra un heatmap livellato (è la densità osservata di occorrenze)B
sembra proprio come se si fosse applicato un filtro gaussiano aA
con un po 'di rumore semi-casuale.- Siamo approssimati a
B
applicando un filtro gaussiano con costantesigma
aA
. Questosigma
è stato scelto visivamente, ma funziona solo per una determinata classe di immagini. - Sto cercando di ottenere un
sigma
ottimale per ogni immagine, quindi in seguito sono riuscito a trovare alcune relazioni disigma
e la classe di evento mostrata in ciascuna immagine.
In ogni caso, grazie per l'aiuto!
Quindi stai cercando un minimo di diverso, allora? –
Forse non è il modo migliore, ma certamente il più semplice è semplicemente applicare un ridimensionamento lineare alle variabili o il valore ridotto al minimo. Ci sono alcuni valori hardcoded nelle funzioni di ottimizzazione di scipy. Anche giocare con 'xtol' può essere d'aiuto. – Daniel
Mi sembra che sia necessario smussare entrambe le immagini * a * e image * b * per renderle simili, a meno che * b * non sia già livellato. Se questo è il caso, potrebbe essere che (a seconda di come si misura la somiglianza tra le due immagini) qualsiasi livellamento applicato a * a * da solo lo renderà * meno * simile a * b * piuttosto che più simile. Oppure, potresti provare a utilizzare una misura di somiglianza diversa in 'compare_images()' in modo che restituisca valori diversi per similarità anche se la variazione in 'k' è inferiore a 0.5. Se mostri la tua funzione 'compare_images()', le persone potrebbero avere dei suggerimenti? – Simon