def propose(self): # Propose new values using normal distribution if self.proposal_distribution == "Normal": # New normal deviate, centred on current value new_val = rnormal(self.stochastic.value, self.adaptive_scale_factor * self.proposal_sd) # Round before setting proposed value self.stochastic.value = round_array(new_val) elif self.proposal_distribution == "Poisson": k = shape(self.stochastic.value) # Add or subtract (equal probability) Poisson sample new_val = self.stochastic.value + rpoisson(self.adaptive_scale_factor * self.proposal_sd) * (-ones(k))**(random(k)>0.5) if self._positive: # Enforce positive values self.stochastic.value = abs(new_val) else: self.stochastic.value = new_val elif self.proposal_distribution == "Prior": self.stochastic.random()
def propose(self): """ This method proposes values for stochastics based on the empirical covariance of the values sampled so far. The proposal jumps are drawn from a multivariate normal distribution. """ arrayjump = np.dot(self.proposal_sd, np.random.normal(size=self.proposal_sd.shape[0])) if self.verbose > 2: print 'Jump :', arrayjump # Update each stochastic individually. for stochastic in self.stochastics: jump = arrayjump[self._slices[stochastic]] if np.iterable(stochastic.value): jump = np.reshape(arrayjump[self._slices[stochastic]],np.shape(stochastic.value)) if self.isdiscrete[stochastic]: jump = round_array(jump) stochastic.value = stochastic.value + jump
def _set_stochastics(self, p): for stochastic in self.stochastics: if self.stochastic_type_dict[stochastic] is int: stochastic.value = round_array(reshape(ravel(p)[self._slices[stochastic]],shape(stochastic.value))) else: stochastic.value = reshape(ravel(p)[self._slices[stochastic]],shape(stochastic.value))