source: orange/Orange/OrangeWidgets/Unsupervised/OWNxClustering.py @ 10873:21992f764537

Revision 10873:21992f764537, 3.3 KB checked in by mstajdohar, 2 years ago (diff)

Added graph clustering feature.

Line 
1"""
2<name>Net Clustering</name>
3<description>Orange widget for community detection in networks</description>
4<icon>icons/Network.png</icon>
5<contact>Miha Stajdohar (miha.stajdohar(@at@)gmail.com)</contact>
6<priority>6430</priority>
7"""
8
9import Orange.network
10import Orange.network.community as cd
11import OWGUI
12
13from OWWidget import *
14
15class OWNxClustering(OWWidget):
16
17    settingsList = ['method', 'iterationHistory', 'autoApply', 'iterations',
18                    'hop_attenuation']
19
20    def __init__(self, parent=None, signalManager=None):
21        OWWidget.__init__(self, parent, signalManager, 'Nx Clustering')
22
23        self.inputs = [("Network", Orange.network.Graph,
24                        self.setNetwork, Default)]
25        self.outputs = [("Network", Orange.network.Graph),
26                        ("Community Detection", cd.CommunityDetection)]
27
28        self.net = None
29        self.method = 0
30        self.iterationHistory = 0
31        self.autoApply = 0
32        self.iterations = 1000
33        self.hop_attenuation = 0.1
34        self.loadSettings()
35
36        OWGUI.spin(self.controlArea, self, "iterations", 1,
37                   100000, 1, label="Iterations: ")
38        ribg = OWGUI.radioButtonsInBox(self.controlArea, self, "method",
39                                       [], "Method", callback=self.cluster)
40        OWGUI.appendRadioButton(ribg, self, "method",
41                        "Label propagation clustering (Raghavan et al., 2007)",
42                        callback=self.cluster)
43
44        OWGUI.appendRadioButton(ribg, self, "method",
45                        "Label propagation clustering (Leung et al., 2009)",
46                        callback=self.cluster)
47        OWGUI.doubleSpin(OWGUI.indentedBox(ribg), self, "hop_attenuation",
48                         0, 1, 0.01, label="Hop attenuation (delta): ")
49
50        self.info = OWGUI.widgetLabel(self.controlArea, ' ')
51        OWGUI.checkBox(self.controlArea, self, "iterationHistory",
52                       "Append clustering data on each iteration",
53                       callback=self.cluster)
54        OWGUI.checkBox(self.controlArea, self, "autoApply",
55                       "Commit automatically")
56        OWGUI.button(self.controlArea, self, "Commit",
57                     callback=lambda b=True: self.cluster(b))
58
59        self.cluster()
60
61    def setNetwork(self, net):
62        self.net = net
63        if self.autoApply:
64            self.cluster()
65
66    def cluster(self, btn=False):
67        if not btn and not self.autoApply:
68            return
69
70        self.info.setText(' ')
71
72        if self.method == 0:
73            alg = cd.label_propagation
74            kwargs = {'results2items': 1,
75                      'resultHistory2items': self.iterationHistory,
76                      'iterations': self.iterations}
77
78        elif self.method == 1:
79            alg = cd.label_propagation_hop_attenuation
80            kwargs = {'results2items': 1,
81                      'resultHistory2items': self.iterationHistory,
82                      'iterations': self.iterations,
83                      'delta': self.hop_attenuation}
84
85        self.send("Community Detection", cd.CommunityDetection(alg, **kwargs))
86
87        if self.net is None:
88            self.send("Network", None)
89            return
90
91        labels = alg(self.net, **kwargs)
92
93        self.info.setText('%d clusters found' % len(set(labels.values())))
94        self.send("Network", self.net)
Note: See TracBrowser for help on using the repository browser.