Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在scipy中使用带约束的最小化函数_Python_Optimization_Numpy_Scipy - Fatal编程技术网

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==

我需要一些关于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==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)