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)
これは、行列が可逆でないことを意味することをここで読みました。Ok。
しかし、私が欲しいのは、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)
同様の問題を抱えている人のために:
非正定行列 - 原因と治療法は、私にいくつかの洞察を与えてくれました。