Esempio n. 1
0
 def _calc_nsb(self):
     """Calculate NSB corrected entropy"""
     calc = self.calc
     # TODO: 1 external program call if all y have same number of trials
     self.H_nsb = {}
     if 'HX' in calc:
         H = nsb_entropy(self.PX, self.N, self.X_dim)[0] / np.log(2)
         self.H_nsb['HX'] = H
     if 'HY' in calc:
         H = nsb_entropy(self.PY, self.N, self.Y_dim)[0] / np.log(2)
         self.H_nsb['HY'] = H
     if 'HXY' in calc:
         H = 0.0
         for y in xrange(self.Y_dim):
             H += self.PY[y] * nsb_entropy(self.PXY[:,y], self.Ny[y], self.X_dim)[0] \
                     / np.log(2)
         self.H_nsb['HXY'] = H
     if 'SiHXi' in calc:
         # TODO: can easily use 1 call here
         H = 0.0
         for i in xrange(self.X_n):
             H += nsb_entropy(self.PXi[:,i], self.N, self.X_m)[0] / np.log(2)
         self.H_nsb['SiHXi'] = H
     if 'HiXY' in calc:
         H = 0.0
         for i in xrange(self.X_n):
             for y in xrange(self.Y_dim):
                 H += self.PY[y] * nsb_entropy(self.PXiY[:,i,y], self.Ny[y], self.X_m)[0] / np.log(2)
         self.H_nsb['HiXY'] = H
     if 'HiX' in calc:
         H = nsb_entropy(self.PiX, self.N, self.X_dim)[0] / np.log(2)
         self.H_nsb['HiX'] = H
Esempio n. 2
0
    def _calc_nsb(self, ext=False):
        """Calculate NSB corrected entropy
        
        :Parameters:
          ext : {False, True}, optional
            Use external 'nsb-entropy' program vs STAT version

        """
        if ext:
            from utils import nsb_entropy
        else:
            # don't catch exceptions - just fail if can't import
            from statk.wrap import nsb_entropy as _nsb_entropy
            # for debugging
            #nsb_entropy = lambda x,y,z: _nsb_entropy(x,y,z,verbose=True)
            nsb_entropy = _nsb_entropy
        calc = self.calc
        H_nsb = {}
        if 'HX' in calc:
            H = nsb_entropy(self.PX, self.N, self.X_dim) 
            H_nsb['HX'] = H
        if 'HY' in calc:
            H = nsb_entropy(self.PY, self.N, self.Y_dim)
            H_nsb['HY'] = H
        if 'HXY' in calc:
            H = 0.0
            for y in xrange(self.Y_dim):
                H += self.PY[y] * nsb_entropy(self.PXY[:,y], self.Ny[y], self.X_dim) 
            H_nsb['HXY'] = H
        if 'SiHXi' in calc:
            H = 0.0
            for i in xrange(self.X_n):
                H += nsb_entropy(self.PXi[:,i], self.N, self.X_m) 
            H_nsb['SiHXi'] = H
        if 'HiXY' in calc:
            H = 0.0
            for i in xrange(self.X_n):
                for y in xrange(self.Y_dim):
                    H += self.PY[y] * nsb_entropy(self.PXiY[:,i,y], self.Ny[y], self.X_m) 
            H_nsb['HiXY'] = H
        if 'HiX' in calc:
            H = nsb_entropy(self.PiX, self.N, self.X_dim)
            H_nsb['HiX'] = H
        if 'ChiX' in calc:
            print "Warning: No NSB correction applied for ChiX"
            H = -(self.PX*malog2(np.ma.array(self.PiX,copy=False,
                    mask=(self.PiX<=np.finfo(np.float).eps)))).sum(axis=0)
            H_nsb['ChiX'] = H
        if ext:
            self.H_nsbext = H_nsb
        else:
            self.H_nsb = H_nsb