source: orange/orange/OrangeWidgets/Prototypes/OWGaussianMixtures.py @ 9598:2fcfcfd5b6b9

Revision 9598:2fcfcfd5b6b9, 3.8 KB checked in by ales_erjavec, 2 years ago (diff)

Standardizing the input data.

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",
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"]
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 = 3
38        self.auto_commit = True
39       
40        self.loadSettings()
41       
42        #####
43        # GUI
44        #####
45       
46        OWGUI.spin(self.controlArea, self, "n", 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=self.n,
73                                      init_function=init_function)
74       
75        data = self.input_data.translate(gmm.domain)
76       
77        input_matrix, _, _ = data.to_numpy_MA()
78        self.gmm = gmm
79       
80        self.indicator_matrix = mixture.prob_est(input_matrix, gmm.weights,
81                        gmm.means, gmm.covariances)
82       
83        vars = []
84        for i, w in enumerate(self.gmm.weights):
85            var = Orange.data.variable.Continuous("Cluster {0}".format(i))
86            var.attributes["weight"] = str(w)
87            vars.append(var)
88        input_domain = self.input_data.domain
89        domain = Orange.data.Domain(input_domain.attributes + vars, input_domain.class_var)
90        domain.add_metas(input_domain.get_metas())
91        data = self.input_data.translate(domain)
92        for ex, indicator_row in zip(data, self.indicator_matrix):
93            for var, value in zip(vars, indicator_row):
94                ex[var] = float(value)
95       
96        self.output_data = data
97       
98        if self.auto_commit:
99            self.commit()
100       
101    def on_params_changed(self):
102        pass
103#        if self.auto_commit:
104#            self.run_opt()
105   
106    def commit(self):
107        if self.gmm and self.input_data:
108            self.send("Data with Indicator Matrix", self.output_data)
109   
110if __name__ == "__main__":
111    app = QApplication(sys.argv)
112    w = OWGaussianMixtures()
113    data = Orange.data.Table("iris")
114    w.set_data(data)
115    w.show()
116    app.exec_()
Note: See TracBrowser for help on using the repository browser.