source: orange/Orange/testing/unit/tests/test_hclustering.py @ 10655:a228b55811a4

Revision 10655:a228b55811a4, 5.3 KB checked in by markotoplak, 2 years ago (diff)

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