如果以错误的方式使用它,我很抱歉在 StackOverflow 上提问。
我在一篇论文中有一个最大化问题,就像这样:
和一些限制:
其中r_f,t+1和γ给定常数,r_t+1是多维随机变量向量(这里是4维),f_t(r_t+1)是r_t+1的多维分布函数。问题是找到一个权重向量 w_t 来最大化期望值。
该论文说它是如何解决这个问题的,“积分是通过从多元条件回报分布 f_t(rt+1) 模拟 4 个因子(r_t+1 向量)的 100,000 个变量来解决的”。我知道如何生成随机数并从分布中获取平均值,但不完全了解如何在优化问题中使用它。
我尝试使用一些随机数并将平均值作为目标函数返回,如下例所示:
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 个随机数,似乎找不到确切的全局最小解,因为每次代码找到不同的解并且目标函数的值不同。即使在阅读文档并将参数“npop”更改为 1000 并将“scale”(试验解决方案的突变乘数)更改为 0.1 之后,它也没有按预期工作。
我用来解决优化问题的方式是不是错了?使用模拟数据最大化期望值的确切方法是什么?还是使用神秘模块有什么问题?或者,是否有另一种有效的方法来解决上述最大化问题?
非常感谢您的帮助!</p>