def _sample(self, method='naive'): """Sample probabilities of system. Parameters ---------- method : {'naive', 'beta:x', 'kt'}, optional Sampling method to use. 'naive' is the standard histrogram method. 'beta:x' is for an add-constant beta estimator, with beta value following the colon eg 'beta:0.01' [1]_. 'kt' is for the Krichevsky-Trofimov estimator [2]_, which is equivalent to 'beta:0.5'. References ---------- .. [1] T. Schurmann and P. Grassberger, "Entropy estimation of symbol sequences," Chaos,vol. 6, no. 3, pp. 414--427, 1996. .. [2] R. Krichevsky and V. Trofimov, "The performance of universal encoding," IEEE Trans. Information Theory, vol. 27, no. 2, pp. 199--207, Mar. 1981. """ calc = self.calc # decimalise if any([c in calc for c in ['HXY', 'HX']]): if self.X_n > 1: d_X = decimalise(self.X, self.X_n, self.X_m) else: # make 1D d_X = self.X.reshape(self.X.size) # unconditional probabilities if ('HX' in calc) or ('ChiX' in calc): self.PX = prob(d_X, self.X_dim, method=method) if any([c in calc for c in ['HXY', 'HiX', 'HiXY', 'HY']]): self.PY = _probcount(self.Ny, self.N, method) if 'SiHXi' in calc: for i in xrange(self.X_n): self.PXi[:, i] = prob(self.X[i, :], self.X_m, method=method) # conditional probabilities if any([c in calc for c in ['HiXY', 'HXY', 'HshXY']]): sstart = 0 for i in xrange(self.Y_dim): send = sstart + self.Ny[i] indx = slice(sstart, send) sstart = send if 'HXY' in calc: # output conditional ensemble oce = d_X[indx] if oce.size == 0: print 'Warning: Null output conditional ensemble for ' + \ 'output : ' + str(i) else: self.PXY[:, i] = prob(oce, self.X_dim, method=method) if any([c in calc for c in ['HiX', 'HiXY', 'HshXY']]): for j in xrange(self.X_n): # output conditional ensemble for a single variable oce = self.X[j, indx] if oce.size == 0: print 'Warning: Null independent output conditional ensemble for ' + \ 'output : ' + str(i) + ', variable : ' + str(j) else: self.PXiY[:, j, i] = prob(oce, self.X_m, method=method) if 'HshXY' in calc: # shuffle #np.random.shuffle(oce) shfoce = np.random.permutation(oce) self.Xsh[j, indx] = shfoce # Pind(X) = <Pind(X|Y)>_y if ('HiX' in calc) or ('ChiX' in calc): # construct joint distribution words = dec2base( np.atleast_2d(np.r_[0:self.X_dim]).T, self.X_m, self.X_n) PiXY = np.zeros((self.X_dim, self.Y_dim)) PiXY = self.PXiY[words, np.r_[0:self.X_n]].prod(axis=1) # average over Y self.PiX = np.dot(PiXY, self.PY) self.sampled = True
def _sample(self, method='naive'): """Sample probabilities of system. Parameters ---------- method : {'naive', 'beta:x', 'kt'}, optional Sampling method to use. 'naive' is the standard histrogram method. 'beta:x' is for an add-constant beta estimator, with beta value following the colon eg 'beta:0.01' [1]_. 'kt' is for the Krichevsky-Trofimov estimator [2]_, which is equivalent to 'beta:0.5'. References ---------- .. [1] T. Schurmann and P. Grassberger, "Entropy estimation of symbol sequences," Chaos,vol. 6, no. 3, pp. 414--427, 1996. .. [2] R. Krichevsky and V. Trofimov, "The performance of universal encoding," IEEE Trans. Information Theory, vol. 27, no. 2, pp. 199--207, Mar. 1981. """ calc = self.calc # decimalise if any([c in calc for c in ['HXY','HX']]): if self.X_n > 1: d_X = decimalise(self.X, self.X_n, self.X_m) else: # make 1D d_X = self.X.reshape(self.X.size) # unconditional probabilities if ('HX' in calc) or ('ChiX' in calc): self.PX = prob(d_X, self.X_dim, method=method) if any([c in calc for c in ['HXY','HiX','HiXY','HY']]): self.PY = _probcount(self.Ny,self.N,method) if 'SiHXi' in calc: for i in xrange(self.X_n): self.PXi[:,i] = prob(self.X[i,:], self.X_m, method=method) # conditional probabilities if any([c in calc for c in ['HiXY','HXY','HshXY']]): sstart=0 for i in xrange(self.Y_dim): send = sstart+self.Ny[i] indx = slice(sstart,send) sstart = send if 'HXY' in calc: # output conditional ensemble oce = d_X[indx] if oce.size == 0: print 'Warning: Null output conditional ensemble for ' + \ 'output : ' + str(i) else: self.PXY[:,i] = prob(oce, self.X_dim, method=method) if any([c in calc for c in ['HiX','HiXY','HshXY']]): for j in xrange(self.X_n): # output conditional ensemble for a single variable oce = self.X[j,indx] if oce.size == 0: print 'Warning: Null independent output conditional ensemble for ' + \ 'output : ' + str(i) + ', variable : ' + str(j) else: self.PXiY[:,j,i] = prob(oce, self.X_m, method=method) if 'HshXY' in calc: # shuffle #np.random.shuffle(oce) shfoce = np.random.permutation(oce) self.Xsh[j,indx] = shfoce # Pind(X) = <Pind(X|Y)>_y if ('HiX' in calc) or ('ChiX' in calc): # construct joint distribution words = dec2base(np.atleast_2d(np.r_[0:self.X_dim]).T,self.X_m,self.X_n) PiXY = np.zeros((self.X_dim, self.Y_dim)) PiXY = self.PXiY[words,np.r_[0:self.X_n]].prod(axis=1) # average over Y self.PiX = np.dot(PiXY,self.PY) self.sampled = True