source: orange/orange/OrangeWidgets/Prototypes/OWGaussianMixtures.py @ 9546:2b6cc6f397fe

Revision 9546:2b6cc6f397fe, 3.8 KB checked in by ales_erjavec <ales.erjavec@…>, 2 years ago (diff)

Renamed widget channel names in line with the new naming rules/convention.
Added backwards compatibility in orngDoc loadDocument to enable loading of schemas saved before the change.

Line 
1"""\
2<name>Gaussian Mixture</name>
3<description>Gaussian Mixture Modeling</description>
4
5"""
6
7from OWWidget import *
8import OWGUI
9
10import Orange
11from Orange.clustering import mixture
12
13GM_PARAMS = [{"name": "n_centers",
14              "type": int,
15              "default": 3,
16              "range": range(1,11),
17              "doc": "Number of gaussians in the mixtrue."
18              },
19             {"name": "init_function",
20              "type": ":func:",
21#              "type": ":class:Orange.clustering.mixture:Initializer",
22              "default": ":func:Orange.clustering.mixture:init_kmeans"
23#              "default": ":class:Orange.clustering.mixture:init_kmeans"
24              }
25             ]
26
27class OWGaussianMixtures(OWWidget):
28    settingsList = ["init_method", "n_centers"]
29   
30    def __init__(self, parent=None, signalManager=None, title="Gaussin Mixture"):
31        OWWidget.__init__(self, parent, signalManager, title)
32       
33        self.inputs = [("Data", Orange.data.Table, self.set_data)]
34        self.outputs = [("Data with Indicator Matrix", Orange.data.Table)]
35       
36        self.init_method = 0
37        self.n_centers = 3
38        self.auto_commit = True
39       
40        self.loadSettings()
41       
42        #####
43        # GUI
44        #####
45       
46        OWGUI.spin(self.controlArea, self, "n_centers", min=1, max=10, step=1,
47                   box="Settings",
48                   label="Number of gaussians", 
49                   tooltip="The number of gaussians in the mixture ",
50                   callback=self.on_params_changed)
51       
52        OWGUI.comboBox(self.controlArea, self, "init_method",
53                       box="Initialization",
54                       items=["K-means", "Random"],
55                       tooltip="Method used to initialize the mixture", callback=self.on_params_changed)
56       
57        OWGUI.button(self.controlArea, self, "Apply", callback=self.commit)
58   
59    def set_data(self, data=None):
60        self.input_data = data
61        self.gmm = None
62        if self.input_data:
63            self.run_opt()
64            if self.auto_commit:
65                self.commit()
66           
67    def run_opt(self):
68        from Orange.clustering import mixture
69        init_function = mixture.init_kmeans if self.init_method == 1 else mixture.init_random
70       
71        gmm = mixture.GaussianMixture(self.input_data,
72                                      n_centers=self.n_centers,
73                                      init_function=init_function)
74        input_matrix, _, _ = self.input_data.to_numpy_MA()
75        self.gmm = gmm
76       
77        self.indicator_matrix = mixture.prob_est(input_matrix, gmm.weights,
78                        gmm.means, gmm.covariances)
79       
80        vars = []
81        for i, w in enumerate(self.gmm.weights):
82            var = Orange.data.variable.Continuous("Cluster {0}".format(i))
83            var.attributes["weight"] = str(w)
84            vars.append(var)
85        input_domain = self.input_data.domain
86        domain = Orange.data.Domain(input_domain.attributes + vars, input_domain.class_var)
87        domain.add_metas(input_domain.get_metas())
88        data = self.input_data.translate(domain)
89        for ex, indicator_row in zip(data, self.indicator_matrix):
90            for var, value in zip(vars, indicator_row):
91                ex[var] = float(value)
92       
93        self.output_data = data
94       
95        if self.auto_commit:
96            self.commit()
97       
98    def on_params_changed(self):
99        pass
100#        if self.auto_commit:
101#            self.run_opt()
102   
103    def commit(self):
104        if self.gmm and self.input_data:
105            self.send("Data with Indicator Matrix", self.output_data)
106   
107if __name__ == "__main__":
108    app = QApplication(sys.argv)
109    w = OWGaussianMixtures()
110    data = Orange.data.Table("iris")
111    w.set_data(data)
112    w.show()
113    app.exec_()
Note: See TracBrowser for help on using the repository browser.