Mam algorytm wizji komputerowej Chcę nastroić za pomocą scipy.optimize.minimize. Teraz chcę tylko dostroić dwa parametry, ale liczba parametrów może w końcu wzrosnąć, więc chciałbym użyć techniki, która może wykonywać wielowymiarowe wyszukiwania gradientowe. Implementacja Neldera-Meada w SciPy wydawała się pasować.Integer step size in scipy optimize minimize
Mam ustawiony kod, ale wygląda na to, że funkcja minimalizacji naprawdę chce używać wartości zmiennoprzecinkowych o rozmiarze kroku mniejszym niż jeden. Bieżący zestaw parametrów to liczby całkowite i jeden ma wielkość kroku jeden i drugi ma wielkość kroku równą dwóm (tj. wartość musi być nieparzysta, jeśli nie jest to coś, co próbuję zoptymalizować, przekonwertuję ją na nieparzystą liczbę). Z grubsza jeden parametr to rozmiar okna w pikselach, a drugim parametrem jest próg (wartość od 0-255).
Za to, co jest warte, używam nowej wersji scipy z repozytorium git. Czy ktokolwiek wie, jak powiedzieć scipie, aby używał określonego rozmiaru kroku dla każdego parametru? Czy istnieje sposób, w jaki mogę przetasować własną funkcję gradientu? Czy istnieje flaga scipy, która może mi pomóc? Mam świadomość, że można to zrobić za pomocą prostego przeciągnięcia parametru, ale ostatecznie chciałbym zastosować ten kod do znacznie większych zestawów parametrów.
Sam kod jest martwy prosta:
import numpy as np
from scipy.optimize import minimize
from ScannerUtil import straightenImg
import bson
def doSingleIteration(parameters):
# do some machine vision magic
# return the difference between my value and the truth value
parameters = np.array([11,10])
res = minimize(doSingleIteration, parameters, method='Nelder-Mead',options={'xtol': 1e-2, 'disp': True,'ftol':1.0,}) #not sure if these params do anything
print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
print res
To co moje wyjście wygląda. Jak widać, powtarzamy wiele przebiegów i nie osiągamy żadnego minimum w minimalizacji.
*+++++++++++++++++++++++++++++++++++++++++
[ 11. 10.] <-- Output from scipy minimize
{'block_size': 11, 'degree': 10} <-- input to my algorithm rounded and made int
+++++++++++++++++++++++++++++++++++++++++
120 <-- output of the function I am trying to minimize
+++++++++++++++++++++++++++++++++++++++++
[ 11.55 10. ]
{'block_size': 11, 'degree': 10}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
[ 11. 10.5]
{'block_size': 11, 'degree': 10}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
[ 11.55 9.5 ]
{'block_size': 11, 'degree': 9}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
[ 11.1375 10.25 ]
{'block_size': 11, 'degree': 10}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
[ 11.275 10. ]
{'block_size': 11, 'degree': 10}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
[ 11. 10.25]
{'block_size': 11, 'degree': 10}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
[ 11.275 9.75 ]
{'block_size': 11, 'degree': 9}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
~~~
SNIP
~~~
+++++++++++++++++++++++++++++++++++++++++
[ 11. 10.0078125]
{'block_size': 11, 'degree': 10}
+++++++++++++++++++++++++++++++++++++++++
120
Optimization terminated successfully.
Current function value: 120.000000
Iterations: 7
Function evaluations: 27
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
status: 0
nfev: 27
success: True
fun: 120.0
x: array([ 11., 10.])
message: 'Optimization terminated successfully.'
nit: 7*
Według Dokumenty metoda scipy w Neldera-Mead wykorzystuje algorytm programowania liniowego Simplex. Polega na użyciu nie zintegrowanych punktów/stopni w celu optymalizacji funkcji.Nie jestem zaznajomiony z SciPy w ogóle, więc może istnieć opcja konfiguracji, aby zrobić to, co chcesz. Możesz również zajrzeć do programowania liczb całkowitych (http://en.wikipedia.org/wiki/Integer_programming), ponieważ brzmi to jak to, co próbujesz osiągnąć. –
@EricG właściwie myślę, że to tylko mieszanka nazw, "Simplex" Neldera-Meada działa z geometryczną strukturą Simplex. Nie ma nic wspólnego z algorytmem Simplex z programowania liniowego, a to jest nieliniowa optymalizacja. – seberg
Z powodu takich problemów, dostrajanie parametrów dla algorytmów ML jest zwykle wykonywane tylko za pomocą wyszukiwania w sieci (często na siatce logarytmicznej, ale dla parametrów, które nie wydają się konieczne). Możesz wykonać przeszukiwanie z grubej siatki, aby najpierw znaleźć dobry region, a następnie dokładniejsze wyszukiwanie siatki we wspomnianym regionie. – Dougal