我想生成一个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)
对于有类似问题的人:
答案 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 Commons和NIST都有Java中的Cholesky分解实现。