public static SIB fit(SparseArray[] data, int k) {
        return fit(data, k, 100);
    }
@Test
    public void testParseNG20() throws Exception {
        System.out.println("NG20");

        MathEx.setSeed(19650218); // to get repeatable results.

        SparseDataset<Integer> train = Read.libsvm(smile.util.Paths.getTestData("libsvm/news20.dat"));
        SparseDataset<Integer> test = Read.libsvm(smile.util.Paths.getTestData("libsvm/news20.t.dat"));

        SparseArray[] trainx = train.stream().map(SampleInstance::x).toArray(SparseArray[]::new);
        int[] y = train.stream().mapToInt(SampleInstance::y).toArray();
        int[] testy = test.stream().mapToInt(SampleInstance::y).toArray();
            
        SIB model = SIB.fit(trainx, 20);
        System.out.println(model);

        double r = RandIndex.of(y, model.y);
        double r2 = AdjustedRandIndex.of(y, model.y);
        System.out.format("Training rand index = %.2f%%, adjusted rand index = %.2f%%%n", 100.0 * r, 100.0 * r2);
        assertEquals(0.8842, r, 1E-4);
        assertEquals(0.2327, r2, 1E-4);

        System.out.format("MI = %.2f%n", MutualInformation.of(y, model.y));
        System.out.format("NMI.joint = %.2f%%%n", 100 * NormalizedMutualInformation.joint(y, model.y));
        System.out.format("NMI.max = %.2f%%%n", 100 * NormalizedMutualInformation.max(y, model.y));
        System.out.format("NMI.min = %.2f%%%n", 100 * NormalizedMutualInformation.min(y, model.y));
        System.out.format("NMI.sum = %.2f%%%n", 100 * NormalizedMutualInformation.sum(y, model.y));
        System.out.format("NMI.sqrt = %.2f%%%n", 100 * NormalizedMutualInformation.sqrt(y, model.y));

        int[] p = new int[test.size()];
        for (int i = 0; i < test.size(); i++) {
            p[i] = model.predict(test.get(i).x());
        }
            
        r = RandIndex.of(testy, p);
        r2 = AdjustedRandIndex.of(testy, p);
        System.out.format("Testing rand index = %.2f%%, adjusted rand index = %.2f%%%n", 100.0 * r, 100.0 * r2);
        assertEquals(0.8782, r, 1E-4);
        assertEquals(0.2287, r2, 1E-4);

        java.nio.file.Path temp = Write.object(model);
        Read.object(temp);
    }