【问题标题】:Getting variance values for random samples generated from a standard normal distribution using numpy使用 numpy 获取从标准正态分布生成的随机样本的方差值
【发布时间】:2020-12-23 16:18:00
【问题描述】:

我有一个函数,可以根据对应于平均值的矩阵和对应于方差值的另一个矩阵,给出每个类的概率分布。例如,如果我有四个类,那么我将有以下输出:

y_means = [1,2,3,4]
y_variance = [0.01,0.02,0.03,0.04]

我需要对平均值进行以下计算才能继续我的程序的其余部分:

y_means = np.array(y_means)
y_means = np.reshape(y_means,(y_means.size,1))
A = np.random.randn(10,y_means.size)
y_means = np.matmul(A,y_means)

在这里,我使用了 numpy.random.randn 函数从标准正态分布中生成随机样本,然后将其与矩阵的平均值相乘,得到一个新的输出矩阵。输出矩阵的维度将是 (10 x 1)。

我需要做一个类似的计算,这样我的 output_variances 也将是一个 (10 x 1) 矩阵。但是以相同的方式将方差与来自标准正态分布的随机样本相乘是没有意义的,因为这也会导致负值。这是不可取的,因为我的最终目标是使用这些平均值及其相应的方差值创建正态分布:

torch.distributions.normal.Normal(loc=y_means, scale=y_variance)

所以我的问题是,是否有任何方法可以为 numpy.random.randn 生成的每个随机样本获取方差值?因为这样一个矩阵的乘法对于 output_variance 会更有意义。

或者如果有任何其他我可能不知道的策略,请告诉我。

【问题讨论】:

    标签: python numpy pytorch gaussian probability-distribution


    【解决方案1】:

    问题中提到的问题需要另一个与 A 维数相同的矩阵,该矩阵对应于 A 中存在的随机样本的方差度量。

    使用 numpy.var() 对由 A 表示的矩阵进行逐行或逐列方差并没有给出与 y_variance 相乘的类似 10 x 4 矩阵。

    我已经通过以下方法解决了上述问题:

    首先使用以下代码行创建一个与 A 具有相同维度且条目为零的矩阵:

    A_var = np.zeros_like(A)
    

    然后,使用 torch.distributions 创建正态分布,其中 A 中的值作为均值,零作为方差:

    dist_A = torch.distributions.normal.Normal(loc=torch.Tensor(A), scale=torch.Tensor(A_var))
    

    https://pytorch.org/docs/stable/distributions.html 列出了 PyTorch 中正态分布上所有可能的操作。 sample() 方法可以从给定分布中生成任意大小的样本。利用此属性首先生成大小为 10 X 10 x 4 的样本矩阵,然后计算沿轴 0 的方差。

    np.var(np.array(dist2.sample((10,))),axis=0)
    

    这将产生一个大小为 10 x 4 的方差矩阵,可用于使用 y_variance 进行计算。

    【讨论】:

      猜你喜欢
      • 2019-06-04
      • 1970-01-01
      • 2020-06-17
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 2020-02-13
      • 2012-02-03
      相关资源
      最近更新 更多