【问题标题】:Problems with scipy.optimize using matrix as input, bounds, constraints使用矩阵作为输入、边界、约束的 scipy.optimize 问题
【发布时间】:2017-05-23 08:29:09
【问题描述】:

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

具体来说,我想传递目标函数ObjFunc三个参数——wpret——然后最小化这个函数的值(技术上我试图通过最小化来最大化函数-1*ObjFunc) 的值通过调整w 的值,以w 的所有元素应落在[0, 1] 范围内的界限和w 中每一行的总和应总和的约束到 1。

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

【问题讨论】:

    标签: python matrix optimization scipy


    【解决方案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
    

    【讨论】:

    • 谢谢。这就是我认为会发生的事情,但希望不是这样。你证实了我的担忧。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 2022-06-17
    • 1970-01-01
    • 2015-03-07
    相关资源
    最近更新 更多