zoukankan      html  css  js  c++  java
  • 求两个随机变量的差的绝对值的期望

    问题1:给定离散随机变量 x 均匀分布在区间 [a, b] 的整点上,y 均匀分布在区间 [c, d] 的整点上,求期望 E(|x-y|)。

    问题很简单,显然最直接的办法就是枚举 x 和 y 然后进行统计即可。如果再稍稍思考一下,那么可以发现其实只用枚举其中一个变量就行了,因为若固定 x = i,那么求 E(|i-y|) 只需要对 i <=y 和 i > y 两种情况分别进行讨论即可。上面两个方法的运行时间都是与区间的大小相关的,对于这样简单的一个问题,有理由相信一定有 O(1) 的方法存在,事实上也的确如此,推导如下。

    首先可以交换 x , y 的顺序以保证 a <= c,那么 a, b, c, d 之间的顺序可以分成 3 种情况:

    1. a <= b <= c <= d
    2. a <= c < b <= d
    3. a <= c <= d < b

    对于第 1 种情况,因为 y 始终大于等于 x,因此 E(|x-y|) = E(y) – E(x);

    对于第 2 种情况,除了 cb 段以外 y 始终大于 x, 因此 E(|x-y|) = E(y) – E(x) + p_cb_cb * e_cb_cb,这里的p_cb_cb 表示 x 和 y 都分布在 cb 段的概率,e_cb_cb 表示当 x 和 y 都分布在 cb 段时,|x-y|的期望。

    对于第 3 种情况,可以将第 ab 拆成 ad 和 d’b 两段,这里 d’ = d + 1。于是 E(|x-y|) = p_ad_cd * e_ad_cd + p_d’b_cd * e_d’b_cd,而 e_ad_cd 可以按第 2 种情况来求, e_d’b_cd 可以按第 1 种情况来求,问题解决。

    现在唯一剩下的问题就是如果求 e_cb_cb,显然若 b – c + 1 = n,那么 e_cb_cb = e_[1, n]_[1, n]. 于是问题可以转换为:

    问题2:给定离散随机变量 x 和 y 均匀分布在区间 [1, n] 的整点上,求期望 E(|x-y|)。

    问题 2 简单地做一个求和就可以得到一个 closed form:

       

    利用上式可以得到解决问题 1 的代码如下:

    double eabs(int a, int b, int c, int d)
    {
        if (a > c) {swap(a, c); swap(b, d);}
        if (b > d)
        {
            double e_ad_cd = eabs(a, d, c, d);
            double p_ad_cd = (double)(d - a + 1) / (b - a + 1);
            double e_db_cd = (b - c + 1) / 2.0;
            double p_db_cd = (double)(b - d) / (b - a + 1);
            return e_ad_cd * p_ad_cd + e_db_cd * p_db_cd;
        }
        int n = max(b - c + 1, 1);
        double e_ab_cd = (c + d - a - b) / 2.0;
        double e_cb_cb = (n - 1.0 / n) / 3.0;
        double p_cb_cb = (double)n / (b - a + 1) * (double)n / (d - c + 1);
        return e_ab_cd + e_cb_cb * p_cb_cb;
    }

    再来看如果随机变量是连续分布的那情况又如何:

    问题3:给定连续随机变量 x 均匀分布在区间 [a, b) 上,y 均匀分布在区间 [c, d) 上,求期望 E(|x-y|)。

    问题 3 同样可以根据 a, b, c, d 的顺序分成 3 种情况进行讨论,而在情况 2 中仍然还要碰到求 e_cb_cb 的问题。若 n = b - c,对于连续随机变量显然有 e_cb_cb = n * e_[0,1)_[0,1),于是问题就转化成了:

    问题4:给定连续随机变量 x 和 y 均匀分布在区间 [0, 1) 上,求期望 E(|x-y|)。

    对于问题 4,可以直接求一个积分(实际上如果画出函数图像的话就是两个三棱锥),也可以直接求极限:

       

    由上式可以得到解决问题 3 的代码如下:

    double eabs(double a, double b, double c, double d)
    {
        if (a > c) {swap(a, c); swap(b, d);}
        if (b > d)
        {
            double e_ad_cd = eabs(a, d, c, d);
            double p_ad_cd = (d - a) / (b - a);
            double e_db_cd = (b - c) / 2.0;
            double p_db_cd = (b - d) / (b - a);
            return e_ad_cd * p_ad_cd + e_db_cd * p_db_cd;
        }
        double n = max(b - c, 0.0);
        double e_ab_cd = (c + d - a - b) / 2.0;
        double e_cb_cb = n / 3.0;
        double p_cb_cb = n / (b - a) * n / (d - c);
        return e_ab_cd + e_cb_cb * p_cb_cb;
    }

    最后祝大家兔年快乐!

  • 相关阅读:
    android数据恢复
    UVA 690 Pipeline Scheduling
    2017 国庆湖南 Day4
    2017 国庆湖南 Day5
    2017 国庆湖南 Day6
    2017国庆 清北学堂 北京综合强化班 Day1
    2017 国庆湖南Day2
    bzoj 2962 序列操作
    UVA 818 Cutting Chains
    UVA 211 The Domino Effect
  • 原文地址:https://www.cnblogs.com/atyuwen/p/eabs_closed_form.html
Copyright © 2011-2022 走看看