【问题标题】:How do we find the logsumexp of all subsets (or some approximation to this)?我们如何找到所有子集的 logsumexp(或近似值)?
【发布时间】:2021-12-04 17:32:47
【问题描述】:

我有一组数字n_1, n_2, ... n_k。我需要找到这组数字的所有可能子集的logsumexp 的总和(或平均值,相同)。有没有办法近似或精确计算?

注意,a, b, c 的 logsumexp 是 log(e_a + e_b + e_c)(exp,后跟 sum,后跟 log)

【问题讨论】:

  • 这是一个有趣的问题,但在math.stackexchange.com 上比在这里找到答案的可能性更大。
  • 正如@DavidEisenstat 指出的,如果没有省略空集,那么答案是零。
  • 由于对数的总和与产品的对数相同,因此您的问题相当于计算所有可能子集之和的产品的对数。例如,对于 {a,b,c},logsumexp 的所有子集的总和等于 log((ea+eb+ec)(ea+eb)(ea+ec)(eb+ec)(ea)( eb)(ec))。所以你需要计算 {e^a, e^b, e^c} 的product of sums of all subsets。可悲的是,这个问题也没有得到任何答案,尽管听起来可以用组合数学来回答。
  • k到底有多大?
  • @Stef 感谢您的建议。现在的 K 约为 50,但这可能会有所不同并高达 1000(暂时不会超过)。我会在这里保留一段时间,如果没有解决,将去数学 SO。还要感谢指向另一个问题的指针。是的,空子集是被禁止的。

标签: algorithm statistics logistic-regression sampling approximation


【解决方案1】:

我不知道这是否足够准确,但 log sum exp 是 max 的一种平滑模拟,因此一种可能性是排序使得 n1 ≥ n2 ≥ … ≥ nk 并返回 ∑i (2k−i / (2k sup> − 1)) ni,通过 0 和 log k 之间的误差项低于真实均值。

您还可以使用 {ni} ∪ 的对数总和 exp 的样本平均值({ni+1, n 的随机子集i+2, ..., nk}) 而不是总和中的 ni。通过使用足够多的样本,您可以使近似值尽可能好(尽管显然在某些时候使用蛮力评估会更便宜)。

(我假设空集被省略了。)

【讨论】:

    【解决方案2】:

    换一种思路,这是一个确定性方案,其附加误差最多为 ε。在我的另一个答案中,我们对 n1 ≥ … ≥ nk 进行排序,定义非空子集的平均对数和 exp 的近似 f(i),其中最小索引是 i,并计算 ∑i (2k−i / (2k − 1)) f(i)。如果每个 f(i) 都在 ε 之内,那么结果也是。

    固定 i 并且对于 1 ≤ j ≤ k−i 定义 dj = ni+j - ni。请注意,dj ≤ 0。我们定义 f(i) = ni + g(i) 其中 g(i) 将近似于平均 log 1 加上 sum exp {dj 的子集 | j}。

    我不想正式写下一部分,因为我相信它会更难理解,所以我的想法是通过 log sum exp 是可交换和关联的,我们将加速蛮力算法它将结果列表初始化为 [0],然后对于每个 j,通过将 log sum exp 与每个当前元素的 dj 附加来使列表的大小加倍。我声称,如果我们将每个中间结果向下舍入到最接近的 δ = ε/k 倍数,那么结果最多会低于 ε。通过从列表切换到其直方图,我们可以在时间上与不同条目的数量成比例地执行每一步。最后,我们将 g(i) 设置为直方图平均值。

    为了分析运行时间,在最坏的情况下,我们让所有 j 的 dj = 0,使得最大可能的结果 log k。这意味着列表最多可以有 (log k)/δ = ε−1 k log k + 1 个条目,使得总运行时间 O(ε−1 k3 对数 k)。 (这无疑可以通过更快的卷积算法和/或通过舍入 dj 并加以利用来稍微改进。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      相关资源
      最近更新 更多