Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “多变量不均匀分布”;矩阵是奇异的;_Java_Random_Matrix_Apache Commons - Fatal编程技术网

Java “多变量不均匀分布”;矩阵是奇异的;

Java “多变量不均匀分布”;矩阵是奇异的;,java,random,matrix,apache-commons,Java,Random,Matrix,Apache Commons,我想生成一个具有N(0,C)分布的随机向量,即均值为0且给定协方差矩阵C的正态分布 我使用的是来自Apache Commons的: double[] means = new double[2]; double[][] C = { { 5.1455479254351755, -2.0050191427617987 }, { -2.0050191427617987, 0.7812776833676598 } }; new MultivariateNormalDistribution(new JDKR

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

我使用的是来自Apache Commons的:

double[] means = new double[2];
double[][] C = {
{ 5.1455479254351755, -2.0050191427617987 },
{ -2.0050191427617987, 0.7812776833676598 } };
new MultivariateNormalDistribution(new JDKRandomGenerator(), means, C);
得到一个异常矩阵是奇异的:

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)
它也不起作用,抛出
nonpositivedefinitematrix异常

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)
线程“main”org.apache.commons.math3.linear.nonpositivedefinitematrix异常:0小于或等于最小值(0):非正定矩阵:索引1处的值0
位于org.apache.commons.math3.linear.choleskydrogration.(choleskydrogration.java:142)
位于org.apache.commons.math3.linear.choleskydrogration.(choleskydrogration.java:85)
在javabbob.experience.main(Experiment.java:59)

对于有类似问题的人:


给了我一些见解。

的在线矩阵计算器给出了
C
矩阵的下三角Cholesky分解,如下所示:

L = { { 2.268380  0.000000},
      {-0.883899  0.000000} };
这意味着您应该能够生成一个标准法线Z和变换,以获得两个相关法线,即X1=2.268380*Z和X2=-0.883899*Z。形式上是X2=-0.883899*Z1+0.000000*Z2,但由于分解中的右下角条目为零,因此不需要第二个独立的Z。如果它们应该为非零,则添加适当的方法

附录


对不起,我以为你在寻找这个特定问题的解决方案。通常,使用分解方差/协方差矩阵C得到下三角“根”L。如果M是均值向量,而Z是独立法线向量,则X=M+LZ将是具有所需均值和方差/协方差结构的相关法线向量。我不熟悉Java,所以您必须找到或实现一个合适的矩阵库。一个快速的web搜索显示了两者,并在Java中实现了Cholesky分解。

我认为这应该可行,但Apache库抛出了
非PositiveDefinitItemAtrixeException
并且没有给出L,请检查我更新的问题。我尝试了NIST,它正在工作!从文档中:如果矩阵不是对称的或正定的,构造函数将返回部分分解:)谢谢!
L = { { 2.268380  0.000000},
      {-0.883899  0.000000} };