Python中np.random.multinomial的size参数问题与协方差验证异常
多项式分布协方差实验差异问题解析
要验证多项式分布中X₁与X₂的协方差公式 cov(X₁,X₂) = -N*p₁*p₂,设置参数N=50,概率分布为[p₁=0.4, p₂=0.2, p₃=0.4],预期协方差为 -50*0.4*0.2 = -4。开展了两种实验:
- 尝试A:使用
np.random.multinomial(size=1000)生成样本,计算得到的协方差接近预期值-4; - 尝试B:逐行调用
np.random.multinomial生成X₁、X₂、X₃,得到的协方差与预期差异极大。
核心差异:样本的关联性
尝试A的正确性
np.random.multinomial(N, p, size=1000) 会生成1000个独立完整的多项分布样本,每个样本是包含(X₁,X₂,X₃)的数组,且满足X₁+X₂+X₃=N。你计算的是这1000组同一次试验中产生的X₁和X₂的协方差——这完全符合多项式分布中X₁与X₂的定义:它们来自同一次N次独立试验的分类计数,总次数固定,一个类别计数增加必然挤压其他类别,因此呈现负相关,协方差接近-4。
尝试B的错误根源
你大概率是在逐行调用时,让X₁和X₂来自不同的多项试验。比如错误代码类似:
import numpy as np N = 50 p = [0.4, 0.2, 0.4] x1 = [] x2 = [] for _ in range(1000): # 每次单独生成X₁,来自一次独立试验 x1.append(np.random.multinomial(N, p)[0]) # 每次单独生成X₂,来自另一次独立试验 x2.append(np.random.multinomial(N, p)[1]) # 计算的是独立变量的协方差,自然接近0 print(np.cov(x1, x2)[0,1])
这种情况下,X₁和X₂是来自两次完全独立的多项试验的变量,它们之间没有负相关约束,协方差会接近0,和预期值差异极大。
尝试B的修正方法
逐行生成时,必须保证X₁和X₂来自同一次多项试验,正确代码应该是:
import numpy as np N = 50 p = [0.4, 0.2, 0.4] x1 = [] x2 = [] for _ in range(1000): # 生成一个完整的多项样本,包含本次试验的X₁,X₂,X₃ sample = np.random.multinomial(N, p) x1.append(sample[0]) x2.append(sample[1]) # 此时计算的协方差会接近预期的-4 print(np.cov(x1, x2)[0,1])
内容的提问来源于stack exchange,提问作者Dreamer93
相关产品推荐
相关产品推荐

