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} };