【发布时间】:2017-05-23 08:29:09
【问题描述】:
我过去曾使用 Python 进行优化;但是,我现在尝试使用矩阵作为目标函数的输入,并设置单个元素值的界限以及矩阵中每一行的值之和,但我遇到了问题。
具体来说,我想传递目标函数ObjFunc三个参数——w、p、ret——然后最小化这个函数的值(技术上我试图通过最小化来最大化函数-1*ObjFunc) 的值通过调整w 的值,以w 的所有元素应落在[0, 1] 范围内的界限和w 中每一行的总和应总和的约束到 1。
我在下面包含了一段简化的示例代码来演示我遇到的问题。如您所见,我正在使用来自scipy.opimize 的minimize 函数。问题始于目标函数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)
【问题讨论】:
标签: python matrix optimization scipy