Changeset 3843:f2a08e758a5d in orange


Ignore:
Timestamp:
05/13/08 11:28:00 (6 years ago)
Author:
miha <miha.stajdohar@…>
Branch:
default
Convert:
1380d44b1a9dd927de6abf605bc02dc5736871e0
Message:

added exportNetwork

File:
1 edited

Legend:

Unmodified
Added
Removed
  • orange/orngInteract.py

    r3815 r3843  
    3535import orngContingency, numpy 
    3636import warnings, math, string, copy 
     37from orangeom import Network 
    3738 
    3839def _nicefloat(f,sig): 
     
    244245                t = '%s+%s'%(self.names[i],self.names[j]) 
    245246                print "%30s\t%2.4f\t%2.4f\t%2.4f\t%2.4f\t%2.4f"%(t,self.igain[(i,j)],self.corr[(i,j)],self.igain[(i,j)]+self.corr[(i,j)],self.gains[i],self.gains[j]) 
     247                 
     248    def exportNetwork(self,  absolute_int=10, positive_int = 0, negative_int = 0, best_attributes = 0, significant_digits = 2, pretty_names = 1, widget_coloring=1, pcutoff = 1): 
     249        NA = len(self.names) 
     250 
     251        ### SELECTION OF INTERACTIONS AND ATTRIBUTES ### 
     252 
     253        # prevent crashes 
     254        best_attributes = min(best_attributes,len(self.attlist)) 
     255        positive_int = min(positive_int,len(self.list)) 
     256        absolute_int = min(absolute_int,len(self.list)) 
     257        negative_int = min(negative_int,len(self.list)) 
     258 
     259        # select the top interactions 
     260        ins = [] 
     261        if positive_int > 0: 
     262            ins += self.list[-positive_int:] 
     263        ins += self.list[:negative_int] 
     264        if absolute_int > 0: 
     265            ins += self.abslist[-absolute_int:] 
     266 
     267        # pick best few attributes 
     268        atts = [] 
     269        if best_attributes > 0: 
     270            atts += [i for (x,i) in self.attlist[-best_attributes:]] 
     271 
     272        # disregard the insignificant attributes, interactions 
     273        if len(self.plist) > 0 and pcutoff < 1: 
     274            # attributes 
     275            oats = atts 
     276            atts = [] 
     277            for i in oats: 
     278                if self.plut[(i,-1)] < pcutoff: 
     279                    atts.append(i) 
     280            # interactions 
     281            oins = ins 
     282            ins = [] 
     283            for y in oins: 
     284                (ig,i,j) = y[1] 
     285                if self.plut[(i,j,-1)] < pcutoff: 
     286                    ins.append(y) 
     287         
     288        ints = [] 
     289        max_igain = -1e6 
     290        min_gain = 1e6 # lowest information gain of involved attributes 
     291        # remove duplicates and sorting keys 
     292        for (x,v) in ins: 
     293            if v not in ints: 
     294                ints.append(v) 
     295                # add to attribute list 
     296                (ig,i,j) = v 
     297                max_igain = max(abs(ig),max_igain) 
     298                for x in [i,j]: 
     299                    if x not in atts: 
     300                        atts.append(x) 
     301                        min_gain = min(min_gain,self.gains[x]) 
     302 
     303        # fill-in the attribute list with all possibly more important attributes 
     304        ## todo 
     305             
     306        ### NODE DRAWING ### 
     307        map = {} 
     308        graph = Network(len(atts), 0) 
     309        table = [] 
     310         
     311        for i in range(len(atts)): 
     312            map[atts[i]] = i 
     313             
     314            ndx = atts[i] 
     315            t = '%s' % self.names[ndx] 
     316            if pretty_names: 
     317                t = string.replace(t, "ED_", "") 
     318                t = string.replace(t, "D_", "") 
     319                t = string.replace(t, "M_", "") 
     320                t = string.replace(t, " ", "\\n") 
     321                t = string.replace(t, "-", "\\n") 
     322                t = string.replace(t, "_", "\\n") 
     323                r = self.gains[ndx] * 100.0 / self.entropy 
     324                table.append([i + 1, t, r])   
     325         
     326        d = orange.Domain([orange.IntVariable('index'), orange.StringVariable('label'), orange.FloatVariable('norm. gain')]) 
     327        data = orange.ExampleTable(d, table) 
     328        graph.items = data 
     329         
     330        table = [] 
     331        for (ig,i,j) in ints: 
     332            j = map[j] 
     333            i = map[i] 
     334             
     335            perc = int(abs(ig)*100.0/max(max_igain,self.attlist[-1][0])+0.5) 
     336            graph[i, j] = perc / 30 + 1 
     337             
     338            if self.entropy > 1e-6: 
     339                mc = _nicefloat(100.0*ig/self.entropy,significant_digits)+"%" 
     340            else: 
     341                mc = _nicefloat(0.0,significant_digits) 
     342            if len(self.plist) > 0 and pcutoff < 1: 
     343                mc += "\\nP\<%.3f"%self.plut[(i,j,-1)] 
     344 
     345            if ig > 0: 
     346                if widget_coloring: 
     347                    color = "green" 
     348                else: 
     349                    color = '"0.0 %f 0.9"'%(0.3+0.7*perc/100.0) # adjust saturation 
     350                dir = "both" 
     351            else: 
     352                if widget_coloring: 
     353                    color = "red" 
     354                else: 
     355                    color = '"0.5 %f 0.9"'%(0.3+0.7*perc/100.0) # adjust saturation 
     356                dir = 'none' 
     357 
     358            table.append([i, j, mc, dir, color]) 
     359 
     360        d = orange.Domain([orange.IntVariable('u'), orange.IntVariable('v'), orange.StringVariable('label'), orange.EnumVariable('dir', values = ["both", "none"]), orange.EnumVariable('color', values = ["green", "red"])]) 
     361        data = orange.ExampleTable(d, table) 
     362        graph.links = data 
     363 
     364        return graph 
    246365 
    247366    def exportGraph(self, f, absolute_int=10, positive_int = 0, negative_int = 0, best_attributes = 0, print_bits = 1, black_white = 0, significant_digits = 2, postscript = 1, pretty_names = 1, url = 0, widget_coloring=1, pcutoff = 1): 
Note: See TracChangeset for help on using the changeset viewer.