详解Python 计算期望值

  • Post category:Python

计算期望值常常是统计学、概率学和数理金融等领域的一个重要主题,Python作为一种基于计算机软件的处理工具,在期望值的计算中也广泛应用。

期望值的定义

期望值是随机变量取值的加权平均值。更准确一些说,期望值是我们在多次实验中对每种结果的可能性和结果对应的值的乘积之和的预测。如果每个结果的概率相等,则期望值是所有结果的平均值。

对于离散型随机变量,其期望值的计算公式为:

$E(X)=\sum_i{p_i\times x_i}$

其中,$x_i$ 为离散型随机变量取到的某一个值,$p_i$ 为该值概率。
而对于连续型随机变量,期望值计算公式较为复杂,在此不作过多讨论。

Python 实现期望值的计算

离散型随机变量

我们可以通过两种方式来实现离散型随机变量的期望值计算。

第一种方式:使用Python内置的sum()函数和列表推导式来简化代码。例如,假设我们有一枚硬币,出现正面的概率为 $0.5$,反面的概率为 $0.5$,则该硬币的期望值为:

p = [0.5, 0.5]
x = [1, 0]
expectation = sum([p[i]*x[i] for i in range(len(p))])
print(expectation)    # 输出结果为 0.5

第二种方式:使用Numpy中的dot()函数来计算期望值。例如上述例子可以改写成以下代码:

import numpy as np

p = np.array([0.5, 0.5])
x = np.array([1, 0])
expectation = np.dot(p, x)
print(expectation)    # 输出结果为 0.5

连续型随机变量

在Python中,我们可以使用SciPy模块的 integrate() 函数来计算连续型随机变量的期望值。具体地,我们需要传入被积函数f(x)、积分下限a和积分上限b,即可通过以下代码计算:

from scipy.integrate import quad

def f(x):
    return x**2    # 定义被积函数

a = 0               # 积分下限
b = 1               # 积分上限
expectation, error = quad(f, a, b)   # 调用quad()函数计算期望值
print(expectation)    # 输出结果为 0.3333

此处我们定义的被积函数为 $f(x) = x^2$,积分下限为 $0$,积分上限为 $1$。程序输出结果为 $0.3333$,即连续型随机变量的期望值。

示例说明

接下来,我们通过两个具体的例子来说明期望值的计算过程:

示例一:

问题描述:从标准扑克牌(不包含大小王)中随机抽取一张牌,计算其点数的期望值。

解答:标准扑克牌中一共有 $13$ 种点数,即从 $A$ 到 $K$。每种点数都有 $4$ 张牌,因此总共有 $52$ 张牌。我们可以用一个列表存储每种点数对应的概率。对于点数 $1$ 到 $10$,概率为 $\frac{1}{13}$,对于面牌(J、Q、K)概率同样为 $\frac{1}{13}$。

p = [4/52] * 10 + [3/52] * 3   # 存储每种点数对应的概率,共13个元素
x = list(range(1, 11)) + [10] * 3   # 存储每种点数对应的值,共13个元素
expectation = np.dot(p, x)
print(expectation)    # 输出结果为 6.5385

因此从标准扑克牌中随机抽取一张牌,点数的期望值为 $6.5385$。

示例二:

问题描述:假设某医院生育科每周新生婴儿数量服从泊松分布,已知每周平均新生婴儿数量为 $2$,计算该医院每天新生婴儿数量的期望值。

解答:因为每周新生婴儿数量服从泊松分布,其概率密度函数为 $f(x)=\frac{\lambda^xe^{-\lambda}}{x!}$,其中 $\lambda$ 为每周平均新生婴儿数量。在本例中,$\lambda=2$。因此,每天新生婴儿数量的期望值为:

from scipy.stats import poisson

lambda_ = 2   # 每周平均新生婴儿数量
expectation = poisson(lambda_/7).expect(1)   # 计算每天新生婴儿数量的期望值
print(expectation)    # 输出结果为 0.2857(约为0.29)

因此该医院每天新生婴儿数量的期望值为 $0.2857$(约为0.29)。