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

时间:2017-01-09 06:06:48

标签: python matrix optimization scipy

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

具体来说,我想传递目标函数ObjFunc三个参数 - wpret - 然后最小化此函数的值(技术上我我试图通过最小化-1*ObjFunc的值来最大化函数,方法是调整w的值,使w的所有元素都落在[0,1]的范围内以及w中每行总和的约束应该总和为1.

我在下面添加了一段简化示例代码来演示我遇到的问题。如您所见,我使用minimize中的scipy.opimize函数。问题始于目标函数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)

1 个答案:

答案 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