source: orange/Orange/testing/unit/tests/test_hclustering.py @ 9679:3879dea56188

Revision 9679:3879dea56188, 5.5 KB checked in by Miha Stajdohar <miha.stajdohar@…>, 2 years ago (diff)

Moved and renamed testing.

Line 
1from Orange.clustering.hierarchical import clustering, \
2    clustering_features,  cluster_to_list, \
3    top_clusters, HierarchicalClustering, order_leaves_py, \
4    order_leaves_cpp, instance_distance_matrix
5                     
6from Orange.clustering import hierarchical as hier     
7from Orange.distance.instances import *
8                           
9import Orange.misc.testing as testing
10import Orange
11import unittest
12
13import cPickle as pickle
14
15@testing.datasets_driven
16class TestHClustering(testing.DataTestCase):   
17    @testing.test_on_data
18    def test_example_clustering_on(self, data):
19        constructors = [EuclideanConstructor, ManhattanConstructor]
20        for distance_constructor in constructors:
21            clust = clustering(data, distance_constructor, HierarchicalClustering.Single)
22            clust = clustering(data, distance_constructor, HierarchicalClustering.Average)
23            clust = clustering(data, distance_constructor, HierarchicalClustering.Complete)
24            clust = clustering(data, distance_constructor, HierarchicalClustering.Ward)
25            top_clust = top_clusters(clust, 5)
26            cluster_list = cluster_to_list(clust, 5)
27           
28    @testing.test_on_data
29    def test_attribute_clustering_on(self, data):
30        clust = clustering_features(data)
31        cluster_list = cluster_to_list(clust, 5)
32           
33    @testing.test_on_datasets(datasets=["iris"])
34    def test_pickling_on(self, data):
35        cluster = clustering(data, EuclideanConstructor, HierarchicalClustering.Single)
36        s = pickle.dumps(cluster)
37        cluster_clone = pickle.loads(s)
38        self.assertEqual(len(cluster), len(cluster_clone))
39        self.assertEqual(cluster.mapping, cluster_clone.mapping)
40       
41    @testing.test_on_data
42    def test_ordering_on(self, data):
43        def p(val, obj=None):
44            self.assert_(val >= 0 and val <=100)
45            self.assertIsInstance(val, float)
46        matrix = instance_distance_matrix(data, EuclideanConstructor(), progress_callback=p)
47        root1 = HierarchicalClustering(matrix, progress_callback=p)
48        root2 = hier.clone(root1)
49       
50        order_leaves_py(root1, matrix, progressCallback=p)
51        order_leaves_cpp(root2, matrix, progress_callback=p)
52       
53        def score(mapping):
54            sum = 0.0
55            for i in range(matrix.dim - 1):
56               sum += matrix[mapping[i], mapping[i+1]]
57            return sum
58       
59        # Slight differences are possible due to the float/double precision.
60        self.assertAlmostEqual(score(root1.mapping), score(root2.mapping),
61                               places=3)
62       
63
64class TestHClusteringUtility(unittest.TestCase):
65    def setUp(self):
66        m = [[],
67             [ 3],
68             [ 2,  4],
69             [17,  5,  4],
70             [ 2,  8,  3,  8],
71             [ 7,  5, 10, 11, 2],
72             [ 8,  4,  1,  5, 11, 13],
73             [ 4,  7, 12,  8, 10,  1,  5],
74             [13,  9, 14, 15,  7,  8,  4,  6],
75             [12, 10, 11, 15,  2,  5,  7,  3,  1]]
76        self.matrix = Orange.core.SymMatrix(m)
77        self.matrix.setattr("objects", ["Ann", "Bob", "Curt", "Danny", "Eve", "Fred", "Greg", "Hue", "Ivy", "Jon"])
78        self.cluster = hier.HierarchicalClustering(self.matrix)
79       
80    def test_objects_mapping(self):
81        objects = self.cluster.mapping.objects
82        self.assertEqual(list(self.cluster),
83                         [objects[i] for i in self.cluster.mapping])
84       
85    def test_clone(self):
86        cloned_cluster = hier.clone(self.cluster)
87        self.assertTrue(self.cluster.mapping.objects is cloned_cluster.mapping.objects)
88        self.assertEqual(self.cluster.mapping, cloned_cluster.mapping)
89        self.assertEqual(list(self.cluster), list(cloned_cluster))
90       
91    def test_order(self):
92        post = hier.postorder(self.cluster)
93        pre = hier.preorder(self.cluster)
94       
95    def test_prunning(self):
96        pruned1 = hier.pruned(self.cluster, level=2)
97        depths = hier.cluster_depths(pruned1)
98        self.assertTrue(all(d <= 2 for d in depths.values()))
99       
100        pruned2 = hier.pruned(self.cluster, height=10)
101        self.assertTrue(c.height >= 10 for c in hier.preorder(pruned2))
102       
103        pruned3 = hier.pruned(self.cluster, condition=lambda cl: len(cl) <= 3)
104        self.assertTrue(len(c) > 3 for c in hier.preorder(pruned3))
105       
106    def test_dendrogram_draw(self):
107        from StringIO import StringIO
108        file = StringIO()
109        hier.dendrogram_draw(file, self.cluster, format="svg")
110        self.assertTrue(len(file.getvalue()))
111        file = StringIO()
112        hier.dendrogram_draw(file, self.cluster, format="eps")
113        self.assertTrue(len(file.getvalue()))
114        file = StringIO()
115        hier.dendrogram_draw(file, self.cluster, format="png")
116        self.assertTrue(len(file.getvalue()))
117       
118    def test_dendrogram_layout(self):
119        hier.dendrogram_layout(self.cluster)
120        pruned1 = hier.pruned(self.cluster, level=2)
121        hier.dendrogram_layout(pruned1, expand_leaves=True)
122        hier.dendrogram_layout(pruned1, expand_leaves=False)
123        pruned2 = hier.pruned(self.cluster, height=10)
124        hier.dendrogram_layout(pruned2, expand_leaves=True)
125        hier.dendrogram_layout(pruned2, expand_leaves=False)
126       
127    def test_cophenetic(self):
128        cmatrix = hier.cophenetic_distances(self.cluster)
129        self.assertEqual(cmatrix.dim, self.matrix.dim)
130        corr = hier.cophenetic_correlation(self.cluster, self.matrix)
131       
132
133if __name__ == "__main__":
134    unittest.main()
135       
136           
Note: See TracBrowser for help on using the repository browser.