我们目前正在评估 OjAlgo 库作为 SVD 计算的 commons-math 库的替代品。对于以下输入,OjAlgo 和 commons-math 的奇异值之间存在差异。
我使用过 OjAlgo 47.1.2 和开发分支的最新代码,但输出仍然相同。这是一个错误吗
double[][] olsColumns = { { 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 },
{ 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0 }, { 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0 },
{ 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, { 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 },
{ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 }, { 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0 },
{ 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0 },
{ 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0 }, { 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0 },
{ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 }, { 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 },
{ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0 } };
double[] observationVector = {26.0, 12.0, 9.0, 18.0, 16.0, 17.0, 24.0, 32.0, 30.0, 21.0, 16.0, 12.0, 21.0, 16.0};
//OjAlgo
final PrimitiveDenseStore tmpOriginal = PrimitiveDenseStore.FACTORY.rows(olsColumns);
SingularValue<Double> tmpSVD = SingularValue.make(tmpOriginal);
tmpSVD.decompose(tmpOriginal);
double[] singularValues = tmpSVD.getSingularValues().toRawCopy1D();
System.out.println("Singular values" + Arrays.toString(singularValues));
//Commons-Math
RealMatrix newPredM = new Array2DRowRealMatrix(olsColumns);
SingularValueDecomposition svd = new SingularValueDecomposition(newPredM);
System.out.println("Singular values" + Arrays.toString(svd.getSingularValues()));
OjAlgo output Singular values[4.000000000000001, 1.4142135623730956, 1.4142135623730951, 1.4142135623730951, 1.4142135623730951, 1.4142135623730945, 1.4142135623730945, 4.566099776030485E-16]
Commons-Math output Singular values[4.000000000000001, 1.4142135623730951, 1.4142135623730951, 1.414213562373095, 1.414213562373095, 1.4142135623730945, 1.4142135623730945, 0.0]
有没有办法使 OjAlgo 奇异值的最后一个值,即 4.566099776030485E-16 为 0.0