source: orange/Orange/OrangeWidgets/Unsupervised/OWSOM.py @ 11317:56e332539b11

Revision 11317:56e332539b11, 6.4 KB checked in by Ales Erjavec <ales.erjavec@…>, 14 months ago (diff)

Code style fix (PEP8)

Line 
1"""
2<name>SOM</name>
3<description>Self organizing maps learner.</description>
4<icon>icons/SOM.svg</icon>
5<contact>Ales Erjavec (ales.erjevec(@at@)fri.uni.lj.si)</contact>
6<priority>5010</priority>
7"""
8
9import orange
10import orngSOM
11from OWWidget import *
12import OWGUI
13
14
15class OWSOM(OWWidget):
16    settingsList = ["xdim", "ydim", "neighborhood", "topology", "alphaType",
17                    "iterations1", "iterations2", "radius1", "radius2",
18                    "alpha1", "alpha2", "initialization", "eps"]
19
20    def __init__(self, parent=None, signalManager=None, name="SOM"):
21        OWWidget.__init__(self, parent, signalManager, name,
22                          wantMainArea=False)
23
24        self.inputs = [("Data", ExampleTable, self.setData)]
25        self.outputs = [("Classifier", orange.Classifier),
26                        ("Learner", orange.Learner),
27                        ("SOM", orngSOM.SOMMap)]
28
29        self.LearnerName = "SOM Map"
30        self.xdim = 5
31        self.ydim = 10
32        self.initialization = orngSOM.InitializeLinear
33        self.neighborhood = 0
34        self.topology = 0
35        self.alphaType = 0
36        self.iterations1 = 100
37        self.iterations2 = 10000
38        self.radius1 = 3
39        self.radius2 = 1
40        self.eps = 1e-5
41        self.alpha1 = 0.05
42        self.alpha2 = 0.01
43        self.loadSettings()
44
45        self.TopolMap = [orngSOM.HexagonalTopology,
46                         orngSOM.RectangularTopology]
47
48        self.NeighMap = [orngSOM.NeighbourhoodGaussian,
49                         orngSOM.NeighbourhoodBubble]
50
51        self.learnerName = OWGUI.lineEdit(
52            self.controlArea, self, "LearnerName",
53            box="Learner/Classifier Name",
54            tooltip=("Name to be used by other widgets to identify your "
55                     "Learner/Classifier")
56        )
57
58        box = OWGUI.radioButtonsInBox(
59            self.controlArea, self, "topology",
60            ["Hexagonal topology", "Rectangular topology"],
61            box="Topology"
62        )
63
64        OWGUI.spin(box, self, "xdim", 4, 1000,
65                   orientation="horizontal",
66                   label="Columns")
67
68        OWGUI.spin(box, self, "ydim", 4, 1000,
69                   orientation="horizontal",
70                   label="Rows")
71
72        OWGUI.radioButtonsInBox(self.controlArea, self, "initialization",
73                                ["Linear", "Random"],
74                                box="Map Initialization")
75
76        OWGUI.radioButtonsInBox(self.controlArea, self, "neighborhood",
77                                ["Gaussian neighborhood",
78                                 "Bubble neighborhood"],
79                                box="Neighborhood")
80
81        b = OWGUI.widgetBox(self.controlArea, "Radius")
82
83        OWGUI.spin(b, self, "radius1", 2, 50,
84                   orientation="horizontal", label="Initial radius")
85
86        OWGUI.spin(b, self, "radius2", 1, 50,
87                   orientation="horizontal", label="Final radius")
88
89        b = OWGUI.widgetBox(self.controlArea, "Stopping Conditions")
90        OWGUI.spin(b, self, "iterations1", 10, 10000, label="Iterations")
91
92        OWGUI.button(self.controlArea, self, "&Apply",
93                     callback=self.ApplySettings,
94                     default=True)
95
96        OWGUI.rubber(self.controlArea)
97
98        self.data = None
99
100        self.resize(100, 100)
101
102    def dataWithDefinedValues(self, data):
103        self.warning(1235)
104        self.warning(1236)
105        exclude = []
106        for attr in data.domain.variables:
107            if not any(not ex[attr].isSpecial() for ex in data):
108                exclude.append(attr)
109
110        if exclude:
111            self.warning(1235,
112                         "Excluding attributes with all unknown "
113                         "values: %s." % \
114                         ", ".join(attr.name for attr in exclude))
115
116            exclude_class = data.domain.classVar in exclude
117            if exclude_class:
118                self.warning(1236,
119                             "Excluding class attribute: %s" % \
120                             data.domain.classVar.name)
121
122            domain = orange.Domain(
123                [attr for attr in data.domain.variables
124                 if attr not in exclude],
125                data.domain.classVar if not exclude_class else False
126            )
127
128            domain.addmetas(data.domain.getmetas())
129            data = orange.ExampleTable(domain, data)
130
131        return data
132
133    def setData(self, data=None):
134        self.data = data
135        if data:
136            self.data = self.dataWithDefinedValues(data)
137            self.ApplySettings()
138        else:
139            self.send("Classifier", None)
140            self.send("SOM", None)
141            self.send("Learner", None)
142
143    def ApplySettings(self):
144        topology = self.TopolMap[self.topology]
145        neigh = self.NeighMap[self.neighborhood]
146
147        self.learner = orngSOM.SOMLearner(
148            name=self.LearnerName,
149            map_shape=(self.xdim, self.ydim),
150            topology=topology,
151            neighbourhood=neigh,
152            epochs=self.iterations1,
153            eps=self.eps,
154            initialize=self.initialization,
155            radius_ini=self.radius1,
156            radius_fin=self.radius2
157        )
158
159        self.send("Learner", self.learner)
160
161        if self.data:
162            self.progressBarInit()
163            self.classifier = self.learner(
164                self.data, progressCallback=self.progressBarSet
165            )
166
167            self.progressBarFinished()
168            self.classifier.name = self.LearnerName
169            self.classifier.setattr("data", self.data)
170            if self.data.domain.classVar:
171                self.send("Classifier", self.classifier)
172            self.send("SOM", self.classifier)
173
174    def sendReport(self):
175        self.reportSettings(
176            "Topology",
177            [("Shape", ["hexagonal", "rectangular"][self.topology]),
178             ("Size", "%i columns, %i rows" % (self.xdim, self.ydim))]
179        )
180
181        self.reportSettings(
182            "Optimization",
183            [("Initialization", ["linear", "random"][self.initialization]),
184             ("Neighborhood", ["Gaussian", "bubble"][self.neighborhood]),
185             ("Radius", "initial: %i, final: %i" % \
186              (self.radius1, self.radius2)),
187             ("Number of iterations", self.iterations1)
188            ])
189
190
191if __name__ == "__main__":
192    app = QApplication(sys.argv)
193    w = OWSOM()
194    w.show()
195    data = orange.ExampleTable("../../doc/datasets/iris.tab")
196
197    w.setData(data)
198    app.exec_()
Note: See TracBrowser for help on using the repository browser.