예제 #1
0
    def test_first_hill(self):
        # typical bimodal distribution
        data = np.concatenate([self.dist_norm1, self.dist_norm2])[:,
                                                                  np.newaxis]
        estimator = KernelDensity(kernel='gaussian', bandwidth=0.5)
        kde = estimator.fit(data)
        x, y = Analyze.density_func(data, kde, 100)
        obs_x, obs_y = Analyze.first_hill(x, y)
        exp_x, exp_y = 1.0971012583068704, 2.5302323352207674
        self.assertAlmostEqual(obs_x, exp_x)
        self.assertAlmostEqual(obs_y, exp_y)

        # peak larger than valley
        data = np.negative(data)
        kde = estimator.fit(data)
        x, y = Analyze.density_func(data, kde, 100)
        with self.assertRaises(ValueError) as ctx:
            Analyze.first_hill(x, y)
        msg = 'Peak is larger than valley.'
        self.assertEqual(str(ctx.exception), msg)

        # unimodal distribution
        data = self.dist_norm1[:, np.newaxis]
        kde = estimator.fit(data)
        x, y = Analyze.density_func(data, kde, 100)
        with self.assertRaises(ValueError) as ctx:
            Analyze.first_hill(x, y)
        msg = 'Cannot identify at least two peaks.'
        self.assertEqual(str(ctx.exception), msg)
예제 #2
0
 def test_plot_density(self):
     data = np.concatenate([self.dist_norm1, self.dist_norm2])[:,
                                                               np.newaxis]
     estimator = KernelDensity(kernel='gaussian', bandwidth=0.5)
     kde = estimator.fit(data)
     x, y = Analyze.density_func(data, kde, 100)
     peak, valley = Analyze.first_hill(x, y)
     th = valley - (valley - peak) * 0.5 / 100
     fp = join(self.tmpdir, 'tmp.png')
     Analyze.plot_density(x, y, peak, valley, th, fp)
     self.assertTrue(isfile(fp))
     remove(fp)