给定一个协方差矩阵,如何生成数据,使其具有样本协方差矩阵?
更一般地说:我们经常对从密度生成数据感兴趣,其中数据给定了一些参数向量。这会产生一个样本,然后我们可以从中再次估计值。我感兴趣的是相反的问题:如果给定一组参数,我们想生成一个样本这样,。
这是一个已知问题吗?这样的方法有用吗?有可用的算法吗?
给定一个协方差矩阵,如何生成数据,使其具有样本协方差矩阵?
更一般地说:我们经常对从密度生成数据感兴趣,其中数据给定了一些参数向量。这会产生一个样本,然后我们可以从中再次估计值。我感兴趣的是相反的问题:如果给定一组参数,我们想生成一个样本这样,。
这是一个已知问题吗?这样的方法有用吗?有可用的算法吗?
这类问题有两种不同的典型情况:
i)您想从给定分布中生成一个样本,其总体特征与指定的分布相匹配(但由于抽样变化,您没有完全匹配的样本特征)。
ii)您想要生成一个样本,其样本特征与指定的特征匹配(但是,由于样本数量与预先指定的一组值完全匹配的限制,并不是真正来自您想要的分布)。
您需要第二种情况——但是您可以通过与第一种情况相同的方法得到它,但需要额外的标准化步骤。
因此,对于多元法线,两者都可以以相当简单的方式完成:
对于第一种情况,您可以使用没有总体结构的随机法线(例如具有期望 0 和单位协方差矩阵的 iid 标准法线),然后将其强加 - 变换以获取协方差矩阵并表示您想要的意思。如果和是您需要的总体均值和协方差,并且是 iid 标准正态分布,则计算,对于一些其中 (例如,可以通过 Cholesky 分解获得合适的 ) . 则具有所需的总体特征。
对于第二个,您必须首先转换随机法线,以消除零均值和恒等协方差的随机变化(使样本均值为零和样本协方差),然后像以前一样继续。中去除样本偏差的初始步骤,方差会干扰分布。(在小样本中,它可能非常严重。)
这可以通过减去 ( ) 的样本均值并计算的 Cholesky 分解来完成。如果是左 Cholesky 因子,则应该具有样本均值 0 和恒等样本协方差。然后,您可以计算并获得具有所需样本矩的样本。(根据您的样本数量的定义方式,可能会有一个额外的小问题涉及乘以/除以诸如之类的因素,但很容易确定这种需求。)
@Glen_b 给出了一个很好的答案(+1),我想用一些代码来说明。
如何维多元高斯分布样本?这很容易通过从标准高斯生成样本并将它们乘以协方差矩阵的平方根,例如来实现。这在 CV 上的许多线程中都有介绍,例如这里:如何使用预先指定的相关矩阵生成数据?下面是一个简单的 Matlab 实现:
n = 100;
d = 2;
Sigma = [ 1 0.7 ; ...
0.7 1 ];
rng(42)
X = randn(n, d) * chol(Sigma);
结果数据的样本协方差矩阵当然不会完全是;例如在上面的例子中返回cov(X)
1.0690 0.7296
0.7296 1.0720
如何生成具有预先指定的样本相关性或协方差矩阵的数据?
正如@Glen_b 所写,在从标准高斯生成数据后,将其居中、变白并标准化,使其具有样本协方差矩阵;只有然后将它与相乘。
这是我的 Matlab 示例的延续:
X = randn(n, d);
X = bsxfun(@minus, X, mean(X));
X = X * inv(chol(cov(X)));
X = X * chol(Sigma);
现在cov(X)
,根据需要返回
1.0000 0.7000
0.7000 1.0000