MultivariateNormalDistribution抛出“矩阵是单数”

时间:2013-10-27 19:41:48

标签: java random matrix apache-commons

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

我正在使用来自Apache Commons的MultivariateNormalDistribution

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)

我读过here这意味着矩阵不可逆。确定。

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

Multivariate normal distribution Wikipedia article中写道:

  

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

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


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

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)

对于有类似问题的人:

Not Positive Definite Matrices - Causes and Cures给了我一些见解。

1 个答案:

答案 0 :(得分:2)

位于bluebit.gr的在线矩阵计算器为您的C矩阵提供了下三角形Cholesky分解:

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 decomposition分解方差/协方差矩阵 C 以获得下三角“根” L 。如果 M 是平均值的向量, Z 是独立法线的向量,则 X = M + < strong> LZ 将是具有所需均值和方差/协方差结构的相关法线的向量。我不是最新的Java,所以你必须找到或实现一个合适的矩阵库。快速网络搜索显示Apache CommonsNIST都有Java中的Cholesky分解实现。