【问题标题】:How do I generate correlated random numbers in Python?如何在 Python 中生成相关随机数?
【发布时间】:2021-06-29 12:05:47
【问题描述】:

如何创建一组 n 个维度为 d 的向量,使元素具有相关性 c(即,如果一个向量有一个大元素,其他元素可能也很大)?

为了演示,假设 n=5、d=3 和 c=0.7。

有没有办法在这里设置conv:https://numpy.org/doc/stable/reference/random/generated/numpy.random.multivariate_normal.html

这可能问得太多了,但是如果我想要从正态分布中提取数字怎么办?

谢谢!

编辑:基本上,我正在尝试创建一个合成种群,其个体在某些潜在变量上有所不同,理想情况下,这个潜在变量将遵循正态分布。例如,心理测量 g 因素总结了多项测试的表现,并解释了给定测试中人与人之间的一定量的差异。所以我想创建维度为 d (任务数)的 n 个向量(人口规模),但也许 c 需要是 d 个数字的向量?我可能需要为潜在变量分数(例如 g)指定一个由 d 个数字组成的向量,或者这可能来自于个体向量的创建方式?

【问题讨论】:

  • 从您的措辞中不清楚您是在寻求向量之间的相关性,还是与每个向量的序列相关性。你说“如果一个向量有一个大元素,其他元素可能很大”,这听起来像是你在谈论序列相关,但序列相关通常被指定为滞后(元素之间的距离)的函数,你只给出一个相关值。

标签: python numpy random statistics correlation


【解决方案1】:

这可能是你要找的吗?

import numpy as np


def gen_random(n: int, d: int, covar: float) -> np.ndarray:
    """
    Paramters
    ---------
    n : int
        number of samples generated
    d : int
        dimensionality of samples
    covar : float
        uniform covariance for samples
    
    Returns
    -------
    samples : np.ndarray
        samples in as (n, d)-matrix
    """
    cov_mat = np.ones((d, d)) * covar; np.fill_diagonal(cov_mat, 1)
    offset = np.zeros(d)

    return np.random.multivariate_normal(offset, cov_mat, size=n)


v = gen_random(n=10_000, d=3, covar=0.7)
print(v)
# [[ 0.03031736  0.18227023 -0.1302022 ]
#  [-0.17770689  0.70979971 -0.74631702]
#  [-0.78485455 -0.73942846 -0.04819704]
#  ...
#  [ 2.5928135   2.43727782  1.59459156]
#  [ 0.33443158 -0.74126937 -0.7542286 ]
#  [ 0.11238505 -0.1940429   0.7397402 ]]

# sanity check
print(np.corrcoef(v, rowvar=False))
# [[1.         0.6985444  0.69802535]
#  [0.6985444  1.         0.70168241]
#  [0.69802535 0.70168241 1.        ]]

【讨论】:

    猜你喜欢
    • 2016-09-04
    • 1970-01-01
    • 2015-09-27
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2013-11-13
    • 2015-03-08
    相关资源
    最近更新 更多