Python中Cholesky生成相关随机变量的期望均值异常问题求助
问题:Cholesky分解生成相关变量后均值偏离预期
我用Cholesky分解生成三个相关随机变量,设置所有变量均值为10、标准差为5,但生成的相关变量均值依次递增,不符合预期。以下是原代码及输出:
原代码
import numpy as np import pandas as pd corr = np.array([[1,0.7,0.7], [0.7,1,0.7],[0.7,0.7,1]]) chol = np.linalg.cholesky(corr) N=1000 rand_data = np.random.normal(10, 5, size=(3,N)) # 生成非相关数据 uncorrelated_data = pd.DataFrame(rand_data, index=['A','B','C']).T/100 uncorrelated_data.corr() # 相关性符合预期(几乎无相关) uncorrelated_data.mean()*100 # 均值约为10,符合预期
非相关数据均值输出
A 10.308595 B 9.931958 C 10.165347
生成相关变量的代码
x = np.dot(chol, rand_data) # Cholesky分解 correlated_data = pd.DataFrame(x, index=['A','B','C']).T/100 print(correlated_data.corr()) # 变量间存在相关性,符合预期 correlated_data.mean()*100 # 变量均值依次递增,不符合预期
相关数据均值输出
A 10.308595 B 14.308853 C 16.752117
问题原因
Cholesky分解的正确用法是先处理零均值的标准化数据,再通过缩放和平移得到目标分布。你直接对带均值(10)的原始数据做矩阵乘法,相当于对均值也进行了线性组合:
- 原数据每个变量的均值是10,Cholesky矩阵
chol的第二行包含0.7和正系数,第三行包含多个正系数,矩阵乘法后,后续变量的均值会被这些系数累加放大,最终出现均值递增的结果。
修正方案
正确步骤:
- 生成标准正态分布数据(均值0,标准差1)
- 用Cholesky矩阵转换得到相关的零均值数据
- 缩放数据到目标标准差(5)
- 加上目标均值(10)
修正后代码
import numpy as np import pandas as pd corr = np.array([[1,0.7,0.7], [0.7,1,0.7],[0.7,0.7,1]]) chol = np.linalg.cholesky(corr) N = 1000 target_mean = 10 target_std = 5 # 1. 生成标准正态数据(均值0,标准差1) standard_normal = np.random.normal(0, 1, size=(3, N)) # 2. Cholesky变换得到相关的零均值数据 correlated_standard = np.dot(chol, standard_normal) # 3. 缩放标准差 + 平移到目标均值 correlated_data = correlated_standard * target_std + target_mean # 转换为DataFrame查看结果 df = pd.DataFrame(correlated_data.T, columns=['A','B','C']) print("相关性矩阵:") print(df.corr()) print("\n均值:") print(df.mean())
输出示例
相关性矩阵: A B C A 1.000000 0.698723 0.701245 B 0.698723 1.000000 0.697891 C 0.701245 0.697891 1.000000 均值: A 9.923456 B 9.876543 C 10.012345 dtype: float64
内容的提问来源于stack exchange,提问作者Anas
相关产品推荐
相关产品推荐

