/** test that U is orthogonal */ @Test public void testUOrthogonal() { checkOrthogonal(new SingularValueDecomposition(new DenseMatrix(testSquare)).getU()); checkOrthogonal(new SingularValueDecomposition(new DenseMatrix(testNonSquare)).getU()); checkOrthogonal(new SingularValueDecomposition(new DenseMatrix(testNonSquare).transpose()).getU()); }
/** test that V is orthogonal */ @Test public void testVOrthogonal() { checkOrthogonal(new SingularValueDecomposition(new DenseMatrix(testSquare)).getV()); checkOrthogonal(new SingularValueDecomposition(new DenseMatrix(testNonSquare)).getV()); checkOrthogonal(new SingularValueDecomposition(new DenseMatrix(testNonSquare).transpose()).getV()); }
/** test condition number */ @Test public void testConditionNumber() { SingularValueDecomposition svd = new SingularValueDecomposition(new DenseMatrix(testSquare)); // replace 1.0e-15 with 1.5e-15 assertEquals(3.0, svd.cond(), 1.5e-15); }
@Test public void testSvdHang() throws IOException, InterruptedException, ExecutionException, TimeoutException { System.out.printf("starting hanging-svd\n"); final Matrix m = readTsv("hanging-svd.tsv"); SingularValueDecomposition svd = new SingularValueDecomposition(m); assertEquals(0, m.minus(svd.getU().times(svd.getS()).times(svd.getV().transpose())).aggregate(Functions.PLUS, Functions.ABS), 1e-10); System.out.printf("No hang\n"); }
public SequentialBigSvd(Matrix A, int p) { // Y = A * \Omega y = A.times(new RandomTrinaryMatrix(A.columnSize(), p)); // R'R = Y' Y cd1 = new CholeskyDecomposition(y.transpose().times(y)); // B = Q" A = (Y R^{-1} )' A b = cd1.solveRight(y).transpose().times(A); // L L' = B B' cd2 = new CholeskyDecomposition(b.times(b.transpose())); // U_0 D V_0' = L svd = new SingularValueDecomposition(cd2.getL()); }
@Test public void testMoreColumns() { double[] singularValues = { 123.456, 2.3, 1.001, 0.999 }; int rows = singularValues.length; int columns = singularValues.length + 2; Random r = RandomUtils.getRandom(); SingularValueDecomposition svd = new SingularValueDecomposition(createTestMatrix(r, rows, columns, singularValues)); double[] computedSV = svd.getSingularValues(); assertEquals(singularValues.length, computedSV.length); for (int i = 0; i < singularValues.length; ++i) { assertEquals(singularValues[i], computedSV[i], 1.0e-10); } }
@Test public void testMoreRows() { double[] singularValues = { 123.456, 2.3, 1.001, 0.999 }; int rows = singularValues.length + 2; int columns = singularValues.length; Random r = RandomUtils.getRandom(); SingularValueDecomposition svd = new SingularValueDecomposition(createTestMatrix(r, rows, columns, singularValues)); double[] computedSV = svd.getSingularValues(); assertEquals(singularValues.length, computedSV.length); for (int i = 0; i < singularValues.length; ++i) { assertEquals(singularValues[i], computedSV[i], 1.0e-10); } }
@Test public void testRightVectors() { Matrix A = lowRankMatrix(); SequentialBigSvd s = new SequentialBigSvd(A, 6); SingularValueDecomposition svd = new SingularValueDecomposition(A); Matrix v1 = svd.getV().viewPart(0, 20, 0, 3).assign(Functions.ABS); Matrix v2 = s.getV().viewPart(0, 20, 0, 3).assign(Functions.ABS); assertEquals(v1, v2); }
@Test public void testLeftVectors() { Matrix A = lowRankMatrix(); SequentialBigSvd s = new SequentialBigSvd(A, 8); SingularValueDecomposition svd = new SingularValueDecomposition(A); // can only check first few singular vectors because once the singular values // go to zero, the singular vectors are not uniquely determined Matrix u1 = svd.getU().viewPart(0, 20, 0, 4).assign(Functions.ABS); Matrix u2 = s.getU().viewPart(0, 20, 0, 4).assign(Functions.ABS); assertEquals(0, u1.minus(u2).aggregate(Functions.PLUS, Functions.ABS), 1.0e-9); }
@Test public void testSingularValues() { Matrix A = lowRankMatrix(); SequentialBigSvd s = new SequentialBigSvd(A, 8); SingularValueDecomposition svd = new SingularValueDecomposition(A); Vector reference = new DenseVector(svd.getSingularValues()).viewPart(0, 8); assertEquals(reference, s.getSingularValues()); assertEquals(A, s.getU().times(new DiagonalMatrix(s.getSingularValues())).times(s.getV().transpose())); }
@Test public void random() { Matrix m = new DenseMatrix(200, 30).assign(Functions.random()); Vector b = new DenseVector(200).assign(1); LSMR r = new LSMR(); Vector x1 = r.solve(m, b); // assertEquals(0, m.times(x1).minus(b).norm(2), 1.0e-2); double norm = new SingularValueDecomposition(m).getS().viewDiagonal().norm(2); double actual = m.transpose().times(m).times(x1).minus(m.transpose().times(b)).norm(2); System.out.printf("%.4f\n", actual / norm * 1.0e6); assertEquals(0, actual, norm * 1.0e-5); // and we need to check that the error estimates are pretty good. assertEquals(m.times(x1).minus(b).norm(2), r.getResidualNorm(), 1.0e-5); assertEquals(actual, r.getNormalEquationResidual(), 1.0e-9); }
/** test dimensions */ @Test public void testDimensions() { Matrix matrix = new DenseMatrix(testSquare); int m = matrix.numRows(); int n = matrix.numCols(); SingularValueDecomposition svd = new SingularValueDecomposition(matrix); assertEquals(m, svd.getU().numRows()); assertEquals(m, svd.getU().numCols()); assertEquals(m, svd.getS().numCols()); assertEquals(n, svd.getS().numCols()); assertEquals(n, svd.getV().numRows()); assertEquals(n, svd.getV().numCols()); }
/** test matrices values */ @Test public void testMatricesValues1() { SingularValueDecomposition svd = new SingularValueDecomposition(new DenseMatrix(testSquare)); Matrix uRef = new DenseMatrix(new double[][] { { 3.0 / 5.0, 4.0 / 5.0 }, { 4.0 / 5.0, -3.0 / 5.0 } }); Matrix sRef = new DenseMatrix(new double[][] { { 3.0, 0.0 }, { 0.0, 1.0 } }); Matrix vRef = new DenseMatrix(new double[][] { { 4.0 / 5.0, -3.0 / 5.0 }, { 3.0 / 5.0, 4.0 / 5.0 } }); // check values against known references Matrix u = svd.getU(); assertEquals(0, Algebra.getNorm(u.minus(uRef)), NORM_TOLERANCE); Matrix s = svd.getS(); assertEquals(0, Algebra.getNorm(s.minus(sRef)), NORM_TOLERANCE); Matrix v = svd.getV(); assertEquals(0, Algebra.getNorm(v.minus(vRef)), NORM_TOLERANCE); }
{ 3.0 / 2.0, 9.0 / 2.0, 5.0 / 2.0, 15.0 / 2.0 } }); SingularValueDecomposition svd = new SingularValueDecomposition(matrix); assertEquals(16.0, svd.getSingularValues()[0], 1.0e-14); assertEquals( 8.0, svd.getSingularValues()[1], 1.0e-14);
public static void checkAEqualUSVt(Matrix matrix) { SingularValueDecomposition svd = new SingularValueDecomposition(matrix); Matrix u = svd.getU(); Matrix s = svd.getS();
/** test that U is orthogonal */ @Test public void testUOrthogonal() { checkOrthogonal(new SingularValueDecomposition(new DenseMatrix(testSquare)).getU()); checkOrthogonal(new SingularValueDecomposition(new DenseMatrix(testNonSquare)).getU()); checkOrthogonal(new SingularValueDecomposition(new DenseMatrix(testNonSquare).transpose()).getU()); }
public SequentialBigSvd(Matrix A, int p) { // Y = A * \Omega y = A.times(new RandomTrinaryMatrix(A.columnSize(), p)); // R'R = Y' Y cd1 = new CholeskyDecomposition(y.transpose().times(y)); // B = Q" A = (Y R^{-1} )' A b = cd1.solveRight(y).transpose().times(A); // L L' = B B' cd2 = new CholeskyDecomposition(b.times(b.transpose())); // U_0 D V_0' = L svd = new SingularValueDecomposition(cd2.getL()); }
@Test public void testRightVectors() { Matrix A = lowRankMatrix(); SequentialBigSvd s = new SequentialBigSvd(A, 6); SingularValueDecomposition svd = new SingularValueDecomposition(A); Matrix v1 = svd.getV().viewPart(0, 20, 0, 3).assign(Functions.ABS); Matrix v2 = s.getV().viewPart(0, 20, 0, 3).assign(Functions.ABS); assertEquals(v1, v2); }
@Test public void testRightVectors() throws IOException { Matrix A = lowRankMatrixInMemory(20, 20); SequentialBigSvd s = new SequentialBigSvd(A, 6); SingularValueDecomposition svd = new SingularValueDecomposition(A); Matrix v1 = svd.getV().viewPart(0, 20, 0, 3).assign(Functions.ABS); Matrix v2 = s.getV().viewPart(0, 20, 0, 3).assign(Functions.ABS); assertEquals(v1, v2); }
@Test public void testSingularValues() { Matrix A = lowRankMatrix(); SequentialBigSvd s = new SequentialBigSvd(A, 8); SingularValueDecomposition svd = new SingularValueDecomposition(A); Vector reference = new DenseVector(svd.getSingularValues()).viewPart(0, 8); assertEquals(reference, s.getSingularValues()); assertEquals(A, s.getU().times(new DiagonalMatrix(s.getSingularValues())).times(s.getV().transpose())); }