Changeset 9035:bcfc7edb435d in orange


Ignore:
Timestamp:
09/27/11 17:20:46 (3 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
f3614c99c72b10d186ca6abffd61074b5e9bed57
Message:

Added more tests for hierarchical clustering, moved k-means test in a separate file.

Location:
testing/unittests/tests
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • testing/unittests/tests/test_hclustering.py

    r8939 r9035  
    1 from Orange.clustering.hierarchical import (clustering, 
    2     clustering_features,  cluster_to_list, 
    3     top_clusters, HierarchicalClustering) 
    4                             
    5 from Orange.clustering.kmeans import Clustering 
     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      
    67from Orange.distance.instances import * 
    78                            
    89import Orange.misc.testing as testing 
    9 import orange 
     10import Orange 
    1011import unittest 
     12 
     13import cPickle as pickle 
    1114 
    1215@testing.datasets_driven 
     
    1518    def test_example_clustering_on(self, data): 
    1619        constructors = [EuclideanConstructor, ManhattanConstructor] 
    17         for distanceConstructor in constructors: 
    18             clust = clustering(data, distanceConstructor, HierarchicalClustering.Single) 
    19             clust = clustering(data, distanceConstructor, HierarchicalClustering.Average) 
    20             clust = clustering(data, distanceConstructor, HierarchicalClustering.Complete) 
    21             clust = clustering(data, distanceConstructor, HierarchicalClustering.Ward) 
     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) 
    2225            top_clust = top_clusters(clust, 5) 
    2326            cluster_list = cluster_to_list(clust, 5) 
     
    2528    @testing.test_on_data 
    2629    def test_attribute_clustering_on(self, data): 
    27         constructors = [EuclideanConstructor, ManhattanConstructor] 
    28         for distanceConstructor in constructors: 
    29             clust = clustering(data) 
    30             cluster_list = cluster_to_list(clust, 5) 
     30        clust = clustering_features(data) 
     31        cluster_list = cluster_to_list(clust, 5) 
    3132             
    3233    @testing.test_on_datasets(datasets=["iris"]) 
    3334    def test_pickling_on(self, data): 
    34 #        data = iter(self.datasets()).next() 
    3535        cluster = clustering(data, EuclideanConstructor, HierarchicalClustering.Single) 
    36         import cPickle 
    37         s = cPickle.dumps(cluster) 
    38         cluster_clone = cPickle.loads(s) 
     36        s = pickle.dumps(cluster) 
     37        cluster_clone = pickle.loads(s) 
     38        self.assertEqual(len(cluster), len(cluster_clone)) 
    3939        self.assertEqual(cluster.mapping, cluster_clone.mapping) 
    4040         
    41 from Orange.clustering import hierarchical as hier 
    42 import Orange 
     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         
    4363 
    4464class TestHClusteringUtility(unittest.TestCase): 
     
    5878        self.cluster = hier.HierarchicalClustering(self.matrix) 
    5979         
     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         
    6085    def test_clone(self): 
    6186        cloned_cluster = hier.clone(self.cluster) 
    6287        self.assertTrue(self.cluster.mapping.objects is cloned_cluster.mapping.objects) 
    6388        self.assertEqual(self.cluster.mapping, cloned_cluster.mapping) 
     89        self.assertEqual(list(self.cluster), list(cloned_cluster)) 
    6490         
    6591    def test_order(self): 
     
    6995    def test_prunning(self): 
    7096        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         
    71100        pruned2 = hier.pruned(self.cluster, height=10) 
     101        self.assertTrue(c.height >= 10 for c in hier.preorder(pruned2)) 
     102         
    72103        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) 
    73131         
    74132 
    75 @testing.datasets_driven 
    76 class TestKMeans(unittest.TestCase): 
    77     @testing.test_on_data 
    78     def test_kmeans_on(self, data): 
    79         km = Clustering(data, 5, maxiters=100, nstart=3) 
    80      
    81      
    82     @unittest.expectedFailure 
    83     def test_kmeans_fail(self): 
    84         """ Test the reaction when centroids is larger then example table length 
    85         """ 
    86         data = iter(testDatasets()).next() 
    87         Clustering(data, len(data) + 1) 
    88          
    89          
    90133if __name__ == "__main__": 
    91134    unittest.main() 
Note: See TracChangeset for help on using the changeset viewer.