生成一定相关性的二元正态分布

2023-11-16

摘要

本文讲简要叙述如何生成具有一定相关性 (correlation) 的服从二元正态分布的随机变量。

二元正态分布

二元正态分布概率密度函数

我们知道单变量标准正态分布 X ∼ N ( 0 ,   1 ) X \sim N(0, \, 1) XN(0,1) 的概率密度函数 (probability density function, pdf) 为
f ( x ) = 1 2 π e − x 2 / 2 ,   − ∞ < x < ∞ \displaystyle f(x) = \frac{1}{\sqrt{2\pi}} e^{-x^2 / 2}, \, -\infty < x < \infty f(x)=2π 1ex2/2,<x<
那么二元正态分布是如何定义的呢?其定义与单变量的正态分布类似,不过引入了两个变量之间的相关性。具体的定义如下:
如果二元变量 ( X ,   Y ) (X, \, Y) (X,Y) 服从二元正态分布,那么 ( X ,   Y ) (X, \, Y) (X,Y) 的联合概率密度分布函数(joint density distribution function)为:
f ( x ,   y ) = 1 2 π σ X σ Y 1 − ρ 2 × exp ⁡ ( − 1 2 ( 1 − ρ 2 ) ( ( x − μ X σ X ) 2 − 2 ρ ( x − μ X σ X ) ( y − μ Y σ Y ) + ( y − μ Y σ Y ) 2 ) \begin{aligned} f(x, \, y) &= \frac{1}{2\pi \sigma_X \sigma_Y \sqrt{1 - \rho^2}} \times \\ & \exp \left( -\frac{1}{2(1 - \rho^2)} \Big( \big( \frac{x - \mu_X}{\sigma_X} \big)^2 - 2 \rho (\frac{x - \mu_X}{\sigma_X}) (\frac{y - \mu_Y}{\sigma_Y}) + (\frac{y - \mu_Y}{\sigma_Y})^2 \right) \end{aligned} f(x,y)=2πσXσY1ρ2 1×exp(2(1ρ2)1((σXxμX)22ρ(σXxμX)(σYyμY)+(σYyμY)2)
在公式中,我们称 μ X ,   μ Y \mu_X, \, \mu_Y μX,μY 是二元正态分布的均值(期望), σ X 2 ,   σ Y 2 \sigma_X^2, \, \sigma_Y^2 σX2,σY2 是二元正态分布的方差, ρ \rho ρ 为二元正态分布的相关性。

二元正态分布随机数的生成

现在我们想生成两个服从标准正态分布的随机数,并且要求这两个随机数的相关性是一个给定的数 ρ \rho ρ。我们应该如何做呢?

如果我们想用一个程序生成服从标准正态分布的随机数,我们可以用Python numpy包中的 np.random.normal(0, 1, n),来生成 n n n 个服从 N ( 0 ,   1 ) N(0, \, 1) N(0,1) 的随机数。但是想要生成具有一定相关性的两个服从标准正态分布的随机数,我们就不能用简单得用两次np.random.normal(0, 1, n),因为这样我们只是生成了两个独立的随机变量,它们的相关性为 0。为了生成具有一定相关性的二元正态分布,这里我们采用构造线性组合的方法。具体如下。

假设 A ,   B A, \, B A,B 是两个独立的标准正态分布。 令
X = α A + β B , X = \alpha A + \beta B, X=αA+βB, Y = γ A + δ B Y = \gamma A + \delta B Y=γA+δB
( α ,   β ,   γ ,   δ ) (\alpha, \, \beta, \, \gamma, \, \delta) (α,β,γ,δ) 是四个待确定的参数。我们希望找到这样的 ( α ,   β ,   γ ,   δ ) (\alpha, \, \beta, \, \gamma, \, \delta) (α,β,γ,δ), 使得 X ∼ N ( 0 ,   1 ) X \sim N(0, \, 1) XN(0,1) Y ∼ N ( 0 ,   1 ) Y \sim N(0, \, 1) YN(0,1),并且 C o r ( X ,   Y ) = ρ \rm{Cor}(X, \, Y) = \rho Cor(X,Y)=ρ。我们知道两个独立的正态分布相加依然是一个正态分布。我们有 X ∼ N ( 0 ,   α 2 + β 2 ) X \sim N(0, \, \alpha^2 + \beta^2) XN(0,α2+β2) Y ∼ N ( 0 ,   γ 2 + δ 2 ) Y \sim N(0, \, \gamma^2 + \delta^2) YN(0,γ2+δ2)。所以,我们须要 α 2 + β 2 = 1 \alpha^2 + \beta^2 = 1 α2+β2=1 γ 2 + δ 2 = 1 \gamma^2 + \delta^2 = 1 γ2+δ2=1。为了简化运算,我们设 α = cos ⁡ θ ,   β = sin ⁡ θ \alpha = \cos\theta, \, \beta = \sin \theta α=cosθ,β=sinθ γ = sin ⁡ θ ,   δ = cos ⁡ θ \gamma = \sin \theta, \, \delta = \cos \theta γ=sinθ,δ=cosθ。这样我们的 X ,   Y X, \, Y X,Y 就分别服从标准正态分布。下面我们只需要找到 θ \theta θ,使得 C o r ( X ,   Y ) = ρ \rm{Cor}(X, \, Y) = \rho Cor(X,Y)=ρ

接下来我们来看条件 C o r ( X ,   Y ) = ρ \rm{Cor}(X, \, Y) = \rho Cor(X,Y)=ρ C o r ( X ,   Y ) = Cov ( X ,   Y ) Var ( X ) Var ( Y ) \displaystyle \rm{Cor}(X, \, Y) = \frac{\text{Cov}(X, \, Y)}{\sqrt{\text{Var}(X) \text{Var}(Y)}} Cor(X,Y)=Var(X)Var(Y) Cov(X,Y)。因为 X = ( cos ⁡ θ ) A + ( sin ⁡ θ ) B ∼ N ( 0 ,   1 ) X = (\cos \theta) A + (\sin \theta) B \sim N(0, \, 1) X=(cosθ)A+(sinθ)BN(0,1),所以 Var ( X ) = 1 \text{Var}(X) = 1 Var(X)=1。同样的, Var ( Y ) = 1 \text{Var}(Y) = 1 Var(Y)=1

所以我们只须要 Cov ( X ,   Y ) = ρ \text{Cov}(X, \, Y) = \rho Cov(X,Y)=ρ


Cov ( X ,   Y ) = Cov ( ( cos ⁡ θ ) A + ( sin ⁡ θ ) B , ( sin ⁡ θ ) A + ( cos ⁡ θ ) B ) = cos ⁡ θ sin ⁡ θ + sin ⁡ θ cos ⁡ θ = sin ⁡ 2 θ \begin{aligned} \text{Cov}(X, \, Y) &= \text{Cov} \Big( (\cos \theta) A + (\sin \theta) B, (\sin \theta) A + (\cos \theta) B \Big) \\ &= \cos \theta \sin \theta + \sin \theta \cos \theta \\ &= \sin2\theta \end{aligned} Cov(X,Y)=Cov((cosθ)A+(sinθ)B,(sinθ)A+(cosθ)B)=cosθsinθ+sinθcosθ=sin2θ

注意,在上面的计算中我们用到了 C o r ( A ,   B ) = 0 \rm{Cor}(A, \, B) = 0 Cor(A,B)=0

所以我们有 sin ⁡ 2 θ = ρ \sin2\theta = \rho sin2θ=ρ。我们选取 θ = arcsin ⁡ ρ 2 \displaystyle \theta = \frac{ \arcsin \rho}{2} θ=2arcsinρ。这样,我们通过
{ X = ( cos ⁡ θ ) A + ( sin ⁡ θ ) B Y = ( sin ⁡ θ ) A + ( cos ⁡ θ ) B \begin{cases} X = (\cos \theta) A + (\sin \theta) B \\ Y = (\sin \theta) A + (\cos \theta) B \end{cases} {X=(cosθ)A+(sinθ)BY=(sinθ)A+(cosθ)B
计算得到的 X ,   Y X, \, Y X,Y 就是相关性为 ρ \rho ρ 的标准正态分布。

程序实现

我们用Python 来实现上述方法。

import numpy as np
import matplotlib.pyplot as plt

class bivariateNormal:
    
    def __init__(self, rho: 'float', m: int):
        """
        Suppose we want to generate a pair of 
        random variables X, Y, with X ~ N(0, 1), 
        Y ~ N(0, 1), and Cor(X, Y) = rho. m is 
        the number of data pairs we want to generate.
        """
        self.rho = rho
        self.m = m
    
    def generateBivariate(self) -> 'tuple(np.array, np.array)':
        """
        Generate two random variables X, Y, with X ~ N(0, 1), 
        Y ~ N(0, 1), and Cor(X, Y) = rho. 
        self.m is the number of sample points we generated.
        We return a tuple (X, Y). 
        """
        theta = np.arcsin(self.rho) / 2
        A = np.random.normal(0, 1, self.m)
        B = np.random.normal(0, 1, self.m)
        X = np.cos(theta) * A + np.sin(theta) * B
        Y = np.sin(theta) * A + np.cos(theta) * B
        return X, Y

我们试着生成m = 1000个(X, Y),如下:

m = 10 ** 3
rho = -0.4
a = bivariateNormal(rho, m)
X, Y = a.generateBivariate()
np.corrcoef(X, Y)

得到的结果为:

array([[ 1.        , -0.41408183],
      [-0.41408183,  1.        ]])

即X 与 Y 的相关性为-0.414,与其理论值-0.4 很接近。

多元正态分布的情况

生成服从 N ( μ ,   Σ ) N(\mathbf{\mu}, \, \Sigma) N(μ,Σ) n n n 元正态分布

假设我们想要生成服从 N ( μ ,   Σ ) N(\mathbf{\mu}, \, \mathbf{\Sigma}) N(μ,Σ) n n n 元正态分布 X = ( x 1 ,   x 2 , ⋯   ,   x n ) T \mathbf{X} = (x_1, \, x_2, \cdots, \, x_n)^T X=(x1,x2,,xn)T X \mathbf{X} X 是一个列向量,其每个分量 x i x_i xi 均为一个随机变量)。我们称 μ \mu μ X \mathbf{X} X 的期望, Σ \Sigma Σ X X X 的协方差矩阵。

想要生成这样一个随机变量向量, 我们可以采取如下步骤 [1]:

  1. 生成 n n n 个独立的标准正态分布 z 1 ,   z 2 , ⋯   ,   z n z_1, \, z_2, \cdots, \, z_n z1,z2,,zn,记为 Z \mathbf{Z} Z
  2. 找到矩阵 C C C,满足 C C T = Σ CC^T = \mathbf{\Sigma} CCT=Σ

于是 X = μ + C Z \mathbf{X} = \mu + C \mathbf{Z} X=μ+CZ 即为满足要求的 n n n 元随机数。

具体证明的过程可以参考下面的定理:

假设 X \mathbf{X} X 是一个 n n n-dimensional 的随机变量向量, X \mathbf{X} X 的期望向量是 μ \mu μ X \mathbf{X} X 的协方差矩阵为 Σ \Sigma Σ 。假设 C \mathbf{C} C 是一个 k × n k \times n k×n 的实矩阵, b \mathbf{b} b 是一个 k × 1 k \times 1 k×1 的列向量。则 Y = C X + b \mathbf{Y} = \mathbf{C} \mathbf{X} + \mathbf{b} Y=CX+b 的期望向量是 C μ + b \mathbf{C} \mu + \mathbf{b} Cμ+b,协方差矩阵为 Σ Y = C Σ C T \Sigma_{\mathbf{Y}} = \mathbf{C} \Sigma \mathbf{C}^T ΣY=CΣCT

多元情况的程序实现

from scipy.linalg import cholesky

class generate_correlated_normal:
    
    def __init__(self, n: int, mu: 'np.array', Sigma: 'np.ndarray', m: int):
        """
        n is the dimension of the random vector.
        mu is the expectation vector of the random vector. 
        mu.shape = (n, 1). 
        Sigma is the covariance matrix of the random sample
        vector we want to generate. m is the number of 
        vectors we want to generate. 
        """
        self.mu = mu.reshape(n, 1)
        self.Sigma = Sigma
        self.m = m
    
    def generate_random_vectors(self) -> 'np.ndarray':
        """
        Generate m random vectors with expectation mu and 
        covariance matrix Sigma.
        The returned value is of type np.ndarray, of shape
        (n, m). n is the dimension of the random vector. 
        """
        C = cholesky(self.Sigma, lower=True)
        n = self.Sigma.shape[0] # n is the dimension of the random vector
        Z = np.random.normal(0, 1, (n, self.m))
        return self.mu + np.dot(C, Z)
n = 3
mu = np.array([0, 0, 0])
Sigma = np.array([[1, 0.2, 0.3], [0.2, 1, 0.4], [0.3, 0.4, 1]])
m = 10 ** 4
b = generate_correlated_normal(n, mu, Sigma, m)
X = b.generate_random_vectors()
np.corrcoef(X[0,:], X[1,:])

array([[1. , 0.2136722],
[0.2136722, 1. ]])

np.corrcoef(X[0,:], X[2,:])

array([[1. , 0.31754401],
[0.31754401, 1. ]])

np.corrcoef(X[1,:], X[2,:])

array([[1. , 0.39934556],
[0.39934556, 1. ]])

可以看出,生成的随机向量元素之间的相关性是符合预期的 [2]。

参考文献

[1] Math stackexchange, Generate Correlated Normal Random Variables

[2] Correlated Random Samples

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生成一定相关性的二元正态分布 的相关文章

  • Django 管理员在模型编辑时间歇性返回 404

    我们使用 Django Admin 来维护导出到我们的一些站点的一些数据 有时 当单击标准更改列表视图来获取模型编辑表单而不是路由到正确的页面时 我们会得到 Django 404 页面 模板 它是偶尔发生的 我们可以通过重新加载三次来重现它
  • 将数据从 python pandas 数据框导出或写入 MS Access 表

    我正在尝试将数据从 python pandas 数据框导出到现有的 MS Access 表 我想用已更新的数据替换 MS Access 表 在 python 中 我尝试使用 pandas to sql 但收到错误消息 我觉得很奇怪 使用 p
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • OpenCV Python cv2.mixChannels()

    我试图将其从 C 转换为 Python 但它给出了不同的色调结果 In C Transform it to HSV cvtColor src hsv CV BGR2HSV Use only the Hue value hue create
  • Python(Selenium):如何通过登录重定向/组织登录登录网站

    我不是专业程序员 所以请原谅任何愚蠢的错误 我正在做一些研究 我正在尝试使用 Selenium 登录数据库来搜索大约 1000 个术语 我有两个问题 1 重定向到组织登录页面后如何使用 Selenium 登录 2 如何检索数据库 在我解决
  • 使用带有关键字参数的 map() 函数

    这是我尝试使用的循环map功能于 volume ids 1 2 3 4 5 ip 172 12 13 122 for volume id in volume ids my function volume id ip ip 我有办法做到这一点
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • PyUSB 1.0:NotImplementedError:此平台不支持或未实现操作

    我刚刚开始使用 pyusb 基本上我正在玩示例代码here https github com walac pyusb blob master docs tutorial rst 我使用的是 Windows 7 64 位 并从以下地址下载 z
  • 基于代理的模拟:性能问题:Python vs NetLogo & Repast

    我正在 Python 3 中复制一小段 Sugarscape 代理模拟模型 我发现我的代码的性能比 NetLogo 慢约 3 倍 这可能是我的代码的问题 还是Python的固有限制 显然 这只是代码的一个片段 但 Python 却花费了三分
  • 使用 Tkinter 显示 numpy 数组中的图像

    我对 Python 缺乏经验 第一次使用 Tkinter 制作一个 UI 显示我的数字分类程序与 mnist 数据集的结果 当图像来自 numpy 数组而不是我的 PC 上的文件路径时 我有一个关于在 Tkinter 中显示图像的问题 我为
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • 如何在 Python 中追加到 JSON 文件?

    我有一个 JSON 文件 其中包含 67790 1 kwh 319 4 现在我创建一个字典a dict我需要将其附加到 JSON 文件中 我尝试了这段代码 with open DATA FILENAME a as f json obj js
  • 使用其构造函数初始化 OrderedDict 以便保留初始数据的顺序的正确方法?

    初始化有序字典 OD 以使其保留初始数据的顺序的正确方法是什么 from collections import OrderedDict Obviously wrong because regular dict loses order d O
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe

随机推荐

  • Json的学习例子

    using System using LitJson using System Collections namespace JSON
  • pyinstaller 打包应用报错闪退

    请看到最后 解决方案一 用录屏软件录个视频 然后用播放软件打开逐帧查看 找到报错原因 一般是某个包导入错误 重新安装下对应的包 忒麻烦 借鉴大佬的博客 https blog csdn net s740556472 article detai
  • 最后一次实验

    拓扑图 实验要求 拓扑分析 先分ip 然后分vlan然后配ip 配路由 设备配置和配置解析 sw1 sw2 r1 r2 r3 实验结果
  • 脑电EEG常用的特征

    最近学习有关脑电的一些基础知识 基于深度学习对脑电信号进行分类时 首先需要对脑电信号进行预处理 滤波等 这时一般不能将其作为数据进行学习 更常见的是提取脑电信号的特征 然后再用深度学习发掘特征与不同情绪的关联 脑电信号常见的特征有 时域中
  • CLR 完全介绍

    From http msdn microsoft com zh cn magazine cc164193 aspx http msdn microsoft com en us magazine cc164193 aspx Code down
  • 刷脸支付服务商提供极致的用户体验

    刷脸支付正在攻占人们生活中的各个场景 在北京 可能依靠刷脸就可乘坐地铁了 据报道 北京地铁部门已开始测试面部识别技术 目前正在机场线内部测试中 一旦验证成功 将会在全路网铺开 最近一个月 垃圾分类成了热点 全国开始进入生活垃圾强制分类新时代
  • Myabtis_Plus

    一 自动填充 准备工作 添加新的字段create time update time 在实体类中需要进行自动填充的字段添加注解 TableField fill FieldFill INSERT private Date createTime
  • Unity 获取Animtor Controller 动画控制器的参数,层级

    获取Animator中的Parameters参数 Trigger Int Float等类型 UnityAPI Animator parameters 获取所有参数 获取Layer层 UnityAPI Animator layerCount
  • sql 自定義百分比轉換小數函數

    CAST 和 CONVERT 函数 Percentage DECLARE dec decimal 5 3 var varchar 10 hun decimal 5 1 set dec 0 025 set hun dec 100 set va
  • 通过vue和element-ui框架写前台

    首先我们运维一般写web界面很多都会使用bootstrp jquery 现在vue其以简单 不用直接操作dom 深受广大非前端爱好者的喜欢 前端只用写界面 后台关注界面就可以了 实现前后台分离 flask如何引入vue js和element
  • shell脚本启动java类或者jar包实践

    1 直接在shell脚本中执行class文件 代码目录如下 在目录下执行bash test sh命令 shell脚本test sh的代码如下 java Xmx2048m Xms2048m XX MaxNewSize 2048m XX Max
  • 第二篇,ESP8266烧录固件 各种版本解决方案 mqtt 安信可固件 记录于2021年6月30日

    1 硬件连接准备 1 1对于esp8266 01和esp8266 01s 特别需要进行注意 RX接TX TX接RX 3 3V接3 3V GND接GND IO0接GND 一定要注意这一步 烧录的时候如果不行话 直接重新上电就可以 反复几次 就
  • Windows server 服务器com安全编辑限制选项灰色

    在一次Windows server 系统运维中 项目实施方搭建OPC时遇到了com 安全编辑限制选项灰色的问题 当时百度查找了很多但是也没查到 但是能确定应该是组策略和注册表中用户administrator权限不够的问题 查找资料中发现Dc
  • 2021->2022

    也就随便写写了 记得去年的年终和期望目标 我写了好多个方面的自我剖析 可能大概有三四千字吧 再回去看看 还是水了一些 这很正常 大多数人都是这样的 况且我比较佛系 复盘还是要的 期望还是要提的 虽然明知一年过后 可能达成的不多 但这也是一次
  • 医疗知识中台白皮书

    该白皮书显示 医疗行业平均医护人员供给不足 优质医疗资源过于聚集 医疗资源质量短期难以大幅提高等问题突出 与此同时 遵循医疗逻辑的智能化开放平台 医疗知识中台 正在成为解决这一难题的突破口 关注公众号 互联互通社区 回复 ZTZL053 获
  • 通用网关接口(摘录)

    维基百科 自由的百科全书 通用网关接口 Common Gateway Interface CGI 是一种重要的互联网技术 可以让一个客户端 从网页浏览器向执行在 Web 服务器 上的程序 请求数据 CGI 描述了客户端和这个程序之间传输数据
  • 【Python-利用动态二维码传输文件(四)】使用pyautogui库录屏(连续截图),然后利用OpenCV逐张读取截图,识别当中的二维码信息,并把信息重组成原文件

    程序示意图 目录 一 使用pyautogui库 对电脑屏幕进行录屏 二 使用OpenCV库对100帧截图进行识别 并与原29帧二维码图片内含信息进行比对 三 把获取的100帧二维码信息去重 并保持原来顺序 重组成原来的文件 四 小结和完整代
  • Java前后端分离动态国际化(动态配置扩展性高)

    介绍 主要是针对前后端分离场景国际化系统设计 亮点 1 动态国际化配置 2 可维护性 3 国际化数据池化 性能高 4 后端数据内容动态国际化 5 提供前台动态国际化数据 6 后台异常国际化处理 7 可动态添加国际化的语种 8 国际化配置集中
  • React中路由组件的lazyLoad

    1 通过React的lazy函数配合import 函数动态加载路由组件 gt 路由组件代码会被分开打包 const Login lazy gt import pages Login 2 通过
  • 生成一定相关性的二元正态分布

    生成一定相关性的二元正态分布 摘要 二元正态分布 二元正态分布概率密度函数 二元正态分布随机数的生成 程序实现 多元正态分布的情况 生成服从 N