【发布时间】:2012-10-14 06:09:59
【问题描述】:
短版:如何最有效地表示和添加由它们的实现列表给出的两个随机变量?
略长的版本: 对于工作项目,我需要添加几个随机变量,每个变量都由值列表给出。例如,rand 的实现。变种。 A 是 {1,2,3},B 的实现是 {5,6,7}。因此,我需要的是A+B的分布,即{1+5,1+6,1+7,2+5,2+6,2+7,3+5,3+6,3+7 }。而且我需要对不同的随机变量(C,D,...)进行多次这种添加(让我们将此添加次数表示为 COUNT,其中 COUNT 可能达到 720)。
问题:如果我使用这种将 A 的每个实现与 B 的每个实现相加的愚蠢算法,复杂度在 COUNT 中是指数级的。因此,对于每个 r.v.由三个值给出,COUNT=720 的计算量是 3^720 ~ 3.36xe^343,这将持续到我们的日子结束来计算:) 更不用说在现实生活中,每个 r.v. 的长度。会是5000+。
解决方案: 1/第一个解决方案是使用我可以进行舍入的事实,即具有整数值的实现。像这样,我可以代表每个 r.v.作为一个向量,并且在对应于实现的索引处,我的值为 1(当 r.v. 具有此实现一次时)。所以对于房车A 和一个从 0 到 10 索引的实现向量,表示 A 的向量将是 [0,1,1,1,0,0,0...],而 B 的表示将是 [0,0,0, 0,0,1,1,1,0,0,10]。现在我通过这些向量创建 A+B 并执行与上述相同的操作(将 A 的每个实现与 B 的每个实现相加,并将其编码为相同的向量结构,向量长度的二次复杂度)。这种方法的好处是复杂性是有限的。这种方法的问题是,在实际应用中,A的实现会在区间[-50000,50000]中,粒度为1。因此,添加两个随机变量后,A+B的跨度达到-100K , 100K .. 在 720 次加法之后,SUM(A, B, ...) 的跨度达到 [-36M, 36M] 甚至在这么大的数组上的二次复杂度(与指数复杂度相比)将永远持续下去。
2/ 要拥有更短的数组,可以使用哈希图,这很可能会减少 A+B 中涉及的操作(数组访问)的数量,因为假设理论跨度的一些重要部分 [ -50K, 50K] 永远不会成为现实。然而,随着越来越多的随机变量的不断求和,实现的数量呈指数增长,而跨度仅线性增加,因此跨度中的数字密度随着时间的推移而增加。这会扼杀 hashmap 的好处。
所以问题是:我怎样才能有效地解决这个问题?电力交易中的VaR计算需要解决方案,所有分布都是凭经验给出的,不像普通分布,因此公式没有用,我们只能模拟。
使用数学被认为是我们部门的第一选择。是数学家。但是,我们要添加的分布表现不佳,并且 COUNT=720 是一个极端值。更有可能的是,我们将使用 COUNT=24 作为每日 VaR。考虑到要添加的分布的不良行为,对于 COUNT=24,中心极限定理不会太紧密(SUM(A1, A2, ..., A24) 的发行版不会接近正常值)。在计算可能的风险时,我们希望得到一个尽可能准确的数字。
预期用途是:您从某些操作中获得每小时的现金流量。一小时的现金流分布是 r.v. A. 接下来的一个小时是 r.v. B 等等。而你的问题是:在 99% 的案例中,最大的损失是什么?因此,您对这 24 小时中的每一个小时的现金流量进行建模,并将这些现金流量作为随机变量添加,以便获得全天总现金流量的分布。然后你取 0.01 分位数。
【问题讨论】:
-
我觉得你的复杂度计算有误,应该是720^3而不是3^720。
-
@Skizz。当我有 A={1,2,3}, B={4,5,6} 时,生成的 A+B 发行版需要 3*3 整数加法。结果是 {4,5,6,8,10,12,12,15,18}。添加另一个房车C={7,8,9},我有 9*3 个整数加法。因此,每个添加的 r.v.整数加法的次数增加了三倍。
-
@DanBencik 你刚刚成倍增加......我以为你应该添加。
-
我现在明白了,问题开始变得有意义了。
-
@paddy:你是对的。所以 A+B 应该是 {5,6,7,6,7,8,7,8,9}。我很抱歉。
标签: c++ performance random