def test_entropy_nonuniform(self): d = Dist([2, 1]) self.assertTrue(isnan(entropy(d, b=-1.0))) self.assertTrue(isnan(entropy(d, b=-0.5))) self.assertAlmostEqual(0.000000, entropy(d, b=0.0), places=6) self.assertAlmostEqual(-0.918296, entropy(d, b=0.5), places=6) self.assertAlmostEqual(1.569837, entropy(d, b=1.5), places=6) self.assertAlmostEqual(0.918296, entropy(d, b=2), places=6) self.assertAlmostEqual(0.579380, entropy(d, b=3), places=6) self.assertAlmostEqual(0.459148, entropy(d, b=4), places=6) d = Dist([1, 1, 0]) self.assertTrue(isnan(entropy(d, b=-1.0))) self.assertTrue(isnan(entropy(d, b=-0.5))) self.assertAlmostEqual(0.000000, entropy(d, b=0.0), places=6) self.assertAlmostEqual(-1.000000, entropy(d, b=0.5), places=6) self.assertAlmostEqual(1.709511, entropy(d, b=1.5), places=6) self.assertAlmostEqual(1.000000, entropy(d, b=2), places=6) self.assertAlmostEqual(0.630930, entropy(d, b=3), places=6) self.assertAlmostEqual(0.500000, entropy(d, b=4), places=6) d = Dist([2, 2, 1]) self.assertTrue(isnan(entropy(d, b=-1.0))) self.assertTrue(isnan(entropy(d, b=-0.5))) self.assertAlmostEqual(0.000000, entropy(d, b=0.0), places=6) self.assertAlmostEqual(-1.521928, entropy(d, b=0.5), places=6) self.assertAlmostEqual(2.601753, entropy(d, b=1.5), places=6) self.assertAlmostEqual(1.521928, entropy(d, b=2), places=6) self.assertAlmostEqual(0.960230, entropy(d, b=3), places=6) self.assertAlmostEqual(0.760964, entropy(d, b=4), places=6)
def test_conditional_entropy_dependent(self): joint = Dist([10, 70, 15, 5]) x = Dist([80, 20]) y = Dist([25, 75]) self.assertTrue(isnan(conditional_entropy(joint, x, b=-1.0))) self.assertTrue(isnan(conditional_entropy(joint, x, b=-0.5))) self.assertAlmostEqual( 0.000000, conditional_entropy(joint, x, b=0.0), places=6) self.assertAlmostEqual(-0.597107, conditional_entropy(joint, x, b=0.5), places=6) self.assertAlmostEqual( 1.020761, conditional_entropy(joint, x, b=1.5), places=6) self.assertAlmostEqual( 0.597107, conditional_entropy(joint, x, b=2), places=6) self.assertAlmostEqual( 0.376733, conditional_entropy(joint, x, b=3), places=6) self.assertAlmostEqual( 0.298554, conditional_entropy(joint, x, b=4), places=6) self.assertTrue(isnan(conditional_entropy(joint, y, b=-1.0))) self.assertTrue(isnan(conditional_entropy(joint, y, b=-0.5))) self.assertAlmostEqual( 0.000000, conditional_entropy(joint, y, b=0.0), places=6) self.assertAlmostEqual(-0.507757, conditional_entropy(joint, y, b=0.5), places=6) self.assertAlmostEqual( 0.868017, conditional_entropy(joint, y, b=1.5), places=6) self.assertAlmostEqual( 0.507757, conditional_entropy(joint, y, b=2), places=6) self.assertAlmostEqual( 0.320359, conditional_entropy(joint, y, b=3), places=6) self.assertAlmostEqual( 0.253879, conditional_entropy(joint, y, b=4), places=6)
def test_relative_entropy_sizes(self): p = Dist(5) p.tick(0) q = Dist(4) p.tick(1) self.assertTrue(isnan(relative_entropy(p, q))) self.assertTrue(isnan(relative_entropy(q, p)))
def test_relative_entropy_invalid(self): p = Dist(5) q = Dist(5) self.assertTrue(isnan(relative_entropy(p, q))) p.tick(0) self.assertTrue(isnan(relative_entropy(p, q))) self.assertTrue(isnan(relative_entropy(q, p)))
def test_relative_entropy(self): p = Dist([1, 0, 0]) q = Dist([1, 1, 1]) for b in np.arange(2.0, 4.0, 0.5): self.assertAlmostEqual(log(3., b), relative_entropy(p, q, b)) p = Dist([1, 1, 0]) for b in np.arange(2.0, 4.0, 0.5): self.assertAlmostEqual(log(3. / 2., b), relative_entropy(p, q, b)) p = Dist([2, 2, 1]) for b in np.arange(2.0, 4.0, 0.5): self.assertAlmostEqual( (4. * log(6. / 5., b) + log(3. / 5., b)) / 5., relative_entropy(p, q, b)) q = Dist([1, 2, 2]) for b in np.arange(2.0, 4.0, 0.5): self.assertAlmostEqual(log(2., b) / 5., relative_entropy(p, q, b)) p = Dist([1, 0, 0]) q = Dist([4, 1, 0]) for b in np.arange(2.0, 4.0, 0.5): self.assertAlmostEqual(log(5. / 4., b), relative_entropy(p, q, b)) q = Dist([1, 4, 0]) for b in np.arange(2.0, 4.0, 0.5): self.assertAlmostEqual(log(5., b), relative_entropy(p, q, b))
def test_tick_bounds_error(self): d = Dist(2) with self.assertRaises(IndexError): d.tick(-1) with self.assertRaises(IndexError): d.tick(3)
def test_set_negative(self): d = Dist(2) d[0] = 5 self.assertEqual(5, d[0]) d[0] = -1 self.assertEqual(0, d[0])
def test_tick(self): d = Dist(2) self.assertEqual(1, d.tick(0)) self.assertEqual(2, d.tick(0)) self.assertEqual(2, d.counts()) self.assertTrue(d.valid())
def test_set_bounds_error(self): d = Dist(2) with self.assertRaises(IndexError): d[-1] = 3 with self.assertRaises(IndexError): d[3] = 1
def test_alloc_list_copies(self): lst = [0, 0, 0, 0] d = Dist(lst) for i in range(len(d)): d[i] = i self.assertEqual(d[i], i) self.assertEqual(lst[i], 0)
def test_alloc_array_copies(self): arr = np.array([0, 0, 0, 0], dtype=np.uint32) d = Dist(arr) for i in range(len(d)): d[i] = i self.assertEqual(d[i], i) self.assertEqual(arr[i], 0)
def test_probabilify_bounds_error(self): d = Dist(2) d[0] = 1 with self.assertRaises(IndexError): d.probability(-1) with self.assertRaises(IndexError): d.probability(3)
def test_dump(self): d = Dist(5) for i in range(1, len(d)): d[i] = i + 1 self.assertEqual(14, d.counts()) probs = d.dump() self.assertTrue( (probs == np.array([0., 2. / 14, 3. / 14, 4. / 14, 5. / 14])).all())
def test_entropy_delta_function(self): d = Dist([0, 1, 0, 0, 0]) self.assertTrue(isnan(entropy(d, b=-1.0))) self.assertTrue(isnan(entropy(d, b=-0.5))) self.assertAlmostEqual(0.000000, entropy(d, b=0.0), places=6) self.assertAlmostEqual(0.000000, entropy(d, b=0.5), places=6) self.assertAlmostEqual(0.000000, entropy(d, b=1.5), places=6) self.assertAlmostEqual(0.000000, entropy(d, b=2), places=6) self.assertAlmostEqual(0.000000, entropy(d, b=3), places=6) self.assertAlmostEqual(0.000000, entropy(d, b=4), places=6)
def test_relative_entropy_same_dist(self): p = Dist(np.random.randint(0, 100, 20)) self.assertTrue(isnan(relative_entropy(p, p, -1.0))) self.assertTrue(isnan(relative_entropy(p, p, -0.5))) self.assertAlmostEqual(0.000000, relative_entropy(p, p, 0.0), 1e-6) self.assertAlmostEqual(0.000000, relative_entropy(p, p, 0.5), 1e-6) self.assertAlmostEqual(0.000000, relative_entropy(p, p, 1.5), 1e-6) self.assertAlmostEqual(0.000000, relative_entropy(p, p, 2.0), 1e-6) self.assertAlmostEqual(0.000000, relative_entropy(p, p, 3.0), 1e-6) self.assertAlmostEqual(0.000000, relative_entropy(p, p, 4.0), 1e-6)
def test_entropy_uniform(self): d = Dist([1, 1, 1, 1, 1]) self.assertTrue(isnan(entropy(d, b=-1.0))) self.assertTrue(isnan(entropy(d, b=-0.5))) self.assertAlmostEqual(0.000000, entropy(d, b=0.0), places=6) self.assertAlmostEqual(-2.321928, entropy(d, b=0.5), places=6) self.assertAlmostEqual(3.969362, entropy(d, b=1.5), places=6) self.assertAlmostEqual(2.321928, entropy(d, b=2), places=6) self.assertAlmostEqual(1.464974, entropy(d, b=3), places=6) self.assertAlmostEqual(1.160964, entropy(d, b=4), places=6)
def test_valid(self): d = Dist(2) self.assertFalse(d.valid()) d[0] = 2 self.assertTrue(d.valid()) d[1] = 2 self.assertTrue(d.valid()) d[0] = 0 self.assertTrue(d.valid()) d[1] = 0 self.assertFalse(d.valid())
def test_get_and_set(self): d = Dist(2) self.assertEqual(0, d[0]) d[0] = 4 self.assertEqual(4, d[0]) self.assertEqual(0, d[1]) d[1] = 2 self.assertEqual(2, d[1]) self.assertEqual(4, d[0])
def test_resize_shrink(self): d = Dist(5) for i in range(len(d)): d[i] = i + 1 self.assertEqual(5, len(d)) self.assertEqual(15, d.counts()) d.resize(3) self.assertEqual(3, len(d)) self.assertEqual(6, d.counts()) for i in range(len(d)): self.assertEqual(i + 1, d[i])
def test_resize_grow(self): d = Dist(3) for i in range(len(d)): d[i] = i + 1 self.assertEqual(3, len(d)) self.assertEqual(6, d.counts()) d.resize(5) self.assertEqual(5, len(d)) self.assertEqual(6, d.counts()) for i in range(3): self.assertEqual(i + 1, d[i]) for i in range(3, len(d)): self.assertEqual(0, d[i])
def test_conditional_entropy_independent(self): x = Dist([5, 2, 3, 5, 1, 4, 6, 2, 1, 4, 2, 4]) y = Dist([2, 4, 5, 2, 7, 3, 9, 8, 8, 7, 2, 3]) joint = Dist(len(x) * len(y)) for i in range(len(x)): for j in range(len(y)): joint[i * len(y) + j] = x[i] * y[j] self.assertTrue(isnan(conditional_entropy(joint, x, b=-1.0))) self.assertTrue(isnan(conditional_entropy(joint, x, b=-0.5))) self.assertAlmostEqual( 0.00000, conditional_entropy(joint, x, b=0.0), places=6) self.assertAlmostEqual(-3.391029, conditional_entropy(joint, x, b=0.5), places=6) self.assertAlmostEqual( 5.797002, conditional_entropy(joint, x, b=1.5), places=6) self.assertAlmostEqual( 3.391029, conditional_entropy(joint, x, b=2), places=6) self.assertAlmostEqual( 2.139501, conditional_entropy(joint, x, b=3), places=6) self.assertAlmostEqual( 1.695514, conditional_entropy(joint, x, b=4), places=6) self.assertTrue(isnan(conditional_entropy(joint, y, b=-1.0))) self.assertTrue(isnan(conditional_entropy(joint, y, b=-0.5))) self.assertAlmostEqual( 0.00000, conditional_entropy(joint, y, b=0.0), places=6) self.assertAlmostEqual(-3.401199, conditional_entropy(joint, y, b=0.5), places=6) self.assertAlmostEqual( 5.814387, conditional_entropy(joint, y, b=1.5), places=6) self.assertAlmostEqual( 3.401199, conditional_entropy(joint, y, b=2), places=6) self.assertAlmostEqual( 2.145917, conditional_entropy(joint, y, b=3), places=6) self.assertAlmostEqual( 1.700599, conditional_entropy(joint, y, b=4), places=6)
def test_copy(self): d = Dist(5) for i in range(len(d)): d[i] = i + 1 self.assertEqual(5, len(d)) self.assertEqual(15, d.counts()) e = d.copy() self.assertEqual(5, len(d)) self.assertEqual(15, d.counts()) for i in range(len(d)): self.assertEqual(e[i], d[i]) d[0] = 5 self.assertNotEqual(e[0], d[0])
def test_counts(self): d = Dist(2) self.assertEqual(0, d.counts()) d[0] = 3 self.assertEqual(3, d.counts()) d[0] = 2 self.assertEqual(2, d.counts()) d[1] = 3 self.assertEqual(5, d.counts()) d[0] = 0 d[1] = 0 self.assertEqual(0, d.counts())
def test_dump_invalid(self): d = Dist(2) with self.assertRaises(ValueError): d.dump()
def test_resize_zero(self): d = Dist(3) with self.assertRaises(ValueError): d.resize(0)
def test_resize_negative(self): d = Dist(3) with self.assertRaises(ValueError): d.resize(-1)
def test_alloc_array(self): arr = np.array([1, 1, 2, 2], dtype=np.uint32) d = Dist(arr) self.assertEqual(4, len(d)) for i in range(len(arr)): self.assertEqual(arr[i], d[i])
def test_alloc_list(self): lst = [1, 1, 2, 2] d = Dist(lst) self.assertEqual(4, len(d)) for i in range(len(d)): self.assertEqual(lst[i], d[i])
def test_alloc_size(self): d = Dist(5) self.assertEqual(5, d.__len__()) self.assertEqual(5, len(d))
def test_alloc_mulitdimensional(self): with self.assertRaises(ValueError): Dist([[1, 1, 2, 2]]) with self.assertRaises(ValueError): Dist(np.array([[1, 1, 2, 2]]))