我需要写一个函数,生成d维n个独立高斯变量的样本,期望为零,其中第I个分量的方差为1/I,当I =1,…d。函数应该返回形状为(n,d)的矩阵。
我想过使用rng.standard_normal(),但我不知道如何生成一个样本,以便每个第I个组件都有一个方差1/I。如有任何帮助,不胜感激。
给你:
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
使用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]