【问题标题】:Why are the mean values not much closer to the original weightings?为什么平均值与原始权重相差不大?
【发布时间】:2017-09-25 13:33:21
【问题描述】:

我运行以下程序,典型的控制台输出如下。

加权 0 的平均百分比为:57.935590153643616
意思是 权重1的百分点为:42.06440984635654

为什么这些打印的平均值不接近 60 和 40?

public static void main(String[] args) {
    Random rand = new Random();

    int numCycles = 5000;

    double[] weightings = {60.0, 40.0};
    double[] weightedRandoms = new double[weightings.length];
    double[] totPercentagePoints = {0.0, 0.0};

    for (int j = 0; j < numCycles; j++) {

        for (int k = 0; k < weightings.length; k++) {
            weightedRandoms[k] = (rand.nextInt(10) + 1) * weightings[k]; // +1 to the random integer to ensure that the weighting is not multiplied by 0
        }

        for (int k = 0; k < weightings.length; k++) {
            totPercentagePoints[k] += weightedRandoms[k] / DoubleStream.of(weightedRandoms).sum() * 100;
        }
    }

    for (int i = 0; i < weightings.length; i++) {
        System.out.println("Mean percentage points for weighting " + i + " is: " + totPercentagePoints[i] / numCycles);
    }
}

【问题讨论】:

  • 你为什么希望他们成为?代码的目的是什么?
  • 嗨,我希望不必透露目的。至于为什么我期望方法更接近,是这样的:如果生成 5000 个随机数对,其中每个数字在 1 到 10(含)之间,例如3-7、5-2、1-10、8-8 等,如果这些被视为比率(30:70、71:29、9:91、50:50 等),我会预计平均比率为 50:50。那么,如果比率的每一边都乘以一个权重(在本例中分别为 60 和 40),我预计平均比率为 60:40。这个逻辑有意义吗?显然有些不对劲。
  • “如果比率的每一边都乘以权重(在本例中分别为 60 和 40),我预计平均比率为 60:40。”抱歉,我应该写“如果数字对的每一边都乘以权重(在本例中分别为 60 和 40),我希望得到的比率为 50:50 乘以 60 和 40,得到 3000:2000 ,减少到 60:40。"
  • X/(X+Y) 形式的东西的期望值不是期望值的比率。期望是线性算子,但形成比率是非线性的。我在 R 中得到的观察比率与在 Java 中得到的比率相同。您的代码没有问题,但是您对期望看到的内容的直觉是错误的。
  • 也许张贴在Mathematics X 的形式为0.6*U(1,10)Y 的形式为0.4*U(1,10)。在计算E[X/(X+Y)] 时,一个复杂的因素是分子和分母是相关的。我不知道有什么好的公式,尽管有一些方法可以近似(例如stat.cmu.edu/~hseltman/files/ratio.pdf

标签: java random weighting


【解决方案1】:

您正在估计100*E(X/(X+Y)]100*E(Y/(X+Y)],其中X = 60*U(1,10)Y = 40*U(1,10)(其中U(1,10) 是1,..,10 上的离散均匀分布)。由于只有 10*10 = 100 种可能的方法来生成两个这样的统一变量,因此您可以计算每个这样的对的表达式,然后直接计算这些期望值。在 Python 中定义:

def f(x,y): return 60*x/(60*x + 40*y)

然后:

>>> sum(f(x,y) for x in range(1,11) for y in range(1,11))
58.36068355253924

请注意,您乘以 100 正好抵消了计算期望所需的 1/100 因子。

如果你定义类似:

def g(x,y): return 40*y/(60*x + 40*y)

然后:

>>> sum(g(x,y) for x in range(1,11) for y in range(1,11))
41.639316447460756

这些确实与您所观察到的相吻合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2018-07-08
    • 2019-07-10
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多