如何找到参数以全局优化(最大化)具有随机变量的函数的期望值(使用 python mystic)

How to find the parameter to optimize (maximize) the expected value of a function with random variable globally (using python mystic)

我是 Whosebug 的新手,如果以错误的方式使用它,我深表歉意。

我在一篇论文中遇到了这样的最大化问题:

和一些限制条件:

其中r_f,t+1和γ给定常量,r_t+1为多维随机变量向量(此处为4维),f_t(r_t+1)是r_t+1的多维分布函数。问题是找到一个权重向量w_t来最大化期望值。

论文说了它是如何解决问题的,"The integrals are solved by simulating 100,000 variates for the 4 factors(the r_t+1 vector) from the multivariate conditional return distribution f_t(rt+1)"。我知道如何生成随机数并从分布中获取均值,但不完全了解如何在优化问题中使用它。

我尝试使用一些随机数和 return 平均值作为 objective 函数,如下例所示:

import numpy as np
rands = np.random.multivariate_normal(mean=[0, 0, 0, 0],
                                      cov=[[1, 0, 0, 0], [0, 1, 0, 0],
                                           [0, 0, 1, 0], [0, 0, 0, 1]],
                                      size=1000)


def expect_value(weight, rf, gamma, fac_ndarr):
    weight = np.asarray(weight)
    utility_array = (1 + rf + fac_ndarr.dot(weight))**(1 - gamma) / (1 - gamma)

    expected_value = utility_array.mean()
    return -expected_value

接下来,我使用模块 mystic 求解全局最小值。

from mystic.solvers import diffev2
from mystic.symbolic import (generate_conditions, generate_penalty,
                             generate_constraint, generate_solvers, simplify)

equation = """
x0 + x1 + x2 + x3 == 1
x0 + 2*(x1 + x2 + x3) - (1. / 0.2) <= 0
"""

pf = generate_penalty(generate_conditions(equation), k=1e20)
cf = generate_constraint(generate_solvers(simplify(equation)))
bounds = [(0, 1)] * 4

# Here the given constant `rf` and `gamma` are 0.15 and 7, 
# and they were passed to the parameter `args` with `rands`, 
# the `args` will be passed to the `cost`funtion.
result = diffev2(cost=expect_value,
                 args=(0.15, 7, rands),
                 x0=bounds,
                 bounds=bounds,
                 constraint=cf,
                 penalty=pf,
                 full_output=True,
                 npop=40)

我的真题生成了50000个随机数,似乎找不到精确的全局最小解,因为每次代码都找到不同的解,objective函数的值也不同。即使在读取 documentation 并将参数 "npop" 更改为 1000 并将 "scale"(试验解决方案的突变乘数)更改为 0.1 之后,它也没有按预期工作。

我以前解决优化问题的方法是不是错了?使用模拟数据最大化期望值的确切方法是什么?或者使用 mystic 模块有什么问题? 或者,是否有另一种有效的方法来解决上述最大化问题?

非常感谢您的帮助!

mystic 专为此类问题而构建,因为它可以优化产品度量 space。参见:https://github.com/uqfoundation/mystic/blob/master/examples5/TEST_OUQ_surrogate_diam.py