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
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