Python 如何在scipy中使用带约束的最小化函数
我需要一些关于python(scipy)中优化函数的帮助 问题是优化Python 如何在scipy中使用带约束的最小化函数,python,optimization,numpy,scipy,Python,Optimization,Numpy,Scipy,我需要一些关于python(scipy)中优化函数的帮助 问题是优化f(x)其中x=[a,b,c…n]。约束条件是a、b等的值应介于0和1之间,并且sum(x)==1。scipy.optimize.minimize函数似乎最好,因为它不需要微分。我如何传递参数 使用排列创建数据数组太长。我现在的代码如下:- import itertools as iter all=iter.permutations([0.0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1.0],6) if sum==
f(x)
其中x=[a,b,c…n]
。约束条件是a、b等的值应介于0和1之间,并且sum(x)==1
。scipy.optimize.minimize函数似乎最好,因为它不需要微分。我如何传递参数
使用排列创建数据数组太长。我现在的代码如下:-
import itertools as iter
all=iter.permutations([0.0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1.0],6) if sum==1
all_legal=[]
for i in all:
if np.sum(i)==1:
#print np.sum(i)
all_legal.append(i)
print len(all_legal)
lmax=0
sharpeMax=0
for i in all_legal:
if sharpeMax<getSharpe(i):
sharpeMax=getSharpe(i)
lmax=i
将itertools导入为iter
全部=iter置换([0.0,1,2,3,4,5,6,7,8,9,1.0],6)如果总和==1
所有法律=[]
对我来说,总的来说:
如果np.和(i)=1:
#打印np.总和(一)
所有法律附件(一)
打印透镜(所有合法)
lmax=0
夏普马克=0
对于我而言,在所有法律方面:
如果sharpeMax检查。最小化文档字符串:
scipy.optimize.minimize(fun, x0, args=(), method='BFGS', jac=None, hess=None, hessp=None, \
bounds=None, constraints=(), tol=None, callback=None, options=None)
在您的情况下,最重要的是界限
。如果要在[0,1](或(0,1)中约束参数,则需要为每个变量定义参数,例如:
bounds=((0,1), (0,1).....)
现在,另一部分,sum(x)==1
。可能有更优雅的方法来做这件事,但请考虑:不要最小化<>代码> f(x)< /> >,尽量减少<代码> h=lambda x:f(x)+g(x)< /代码>,一个新的函数本质<代码> f(x)+g(x)< /代码>其中<代码> g(x)< /代码>当函数<代码>和(x)=1 < /COD>时,函数达到最小值。例如g=lambda x:(和(x)-1)**2
当f(x)
和g(x)
均达到最小值时,将达到h(x)
的最小值。类似于拉格朗日乘数法的一种情况您可以使用COBYLA
或SLSQP
进行约束优化,如图中所示
将这些组合到最小化函数中
res = minimize(getSharpe, start_pos, method='SLSQP', bounds=bnds ,constraints=cons)
旁白:是一个内置函数的名称,因此它不是itertools
的一个很好的缩写。现在还不清楚要优化什么。你能更详细地描述一下这个问题吗?我强烈建议你阅读Scipy讲座中关于这个问题的章节。非常值得一读。sum(k代表x中的k)
也称为sum(x)
:)@Dougal几年后,当我收到关于这个答案的通知时,我仍然对这个问题耿耿于怀。
res = minimize(getSharpe, start_pos, method='SLSQP', bounds=bnds ,constraints=cons)