source: orange/Orange/OrangeWidgets/Unsupervised/OWExampleDistance.py @ 11316:11da95d603b9

Revision 11316:11da95d603b9, 5.5 KB checked in by Ales Erjavec <ales.erjavec@…>, 14 months ago (diff)

Added "Absolute correlation" option to example distance widget.

Line 
1"""
2<name>Example Distance</name>
3<description>Computes a distance matrix from a set of data examples.</description>
4<icon>icons/Distance.svg</icon>
5<contact>Blaz Zupan (blaz.zupan(@at@)fri.uni-lj.si)</contact>
6<priority>1300</priority>
7"""
8
9import OWGUI
10from OWWidget import *
11
12import Orange
13
14from Orange import distance
15from Orange.utils import progress_bar_milestones
16
17
18class OWExampleDistance(OWWidget):
19    settingsList = ["Metrics", "Normalize"]
20    contextHandlers = {"": DomainContextHandler("", ["Label"])}
21
22    def __init__(self, parent=None, signalManager=None):
23        OWWidget.__init__(self, parent, signalManager, 'ExampleDistance',
24                          wantMainArea=False, resizingEnabled=False)
25
26        self.inputs = [("Data", Orange.data.Table, self.dataset)]
27        self.outputs = [("Distances", Orange.misc.SymMatrix)]
28
29        self.Metrics = 0
30        self.Normalize = True
31        self.Absolute = False
32        self.Label = ""
33        self.loadSettings()
34        self.data = None
35        self.matrix = None
36
37        self.metrics = [
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),
44            ]
45
46        cb = OWGUI.comboBox(
47            self.controlArea, self, "Metrics", box="Distance Metrics",
48            items=[x[0] for x in self.metrics],
49            tooltip=("Choose metrics to measure pairwise distance between "
50                     "examples."),
51            callback=self.distMetricChanged,
52            valueType=str
53        )
54
55        cb.setMinimumWidth(170)
56
57        OWGUI.separator(self.controlArea)
58
59        box = OWGUI.widgetBox(self.controlArea, "Settings",
60                              addSpace=True)
61
62        self.normalizeCB = OWGUI.checkBox(box, self, "Normalize",
63                                          "Normalize data",
64                                          callback=self.computeMatrix)
65
66        self.normalizeCB.setEnabled(self.Metrics in [0, 3])
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",
81            items=[],
82            tooltip="Attribute used for example labels",
83            callback=self.setLabel,
84            sendSelectedValue=True
85        )
86
87        self.labelCombo.setDisabled(True)
88
89        OWGUI.rubber(self.controlArea)
90
91    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
98        self.reportSettings("Settings",
99                            [("Metrics", metric),
100                             ("Label", self.Label)])
101        self.reportData(self.data)
102
103    def distMetricChanged(self):
104        self.normalizeCB.setEnabled(self.Metrics in [0, 3])
105        self.absoluteCB.setEnabled(self.Metrics in [1, 2])
106        self.computeMatrix()
107
108    def computeMatrix(self):
109        if not self.data:
110            return
111
112        data = self.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
122        self.error(0)
123        self.progressBarInit()
124        try:
125            matrix = distance.distance_matrix(data, constructor,
126                                              self.progressBarSet)
127        except Orange.core.KernelException, ex:
128            self.error(0, "Could not create distance matrix! %s" % str(ex))
129            matrix = None
130
131        self.progressBarFinished()
132
133        if matrix:
134            matrix.setattr('items', data)
135
136        self.matrix = matrix
137        self.send("Distances", self.matrix)
138
139    def setLabel(self):
140        for d in self.data:
141            d.name = str(d[str(self.Label)])
142        self.send("Distances", self.matrix)
143
144    def setLabelComboItems(self):
145        d = self.data
146        self.labelCombo.clear()
147        self.labelCombo.setDisabled(0)
148        labels = [m.name for m in d.domain.getmetas().values()] + \
149                 [a.name for a in d.domain.variables]
150        self.labelCombo.addItems(labels)
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]
156        self.setLabel()
157
158    def dataset(self, data):
159        if data and len(data.domain.attributes):
160            self.data = data
161            self.setLabelComboItems()
162            self.computeMatrix()
163        else:
164            self.data = None
165            self.matrix = None
166            self.labelCombo.clear()
167            self.send("Distances", None)
168
169
170if __name__ == "__main__":
171    data = Orange.data.Table('glass')
172    a = QApplication(sys.argv)
173    ow = OWExampleDistance()
174    ow.show()
175    ow.dataset(data)
176    a.exec_()
177    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.