我想生成一个具有N(0, C)
分布的随机向量,即具有 0 均值和给定协方差矩阵的正态分布C
。
我正在使用MultivariateNormalDistribution
Apache 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)
对于有类似问题的人:
非正定矩阵 - 原因和治疗给了我一些见解。