2

我想生成一个具有N(0, C)分布的随机向量,即具有 0 均值和给定协方差矩阵的正态分布C

我正在使用MultivariateNormalDistributionApache Commons:

double[] means = new double[2];
double[][] C = {
{ 5.1455479254351755, -2.0050191427617987 },
{ -2.0050191427617987, 0.7812776833676598 } };
new MultivariateNormalDistribution(new JDKRandomGenerator(), means, C);

并得到一个例外matrix is singular

Exception in thread "main" org.apache.commons.math3.linear.SingularMatrixException: matrix is singular
    at org.apache.commons.math3.linear.EigenDecomposition$Solver.getInverse(EigenDecomposition.java:533)
    at org.apache.commons.math3.distribution.MultivariateNormalDistribution.<init>(MultivariateNormalDistribution.java:125)
    at javabbob.Experiment.main(Experiment.java:52)

我在这里读到这意味着,矩阵是不可逆的。好的。

但是,我想要的只是一个带有N(0, C)分布的随机向量。我可以使用任何方法。

多元正态分布维基百科文章中它写道:

协方差矩阵允许是奇异的(在这种情况下,对应的分布没有密度)。这种情况在统计中经常出现(...)

如何在 Java 中生成这样的随机向量?


我也尝试过CholeskyDecomposition使用相同的C数组:

RealMatrix covMatrix = new Array2DRowRealMatrix(C);
CholeskyDecomposition choleskyDecomposition = new CholeskyDecomposition(covMatrix);

而且它也不起作用,抛出NonPositiveDefiniteMatrixException

Exception in thread "main" org.apache.commons.math3.linear.NonPositiveDefiniteMatrixException: 0 is smaller than, or equal to, the minimum (0): not positive definite matrix: value 0 at index 1
    at org.apache.commons.math3.linear.CholeskyDecomposition.<init>(CholeskyDecomposition.java:142)
    at org.apache.commons.math3.linear.CholeskyDecomposition.<init>(CholeskyDecomposition.java:85)
    at javabbob.Experiment.main(Experiment.java:59)

对于有类似问题的人:

非正定矩阵 - 原因和治疗给了我一些见解。

4

1 回答 1

2

bluebit.gr上的在线矩阵计算器给出了矩阵的下三角 Cholesky 分解C

L = { { 2.268380  0.000000},
      {-0.883899  0.000000} };

这意味着您应该能够生成单个标准法线 Z,并进行变换以获得两个相关的法线,即 X 1 = 2.268380*Z 和 X 2 = -0.883899*Z。形式上它是 X 2 = -0.883899*Z 1 + 0.000000*Z 2,但由于分解中的右下方条目为零,因此您不需要第二个独立的 Z。如果它们应该是非零,则添加合适的方法。

附录

抱歉,我以为您正在寻找解决此特定问题的方法。通常,使用Cholesky 分解分解方差/协方差矩阵C以获得下三角“根” L。如果M是均值向量,Z是独立法线向量,则X = M + LZ将是具有所需均值和方差/协方差结构的相关法线向量。我不是最新的Java,所以你必须找到或实现一个合适的矩阵库。快速的网络搜索显示Apache CommonsNIST在 Java 中都有 Cholesky 分解实现。

于 2013-10-28T04:21:50.893 回答