Ignore:
Timestamp:
02/15/13 15:29:25 (14 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Added "Absolute correlation" option to example distance widget.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeWidgets/Unsupervised/OWExampleDistance.py

    r11217 r11316  
    66<priority>1300</priority> 
    77""" 
    8 import orange, math 
     8 
    99import OWGUI 
    1010from OWWidget import * 
    11 import random 
    12 import orngClustering 
    13 import orngMisc 
    1411 
    15 ############################################################################## 
    16 # main class 
     12import Orange 
     13 
     14from Orange import distance 
     15from Orange.utils import progress_bar_milestones 
     16 
    1717 
    1818class OWExampleDistance(OWWidget): 
     
    2020    contextHandlers = {"": DomainContextHandler("", ["Label"])} 
    2121 
    22     def __init__(self, parent=None, signalManager = None): 
    23         OWWidget.__init__(self, parent, signalManager, 'ExampleDistance', wantMainArea = 0, resizingEnabled = 0) 
     22    def __init__(self, parent=None, signalManager=None): 
     23        OWWidget.__init__(self, parent, signalManager, 'ExampleDistance', 
     24                          wantMainArea=False, resizingEnabled=False) 
    2425 
    25         self.inputs = [("Data", ExampleTable, self.dataset)] 
    26         self.outputs = [("Distances", orange.SymMatrix)] 
     26        self.inputs = [("Data", Orange.data.Table, self.dataset)] 
     27        self.outputs = [("Distances", Orange.misc.SymMatrix)] 
    2728 
    2829        self.Metrics = 0 
    2930        self.Normalize = True 
     31        self.Absolute = False 
    3032        self.Label = "" 
    3133        self.loadSettings() 
     
    3436 
    3537        self.metrics = [ 
    36             ("Euclidean", orange.ExamplesDistanceConstructor_Euclidean), 
    37             ("Pearson Correlation", orngClustering.ExamplesDistanceConstructor_PearsonR), 
    38             ("Spearman Rank Correlation", orngClustering.ExamplesDistanceConstructor_SpearmanR), 
    39             ("Manhattan", orange.ExamplesDistanceConstructor_Manhattan), 
    40             ("Hamming", orange.ExamplesDistanceConstructor_Hamming), 
    41             ("Relief", orange.ExamplesDistanceConstructor_Relief), 
     38            ("Euclidean", distance.Euclidean), 
     39            ("Pearson Correlation", distance.PearsonR), 
     40            ("Spearman Rank Correlation", distance.SpearmanR), 
     41            ("Manhattan", distance.Manhattan), 
     42            ("Hamming", distance.Hamming), 
     43            ("Relief", distance.Relief), 
    4244            ] 
    4345 
    44         cb = OWGUI.comboBox(self.controlArea, self, "Metrics", box="Distance Metrics", 
     46        cb = OWGUI.comboBox( 
     47            self.controlArea, self, "Metrics", box="Distance Metrics", 
    4548            items=[x[0] for x in self.metrics], 
    46             tooltip="Choose metrics to measure pairwise distance between examples.", 
    47             callback=self.distMetricChanged, valueType=str) 
     49            tooltip=("Choose metrics to measure pairwise distance between " 
     50                     "examples."), 
     51            callback=self.distMetricChanged, 
     52            valueType=str 
     53        ) 
     54 
    4855        cb.setMinimumWidth(170) 
    49          
     56 
    5057        OWGUI.separator(self.controlArea) 
    51          
    52         box = OWGUI.widgetBox(self.controlArea, "Normalization",  
     58 
     59        box = OWGUI.widgetBox(self.controlArea, "Settings", 
    5360                              addSpace=True) 
    54         self.normalizeCB = OWGUI.checkBox(box, self, "Normalize", "Normalize data",  
     61 
     62        self.normalizeCB = OWGUI.checkBox(box, self, "Normalize", 
     63                                          "Normalize data", 
    5564                                          callback=self.computeMatrix) 
    56          
     65 
    5766        self.normalizeCB.setEnabled(self.Metrics in [0, 3]) 
    58          
    59         self.labelCombo = OWGUI.comboBox(self.controlArea, self, "Label", box="Example Label", 
     67 
     68        self.absoluteCB = OWGUI.checkBox( 
     69            box, self, "Absolute", 
     70            "Absolute correlations", 
     71            tooltip=("Use absolute correlations " 
     72                     "for distances."), 
     73            callback=self.computeMatrix 
     74        ) 
     75 
     76        self.absoluteCB.setEnabled(self.Metrics in [1, 2]) 
     77 
     78        self.labelCombo = OWGUI.comboBox( 
     79            self.controlArea, self, "Label", 
     80            box="Example Label", 
    6081            items=[], 
    6182            tooltip="Attribute used for example labels", 
    62             callback=self.setLabel, sendSelectedValue = 1) 
     83            callback=self.setLabel, 
     84            sendSelectedValue=True 
     85        ) 
    6386 
    64         self.labelCombo.setDisabled(1) 
    65          
     87        self.labelCombo.setDisabled(True) 
     88 
    6689        OWGUI.rubber(self.controlArea) 
    6790 
    6891    def sendReport(self): 
     92        metric = self.metrics[self.Metrics][0] 
     93        if self.Metrics in [0, 3] and self.Normalize: 
     94            metric = "Normalized " + metric 
     95        elif self.Metrics in [1, 2] and self.Absolute: 
     96            metric = "Absolute " + metric 
     97 
    6998        self.reportSettings("Settings", 
    70                             [("Metrics", self.metrics[self.Metrics][0]), 
     99                            [("Metrics", metric), 
    71100                             ("Label", self.Label)]) 
    72101        self.reportData(self.data) 
     
    74103    def distMetricChanged(self): 
    75104        self.normalizeCB.setEnabled(self.Metrics in [0, 3]) 
     105        self.absoluteCB.setEnabled(self.Metrics in [1, 2]) 
    76106        self.computeMatrix() 
    77107 
     
    79109        if not self.data: 
    80110            return 
     111 
    81112        data = self.data 
    82         constructor = self.metrics[self.Metrics][1]() 
    83         constructor.normalize = self.Normalize 
    84         dist = constructor(data) 
     113        if self.Metrics in [1, 2] and self.Absolute: 
     114            if self.Metrics == 1: 
     115                constructor = distance.PearsonRAbsolute() 
     116            else: 
     117                constructor = distance.SpearmanRAbsolute() 
     118        else: 
     119            constructor = self.metrics[self.Metrics][1]() 
     120            constructor.normalize = self.Normalize 
     121 
    85122        self.error(0) 
     123        self.progressBarInit() 
    86124        try: 
    87             self.matrix = orange.SymMatrix(len(data)) 
    88         except orange.KernelException, ex: 
     125            matrix = distance.distance_matrix(data, constructor, 
     126                                              self.progressBarSet) 
     127        except Orange.core.KernelException, ex: 
    89128            self.error(0, "Could not create distance matrix! %s" % str(ex)) 
    90             self.matrix = None 
    91             self.send("Distances", None) 
    92             return 
    93         self.matrix.setattr('items', data) 
    94         pb = OWGUI.ProgressBar(self, 100) 
    95         milestones  = orngMisc.progressBarMilestones(len(data)*(len(data)-1)/2, 100) 
    96         count = 0 
    97         for i in range(len(data)): 
    98             for j in range(i+1): 
    99                 self.matrix[i, j] = dist(data[i], data[j]) 
    100                 if count in milestones: 
    101                     pb.advance() 
    102                 count += 1 
    103         pb.finish() 
     129            matrix = None 
     130 
     131        self.progressBarFinished() 
     132 
     133        if matrix: 
     134            matrix.setattr('items', data) 
     135 
     136        self.matrix = matrix 
    104137        self.send("Distances", self.matrix) 
    105138 
     
    116149                 [a.name for a in d.domain.variables] 
    117150        self.labelCombo.addItems(labels) 
    118         # here we would need to use the domain dependent setting of the label id 
    119         self.labelCombo.setCurrentIndex(0); self.Label = labels[0] 
     151 
     152        # here we would need to use the domain dependent setting of the 
     153        # label id 
     154        self.labelCombo.setCurrentIndex(0) 
     155        self.Label = labels[0] 
    120156        self.setLabel() 
    121157 
     
    126162            self.computeMatrix() 
    127163        else: 
     164            self.data = None 
     165            self.matrix = None 
     166            self.labelCombo.clear() 
    128167            self.send("Distances", None) 
    129168 
    130 ################################################################################################## 
    131 # test script 
    132169 
    133 if __name__=="__main__": 
    134     import os 
    135     data = orange.ExampleTable(r'../../doc/datasets/glass') 
    136     data = orange.ExampleTable('glass') 
     170if __name__ == "__main__": 
     171    data = Orange.data.Table('glass') 
    137172    a = QApplication(sys.argv) 
    138173    ow = OWExampleDistance() 
Note: See TracChangeset for help on using the changeset viewer.