我过去曾使用Python进行优化;但是,我现在正在尝试使用矩阵作为目标函数的输入,以及设置单个元素值的边界以及矩阵中每行的值的总和,我遇到了问题。
具体来说,我想传递目标函数ObjFunc
三个参数 - w
,p
,ret
- 然后最小化此函数的值(技术上我我试图通过最小化-1*ObjFunc
的值来最大化函数,方法是调整w
的值,使w
的所有元素都落在[0,1]的范围内以及w
中每行总和的约束应该总和为1.
我在下面添加了一段简化示例代码来演示我遇到的问题。如您所见,我使用minimize
中的scipy.opimize
函数。问题始于目标函数x = np.dot(p, w)
的第一行,其中优化过程试图将矩阵展平为一维向量 - 在不执行优化的情况下调用函数时不会发生的问题。 bounds = b
和constraints = c
也都会产生错误。
我知道我在如何接近这种优化方面犯了一个基本错误,并且会欣赏可以提供的任何见解。
import numpy as np
from scipy.optimize import minimize
def objFunc(w, p, ret):
x = np.dot(p, w)
y = np.multiply(x, ret)
z = np.sum(y, axis=1)
r = z.mean()
s = z.std()
ratio = r/s
return -1 * ratio
# CREATE MATRICES
# returns, ret, of each of the three assets in the 5 periods
ret = np.matrix([[0.10, 0.05, -0.03], [0.05, 0.05, 0.50], [0.01, 0.05, -0.10], [0.01, 0.05, 0.40], [1.00, 0.05, -0.20]])
# probability, p, of being in each stae {X, Y, Z} in each of the 5 periods
p = np.matrix([[0,0.5,0.5], [0,0.6,0.4], [0.2,0.4,0.4], [0.3,0.3,0.4], [1,0,0]])
# initial equal weights, w
w = np.matrix([[0.33333,0.33333,0.33333],[0.33333,0.33333,0.33333],[0.33333,0.33333,0.33333]])
# OPTIMIZATION
b = [(0, 1)]
c = ({'type': 'eq', 'fun': lambda w_: np.sum(w, 1) - 1})
result = minimize(objFunc, w, (p, ret), method = 'SLSQP', bounds = b, constraints = c)
答案 0 :(得分:1)
深入挖掘代码。 minimize
来电optimize._minimize._minimize_slsqp
。它做的第一件事就是:
x = asfarray(x0).flatten()
因此,您需要设计objFunc
以使用展平版w
。在该功能开始时重塑它可能就足够了。
我从IPython会话中读取代码,但您也可以在scipy
目录中找到它:
/usr/local/lib/python3.5/dist-packages/scipy/optimize/_minimize.py