【发布时间】:2018-02-25 19:56:42
【问题描述】:
如何计算具有合理计算误差的 p 极值(非常接近 0 或非常大)的 generalized mean?
【问题讨论】:
-
+1 好问题,想了好久,什么都没得到。可能想试试stats.stackexchange.com
标签: statistics
如何计算具有合理计算误差的 p 极值(非常接近 0 或非常大)的 generalized mean?
【问题讨论】:
标签: statistics
我一直在努力解决同样的问题。以下是我的处理方式: 令 gmean_p(x1,...,xn) 为广义均值,其中 p 为实数但非 0,x1,..xn 为非负数。对于 M>0,我们有 gmean_p(x1,...,xn) = M*gmean_p(x1/M,...,xn/M) 可以利用后一种形式来减少计算误差。对于较大的 p,我使用 M=max(x1,...,xn),对于接近 0 的 p,我使用 M=mean(x1,..xn)。如果 M=0,只需添加一个小的正常数。这为我完成了这项工作。
【讨论】:
我怀疑如果您对 p 的非常大或非常小的值感兴趣,最好在输入数值之前对广义均值公式进行某种形式的代数操作。
例如,在 small-p 极限中,可以证明广义均值倾向于乘积 x_1*x_2*...x_n 的第 n 个根。 p 中的高阶项涉及 log(x_i) 的总和和乘积,这在计算上也应该是相对数值稳定的。事实上,我相信 p 中的一阶展开与 log(x_i) 的方差有一个简单的关系:
如果将此公式应用于从 [0.2, 2] 范围内均匀抽取的一组 100 个随机数,则会得到如下趋势:
这表明渐近公式在 p 小于约 0.3 时变得非常准确,而简单公式仅在 p 小于约 1e-10 时失败。
大 p 的情况,由具有最大量级的 x_i 主导(我们称其为索引 i_max)。可以将广义均值公式重新排列为以下形式,对于大 p 具有较少的病理行为:
如果将其应用于(使用标准 numpy 例程,包括 numpy.log1p)到 [0.2, 2.0] 上的另外 100 个均匀分布的样本,人们会发现重新排列的公式基本上与简单公式完全一致,但在更大的范围内仍然有效计算 x_i 的能力时,简单公式溢出的 p 值。
(请注意,左侧图的简单公式的蓝色曲线向上移动了 0.1,以便可以看到由于溢出而结束的位置。对于 p 小于约 1000,两条曲线将无法区分。 )
【讨论】:
我认为这里的答案应该是使用递归解决方案。与 mean(1,2,3,4)=mean(mean(1,2),mean(3,4)) 相同,您可以对广义均值进行这种递归。这给你带来的好处是你不需要做很多非常大的数字的总和,并且你减少了创建溢出的可能性。此外,使用浮点数时的另一个危险是添加数量级非常不同的数字(或减去数量级非常相似的数字)。因此,为避免此类舍入错误,在尝试计算广义均值之前对数据进行排序可能会有所帮助。
【讨论】:
这是一个预感:
首先将所有数字转换为以 p 为底的表示形式。现在要提高到 1/p 或 p 的幂,您只需移动它们 --- 这样您就可以非常轻松地进行所有幂运算而不会损失精度。
计算出以 p 为底的平均值,然后将结果转换回以 2 为底的值。
如果这不起作用,一个更不实际的预感:
尝试计算离散傅里叶变换,并将其与输入向量的离散傅里叶变换联系起来。
【讨论】: