我有一个计算机视觉算法我想用scipy.optimize.minimize调整.现在我只想调整两个参数,但参数的数量可能最终增长所以我想使用一种可以进行高维渐变搜索的技术.SciPy中的Nelder-Mead实现似乎非常合适.
我得到了所有设置的代码,但似乎最小化函数确实想要使用步长大于1的浮点值.当前参数集都是整数,其中一个步长为1和另一个步长为2(即该值必须为奇数,如果不是我想要优化的东西将其转换为奇数).大致一个参数是以像素为单位的窗口大小,另一个参数是阈值(从0到255的值).
为了它的价值,我正在使用git repo中的scipy.有谁知道如何告诉scipy为每个参数使用特定的步长?有什么方法可以滚动我自己的渐变功能吗?是否有可以帮助我的scipy旗帜?我知道这可以通过简单的参数扫描完成,但我最终希望将此代码应用于更大的参数集.
代码本身很简单:
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
Run Code Online (Sandbox Code Playgroud)
这就是我的输出的样子.正如你所看到的那样,我们正在重复大量的运行并且没有在最小化中获得任何结果.
*+++++++++++++++++++++++++++++++++++++++++
[ 11. 10.] <-- Output from scipy minimize
{'block_size': 11, 'degree': 10} <-- input to …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用scipy.optimize包来查找我的成本函数的最大值.
在这种特殊情况下:我有一份价格清单,这些价格在一天内变化.为了方便起见,我们假设这一天有8个小时,每小时的价格如下:
price_list = np.array([1,2,6,8,8,5,2,1])
Run Code Online (Sandbox Code Playgroud)
在这个简化的案例中,我想从该price_list中选择4个最高价格.由于种种原因,我不想简单地排序和选择最好的四种价格,而是使用一些优化算法.我有几个约束,因此我决定使用scipy,scipy.optimize.fmin_slsqp中的最小二乘算法.
我首先为我选择的时间创建一个时间表:
schedule_list = np.zeros( len(price_list), dtype=float)
Run Code Online (Sandbox Code Playgroud)
接下来我需要定义我的反向profit_function.对于所有选定的小时,我想总结一下我的利润.虽然我想优化我的日程安排,但price_list是固定的,因此我需要将它放到*args:
def price_func( schedule_list, *price_list ):
return -1.*np.sum( np.dot( schedule_list, price_list ) )
Run Code Online (Sandbox Code Playgroud)
一旦我理解了原则上的工作方式,我就会移动一些东西.这么长时间,我只是避免使用更多*args并使用硬编码的小时数来定义我的约束.我希望我选择的小时数恰好是4,因此我使用了相等约束:
def eqcon(x, *price_list):
return sum( schedule_list ) - 4
Run Code Online (Sandbox Code Playgroud)
此外,我想将我的日程安排值限制为0或1.我不知道如何立即实现这一点,因此我只使用bounds关键字.
带边界的无限制优化工作正常.我只是通过我的schedule_list作为第一个猜测.
scipy.optimize.fmin_slsqp( price_func, schedule_list, args=price_list, bounds=[[0,1]]*len(schedule_list) )
Run Code Online (Sandbox Code Playgroud)
并且输出尽可能好:
Optimization terminated successfully. (Exit mode 0)
Current function value: -33.0
Iterations: 2
Function evaluations: 20
Gradient evaluations: 2
Out[8]: array([ 1., 1., 1., 1., 1., 1., 1., 1.])
Run Code Online (Sandbox Code Playgroud)
没有任何进一步的限制,这是最佳解决方案!
使用以下命令进行约束优化:
scipy.optimize.fmin_slsqp( price_func, schedule_list, args=price_list, bounds=[[0,1]]*len(schedule_list), eqcons=[eqcon, …Run Code Online (Sandbox Code Playgroud)