Python中如何创建可自定义标准差的相关变量?
问题原因
你当前使用的cov_matrix本质是相关系数矩阵,对角线元素对应各变量的方差,方差为1时标准差自然为1,所以生成的数据离散度不符合预期。
实现方案
要保留预设的变量间相关关系,同时自定义各变量的标准差,可通过「标准差对角矩阵 × 相关矩阵 × 标准差对角矩阵」的公式计算得到真实可用的协方差矩阵,示例代码如下:
import numpy as np import pandas as pd # 按Height、Weight、Age、Income的顺序,定义各变量的目标标准差 # 可根据你的需求调整各数值,示例中Height标准差设为30 target_stds = np.array([30, 10, 8, 8000]) # 你原来定义的相关关系保持不变 corr_matrix = [ [1, 0.7, 0, 0], [0.7, 1, 0, 0], [0, 0, 1, 0.4], [0, 0, 0.4, 1] ] # 构造标准差对角矩阵,计算真实协方差矩阵 std_diag = np.diag(target_stds) cov_matrix = std_diag @ corr_matrix @ std_diag # 生成模拟数据,均值保持你原来的设置即可 correlated = np.random.multivariate_normal([165, 65, 30, 15000], cov_matrix, size=250) data = pd.DataFrame({ "Height": correlated[:, 0], "Weight": correlated[:, 1], "Age": correlated[:, 2], "Income": correlated[:, 3] })
验证
运行以下代码即可查看各变量的实际标准差,Height的标准差会接近你设置的30,且变量间的相关系数和你预设的一致:
print(data.std())
可选优化
如果需要Age、Income这类变量不能为负值,可以在生成数据后增加截断逻辑,或改用对数正态分布生成对应变量。
内容的提问来源于stack exchange,提问作者AlejandroDGR
相关产品推荐
相关产品推荐

