如何找到参数以全局优化(最大化)具有随机变量的函数的期望值(使用 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
我是 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