生成白噪声(具有零均值和单一方差的正态分布)

Posted

技术标签:

【中文标题】生成白噪声(具有零均值和单一方差的正态分布)【英文标题】:Generate White noise (normal distribution with null mean and unitary variance) 【发布时间】:2019-10-31 02:29:40 【问题描述】:

我正在尝试为通过 Cholesky 分解构建的 100 行 x 3 列数据集生成白噪声;数据集是参数为 0 和 Sigma(cov. 矩阵)的高斯多元分布,如下所示:

[1.0, 0.4, 0.5] [0.4, 1.0, 0.4] [0.5, 0.4, 1.0]

# no_pop            = number of rows
# M                 = number of columns
# mu                = mean = 0
# sigma             = variance = 1
# Sigma_matrix      = covariance matrix (see above)
Z = scipy.random.normal(mu, sigma, [no_pop, M])
cov_Z = covariance_matrix(Z)
chol_Z = scipy.linalg.cholesky(cov_Z);
chol_inv_Z = scipy.linalg.inv(chol_Z)
zch = np.dot(Z, chol_inv_Z)
Chol = scipy.linalg.cholesky(Sigma_matrix)
X = zch.dot(Chol)

#   It returns covariance matrix
def covariance_matrix(matrix):
    X1 = matrix[:, 0]
    X2 = matrix[:, 1]
    X3 = matrix[:, 2]
    C = np.vstack([X1, X2, X3])
    return np.cov(C.astype(float), rowvar=True)

(我检查了生成数据集的相关系数和协方差矩阵)。现在,我需要生成噪声并将其添加到数据集中,如link - Section 2.1 所示。到目前为止我所做的是:

while(True):
    noiseZ = scipy.random.normal(mu, sigma, size=(no_pop * M))
    if(abs(mu - np.mean(noiseZ)) < 0.0001 and abs(sigma - np.std(noiseZ)) < 0.0001):
        noiseZ = np.reshape(noiseZ, [no_pop, M])
        noiseFinal = noiseZ;
        break;

然后检查noiseFinal的协方差矩阵是否等于单位矩阵(不相关的Noise)。这样做,我应该看到,在“dataset + noiseFinal”的协方差矩阵中,协方差保持不变(或者它们可能会发生非常小的变化),而方差已经发生了变化。

错误发生在哪里?

【问题讨论】:

【参考方案1】:

其实我觉得你应该增加样本... 尝试在 10k 左右拥有更大的人口,然后提取所需大小的样本。这应该可以解决问题! 让我知道,祝你好运!

【讨论】:

我认为这是唯一的方法。

以上是关于生成白噪声(具有零均值和单一方差的正态分布)的主要内容,如果未能解决你的问题,请参考以下文章

怎样求正态分布的平均值与方差

正态分布的均值与方差怎么算?

MATLAB生成多元正态分布随机数(指定均值及协方差)——mvnrnd函数详解

matlab关于randn函数的应用问题 大神进

matlab中已知一组数据服从正态分布,怎么求均值和方差?

数学之路-python计算实战-机器视觉-图像产生加性零均值高斯噪声