【问题标题】:Generating a random sample where variance of i'th component is 1/i生成一个随机样本,其中第 i 个分量的方差为 1/i
【发布时间】:2021-12-05 01:31:41
【问题描述】:

我需要编写一个函数,该函数在维度 d 中生成 n 个独立高斯变量的样本,期望为零,并且对于 i=1,...d,第 i 个分量的方差为 1/i。该函数应将样本作为形状 (n,d) 的矩阵返回。

我曾考虑过使用 rng.standard_normal(),但我不知道如何生成样本,以便每个第 i 个分量都有一个方差 1/i。任何帮助表示赞赏。

【问题讨论】:

  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: python arrays function numpy matrix


【解决方案1】:

给你:

import numpy as np
n = 4
d = 3
tmp = [(np.random.multivariate_normal(mean=np.zeros((n,)), cov=np.eye(n) * np.sqrt(1/(d+1)))) for i in range(d)]
res = np.squeeze(np.array(tmp)).T

【讨论】:

    【解决方案2】:

    使用random 包,您可以获得方差递减的正常抽奖列表,如下所示:

    import random 
    d=4
    n=10
    l = [random.gauss(0, (1/i)**2) for i in range(1, 1+d)]
    

    您可以使用另一个列表推导式获得具有 n 行(二维列表)的 矩阵

    mat = [[random.gauss(0, (1/i)**2) for i in range(1, 1+d)] for _ in range(n)]
    

    换句话说,如果您查看每一行的 x 值,它们将来自相同的分布。 如果您需要逐行平稳,您可以转置使用list(zip(mat)) 创建的双列表,或者您可以更改迭代逻辑:

    mat2 = [[random.gauss(0, (1/i)**2) for _ in range(d)] for i in range(1, 1+n)]
    

    在这种情况下,每个列表()都会有预期的差异,如果列表足够长,您可以验证这一点:

    import statistics as s
    [s.variance(l) for l in mat2]
    

    【讨论】:

      猜你喜欢
      • 2020-09-27
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-05-29
      • 2015-05-24
      • 2022-07-13
      相关资源
      最近更新 更多