source: orange/Orange/OrangeWidgets/Data/OWOutliers.py @ 11748:467f952c108d

Revision 11748:467f952c108d, 5.8 KB checked in by blaz <blaz.zupan@…>, 6 months ago (diff)

Changes in headers, widget descriptions text.

RevLine 
[8042]1from OWWidget import *
2import OWGUI, orange
3import orngOutlier
4from exceptions import Exception
5
[11748]6NAME = "Outliers"
7DESCRIPTION = """Identifies data instances distant from other observations."""
8LONG_DESCRIPTION = ""
9ICON = "icons/Outliers.svg"
10PRIORITY = 2150
11AUTHOR = "Marko Toplak"
12AUTHOR_EMAIL = "marko.toplak(@at@)gmail.com"
13INPUTS = [("Data", Orange.data.Table, "cdata", Default),
14          ("Distances", orange.SymMatrix, "cdistance", Default)]
15OUTPUTS = [("Outliers", Orange.data.Table, Default),
16           ("Inliers", Orange.data.Table),
17           ("Data with z-score", Orange.data.Table)]
18
19
[8042]20##############################################################################
21
22class OWOutliers(OWWidget):
23    settingsList = ["zscore", "metric", "k"]
24   
25    def __init__(self, parent=None, signalManager = None, name='Outlier'):
[11748]26        OWWidget.__init__(self, parent, signalManager, name, wantMainArea=0)
[8042]27
[11748]28        self.inputs = [("Data", ExampleTable, self.cdata),
29                       ("Distances", orange.SymMatrix, self.cdistance)]
30        self.outputs = [("Outliers", ExampleTable),
31                        ("Inliers", ExampleTable),
32                        ("Data with z-score", ExampleTable)]
[8042]33               
34        # Settings
35        self.zscore = '4.0'
36        self.k = 1
37        self.metric = 0
38        self.loadSettings()
39       
40        self.haveInput = 0
41        self.data = None                    # input data set
42        self.dataInput = None
43        self.distanceMatrix = None
44       
45        kernelSizeValid = QDoubleValidator(self.controlArea)
46
47
[11748]48        self.metrics = [("Euclidean",
49                         orange.ExamplesDistanceConstructor_Euclidean),
50                        ("Manhattan",
51                         orange.ExamplesDistanceConstructor_Manhattan),
52                        ("Hamming",
53                         orange.ExamplesDistanceConstructor_Hamming),
54                        ("Relief",
55                         orange.ExamplesDistanceConstructor_Relief)]
[8042]56
57        self.ks = [("All",0), ("1", 1), ("2",2), ("3",3), ("5",5), ("10",10), ("15",15)]
58        items = [x[0] for x in self.metrics]
59        itemsk = [x[0] for x in self.ks]
60       
[11748]61        OWGUI.comboBox(self.controlArea, self, "metric",
62                       box="Distance Metrics", items=items,
[8042]63                       tooltip="Metrics to measure pairwise distance between data instances.",
64                       callback=self.dataChange)
65
66        OWGUI.separator(self.controlArea)
[11748]67        OWGUI.comboBox(self.controlArea, self, "k",
68                       box="Nearest Neighbours", items=itemsk,
[8042]69                       tooltip="Neighbours considered when computing the distance.",
70                       callback=self.applySettings)
71
72        OWGUI.separator(self.controlArea)
73        box = OWGUI.widgetBox(self.controlArea, "Outliers")
74        OWGUI.lineEdit(box, self, 'zscore',
75                       label = 'Outlier Z:', labelWidth=80,
76                       orientation='horizontal', # box=None,
77                       validator = kernelSizeValid,
78                       tooltip="Minimum Z-score of an outlier.",
79                       callback=self.applySettings)
80
81        OWGUI.rubber(self.controlArea)
82       
83        self.loadSettings()
84     
85        self.resize(100,100)
86        self.applySettings()
87
88    def activateLoadedSettings(self):
89        self.applySettings()
90
91    def applySettings(self):             
92        """use the setting from the widget, identify the outliers"""
93        if self.haveInput == 1:
94            outlier = self.outlier
95            outlier.setKNN(self.ks[self.k][1])
96       
97            newdomain = orange.Domain(self.data.domain)
98            newdomain.addmeta(orange.newmetaid(), orange.FloatVariable("Z score"))
99           
100            self.newdata = orange.ExampleTable(newdomain, self.data)
101
102            zv = outlier.zValues()
103            for i, el in enumerate(zv):
104                self.newdata[i]["Z score"] = el           
105
[9549]106            self.send("Data with z-score", self.newdata)
[8042]107           
108            filterout = orange.Filter_values(domain=self.newdata.domain)
109            filterout["Z score"] = (orange.Filter_values.Greater, eval(self.zscore))
110            outliers = filterout(self.newdata)
111
112            filterin = orange.Filter_values(domain=self.newdata.domain)
113            filterin["Z score"] = (orange.Filter_values.LessEqual, eval(self.zscore))
114            inliers = filterin(self.newdata)
115           
116            self.send("Outliers", outliers)
117            self.send("Inliers", inliers)
118        else:
[9549]119            self.send("Data with z-score", None)
[8042]120            self.send("Outliers", None)
121            self.send("Inliers", None)
122 
123    def cdata(self, data):
124        """handles examples input signal"""
125        self.dataInput = data
126        self.dataChange()
127
128    def cdistance(self, distances):
129        """handles distance matrix input signal"""
130        self.distanceMatrix = distances
131        self.dataChange()
132       
133    def dataChange(self):
134        self.haveInput = 0       
135        outlier = orngOutlier.OutlierDetection()
136       
137        if self.distanceMatrix is not None:
138            outlier.setDistanceMatrix(self.distanceMatrix) 
139            self.data=getattr(self.distanceMatrix, "items")
140            self.haveInput = 1     
141        elif self.dataInput is not None:
142            self.data = self.dataInput
[11748]143            outlier.setExamples(self.data,
144                                self.metrics[self.metric][1](self.data))
[8042]145            self.haveInput = 1
146        else:
147            self.data = None
148        self.outlier = outlier
149        self.applySettings()
150
151##############################################################################
152# Test the widget, run from DOS prompt
153
154if __name__=="__main__":
155    a=QApplication(sys.argv)
156    ow=OWOutliers()
157    a.setMainWidget(ow)
158
159    ow.show()
160    a.exec_loop()
161    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.