Scipy函数最小化



其中x1和x2数据帧为:分配0.400000平均0.000732标准偏差0.015961rfr 0.000000

分配0.200000平均0.000957标准偏差0.016520rfr 0.000000

def create_function_duo(x1df, x2df):
def funct(xi):
y=0

y+=xi*(x1df.iat[1]-x1df.iat[3])/(x1df.iat[2]-x1df.iat[3])
y+=(1-xi)*(x2df.iat[1]-x2df.iat[3])/(x2df.iat[2]-x2df.iat[3])
#only includes minimization, answer is flipped to negative
return -y
xi=x1df.iat[0].item()
bi = (0,None)
be = (1,None)
bnds = (bi, be)

min_result = spo.minimize(funct, xi, method = 'SLSQP',  bounds = bnds, options = {'disp':True}) #, 
print('minima found at')
print(min_result.x, min_result.fun)

return min_result.x

说明:我正试图使两个基金的比例最大化。我意识到这应该只返回1,但我无法获得最小化函数来返回任何有边界的东西。如果我声明边界=(1,0(,我得到"int不可迭代">

如果我使用上面的,它会返回"ValueError:目标函数必须返回标量">

我甚至尝试返回-y.item((将其转换为浮点值,结果出现错误:"ValueError:只能将大小为1的数组转换为Python标量">

我不知道这里出了什么问题。该函数返回一个值(已测试(,函数声明位于外部函数内部,当调用最小化时,所有x1df和x2dfs都应为"常量"。我需要设置边界,这样xi只在0和1之间,但y应该可以自由更改。我已经尝试过bi=(0,1(、be=(None,None(,以及bi=(None0(、be=(None1(,甚至bi=(0,(、be=C(1,(('ValueError:没有足够的值来解压缩(应为2,得到1('(。我看了一个边界问题,但我不相信我有Xi变量而不是Xi。我不懂一些有界限的东西,请告诉我我做错了什么。

对于每个维度,边界应该是(min,max(的序列。我知道你有一维,但它仍然需要一个序列。因此,以下操作有效(注意bounds参数指定第一个(也是唯一一个(参数xi的min=0.0,max=1.0边界(

min_result = spo.minimize(funct, xi, method = 'SLSQP',  bounds = ((0,1),), options = {'disp':True}) #, 

并生成(其余代码完好无损(

Optimization terminated successfully    (Exit mode 0)
Current function value: [-0.05792978]
Iterations: 5
Function evaluations: 10
Gradient evaluations: 5
minima found at
[0.] [-0.05792978]
array([0.])

最新更新