【问题标题】:How to generate multivariate Normal distribution from a standard normal value?如何从标准正态值生成多元正态分布?
【发布时间】:2021-12-22 09:39:40
【问题描述】:

我需要仅使用随机值生成器而不使用 scipy 或 numpy 生成器来生成多元正态分布。

我需要生成以下内容

这是我的尝试

V = np.array([
    [1, 2], 
    [2, 5]])
B = np.linalg.cholesky(V)
A = np.array([1,2])

# norm() return one number from standard normal distribution 
n1 = np.array([norm() for _ in range(40)])
n2 = np.array([norm() for _ in range(40)])
np.array([n1,n2]).T.dot(B) + A

这里,我使用 Cholesky 分解为in this post

但是,我认为这是不正确的。

【问题讨论】:

    标签: python random random-seed


    【解决方案1】:

    您的代码几乎是正确的,但如果您应用numpy's cov 函数,您可以检查您的数字是否不具有所需的协方差属性:

    res = np.array([n1,n2]).T.dot(B) + A
    np.cov(res.T).round()
    # returns ~ 
    # array([[5., 2.],
    #        [2., 1.]])
    

    请注意,与所需值相比,元素 1,1 和 2,2 是交换的。

    要利用 numpy 的 CPU 向量化矩阵乘法,您可以使用 numpy's dot 函数。您将 N 个二维输入向量 Z 正确排列为 Nx2 维向量 np.array([n1,n2]).T。但是正如您在Cholesky decomposition and variance 问题中指出的那样,Z 值必须从左侧乘以B,您还想将其合并到dot 函数的广播规则中,问题就在这里。代码np.array([n1,n2]).T.dot(B) 将(数组)Z 从右侧相乘,而不是从左侧相乘。要计算 B 的左积,您需要使用 dot(B.T)

    这个例子也表明协方差矩阵有正确的形式

    import random
    import numpy as np
    
    random.seed(0)
    N=10000
    
    V = np.array([
        [1, 2],
        [2, 5]])
    B = np.linalg.cholesky(V)
    A = np.array([1, 2])
    
    # norm() return one number from standard normal distribution
    n1 = np.array([random.gauss(0, 1) for _ in range(10000)])
    n2 = np.array([random.gauss(0, 1) for _ in range(10000)])
    res = np.array([n1, n2]).T.dot(B.T) + A
    
    np.cov(res.T).round()
    # returns ~  array([[1., 2.],
    #                   [2., 5.]])
    

    如图。在随机点下方绘制,以及协方差矩阵的特征向量及其特征值的平方根长度,如Wikipedia

    【讨论】:

    • 抱歉,您知道如何更改您的代码以从这个多元正态分布中只选择一个元素吗?一对,我的意思是。
    • res的类型是np.ndarray,包含所有的x、y对,res.shape返回(10000, 2)。为了获得第一对,res[0] 在另一个np.ndarray 中返回对应的 x、y 值,形状为 (2,)。要获取第 i 个元素的 x 值,请键入 res[I][0],然后键入 res[I][1] 作为 y 值。
    猜你喜欢
    • 2018-08-30
    • 2018-05-15
    • 1970-01-01
    • 2020-06-18
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    相关资源
    最近更新 更多