scipy.optimize 使用矩阵作为输入、边界、约束的问题



我过去曾使用Python进行优化;但是,我现在尝试使用矩阵作为目标函数的输入,并对单个元素值和矩阵中每行的值之和设置边界,我遇到了问题。

具体来说,我想将目标函数传递ObjFunc三个参数 -wpret- 然后最小化该函数的值(从技术上讲,我试图通过最小化-1*ObjFunc的值来最大化函数),方法是调整w受制于w的所有元素都应落在 [0, 1]和约束,即w中每行的总和应为 1。

我在下面包含一段简化的示例代码来演示我遇到的问题。 如您所见,我正在使用scipy.opimize中的minimize函数。 问题始于目标函数的第一行x = np.dot(p, w)其中优化过程试图将矩阵展平为一维向量 - 当调用函数而不执行优化时不会发生此问题。bounds = bconstraints = 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)

稍微深入研究一下代码。minimize打电话给optimize._minimize._minimize_slsqp. 它做的第一件事是:

x = asfarray(x0).flatten()

因此,您需要将objFunc设计为与w的扁平化版本一起使用。 在该功能开始时重塑它可能就足够了。

我从 IPython 会话中读取了代码,但您也可以在scipy目录中找到它:

/usr/local/lib/python3.5/dist-packages/scipy/optimize/_minimize.py

最新更新