def sample(self, model, evidence): z = evidence['z'] T = evidence['T'] g = evidence['g'] h = evidence['h'] transition_var_g = evidence['transition_var_g'] shot_id = evidence['shot_id'] observation_var_g = model.known_params['observation_var_g'] observation_var_h = model.known_params['observation_var_h'] prior_mu_g = model.hyper_params['g']['mu'] prior_cov_g = model.hyper_params['g']['cov'] N = len(z) n = len(g) # Make g, h, and z vector valued to avoid ambiguity g = g.copy().reshape((n, 1)) h = h.copy().reshape((n, 1)) z_g = ma.asarray(nan + zeros((n, 1))) obs_cov = ma.asarray(inf + zeros((n, 1, 1))) for i in xrange(n): z_i = z[shot_id == i] T_i = T[shot_id == i] if 1 in T_i and 2 in T_i: # Sample mean and variance for multiple observations n_obs_g, n_obs_h = sum(T_i == 1), sum(T_i == 2) obs_cov_g, obs_cov_h = observation_var_g / n_obs_g, observation_var_h / n_obs_h z_g[i] = (mean(z_i[T_i == 1]) / obs_cov_g + mean(z_i[T_i == 2] - h[i]) / obs_cov_h) / ( 1 / obs_cov_g + 1 / obs_cov_h) obs_cov[i] = 1 / (1 / obs_cov_g + 1 / obs_cov_h) elif 1 in T_i: n_obs_g = sum(T_i == 1) z_g[i] = mean(z_i[T_i == 1]) obs_cov[i] = observation_var_g / n_obs_g elif 2 in T_i: n_obs_h = sum(T_i == 2) z_g[i] = mean(z_i[T_i == 2] - h[i]) obs_cov[i] = observation_var_h / n_obs_h z_g[isnan(z_g)] = ma.masked obs_cov[isinf(obs_cov)] = ma.masked kalman = self._kalman kalman.initial_state_mean = array([ prior_mu_g[0], ]) kalman.initial_state_covariance = array([ prior_cov_g[0], ]) kalman.transition_matrices = eye(1) kalman.transition_covariance = array([ transition_var_g, ]) kalman.observation_matrices = eye(1) kalman.observation_covariance = obs_cov sampled_g = forward_filter_backward_sample(kalman, z_g, prior_mu_g, prior_cov_g) return sampled_g.reshape((n, ))
def sample(self, model, evidence): z = evidence['z'] T = evidence['T'] g = evidence['g'] h = evidence['h'] transition_var_g = evidence['transition_var_g'] shot_id = evidence['shot_id'] observation_var_g = model.known_params['observation_var_g'] observation_var_h = model.known_params['observation_var_h'] prior_mu_g = model.hyper_params['g']['mu'] prior_cov_g = model.hyper_params['g']['cov'] N = len(z) n = len(g) ## Make g, h, and z vector valued to avoid ambiguity #g = g.copy().reshape((n, 1)) #h = h.copy().reshape((n, 1)) # pdb.set_trace() z_g = ma.asarray(nan + zeros(n)) obs_cov = ma.asarray(inf + zeros(n)) if 1 in T: z_g[T==1] = z[T==1] obs_cov[T==1] = observation_var_g if 2 in T: z_g[T==2] = z[T==2] - h[T==2] obs_cov[T==2] = observation_var_h #for i in xrange(n): # z_i = z[shot_id == i] # T_i = T[shot_id == i] # if 1 in T_i and 2 in T_i: # # Sample mean and variance for multiple observations # n_obs_g, n_obs_h = sum(T_i == 1), sum(T_i == 2) # obs_cov_g, obs_cov_h = observation_var_g/n_obs_g, observation_var_h/n_obs_h # z_g[i] = (mean(z_i[T_i == 1])/obs_cov_g + mean(z_i[T_i == 2] - h[i])/obs_cov_h)/(1/obs_cov_g + 1/obs_cov_h) # obs_cov[i] = 1/(1/obs_cov_g + 1/obs_cov_h) # elif 1 in T_i: # n_obs_g = sum(T_i == 1) # z_g[i] = mean(z_i[T_i == 1]) # obs_cov[i] = observation_var_g/n_obs_g # elif 2 in T_i: # n_obs_h = sum(T_i == 2) # z_g[i] = mean(z_i[T_i == 2] - h[i]) # obs_cov[i] = observation_var_h/n_obs_h z_g[isnan(z_g)] = ma.masked obs_cov[isinf(obs_cov)] = ma.masked kalman = self._kalman kalman.initial_state_mean = array([prior_mu_g[0],]) kalman.initial_state_covariance = array([prior_cov_g[0],]) kalman.transition_matrices = eye(1) kalman.transition_covariance = array([transition_var_g,]) kalman.observation_matrices = eye(1) kalman.observation_covariance = obs_cov sampled_g = forward_filter_backward_sample(kalman, z_g, prior_mu_g, prior_cov_g) return sampled_g.reshape((n,))
def sample(self, model, evidence): z = evidence['z'] g = evidence['g'] h = evidence['h'] T = evidence['T'] phi = evidence['phi'] transition_var_h = evidence['transition_var_h'] shot_id = evidence['shot_id'] observation_var_h = model.known_params['observation_var_h'] mu_h = model.known_params['mu_h'] prior_mu_h = model.hyper_params['h']['mu'] prior_cov_h = model.hyper_params['h']['cov'] n = len(h) N = len(z) # Making g, h, and z vector valued to avoid ambiguity g = g.copy().reshape((n, 1)) h = h.copy().reshape((n, 1)) z_h = ma.asarray(nan + zeros((n, 1))) obs_cov = ma.asarray(inf + zeros((n, 1, 1))) for i in xrange(n): z_i = z[shot_id == i] T_i = T[shot_id == i] if 2 in T_i: # Sample mean and variance for multiple observations n_obs = sum(T_i == 2) z_h[i] = mean(z_i[T_i == 2]) obs_cov[i] = observation_var_h / n_obs z_h[isnan(z_h)] = ma.masked obs_cov[isinf(obs_cov)] = ma.masked kalman = self._kalman kalman.initial_state_mean = array([ prior_mu_h[0], ]) kalman.initial_state_covariance = array([ prior_cov_h[0], ]) kalman.transition_matrices = array([ phi, ]) kalman.transition_covariance = array([ transition_var_h, ]) kalman.transition_offsets = mu_h * (1 - phi) * ones((n, 1)) kalman.observation_matrices = eye(1) kalman.observation_offsets = g kalman.observation_covariance = obs_cov sampled_h = forward_filter_backward_sample(kalman, z_h, prior_mu_h, prior_cov_h) return sampled_h.reshape((n, ))
def visualize_gibbs(sampler, evidence): pdb.set_trace() z, T, C, d, g, h, transition_var_g, transition_var_h, canopy_cover = \ [evidence[var] for var in ['z', 'T', 'C', 'd', 'g', 'h', 'transition_var_g', 'transition_var_h', 'canopy_cover']] g = g.reshape((len(g), )) h = h.reshape((len(h), )) dists = sorted(list(set(d))) print "transition_var_g: %s" % transition_var_g print "transition_var_h: %s" % transition_var_h print "T counts: %s" % [sum(T==i) for i in range(3)] from matplotlib import pyplot as plt fig = plt.figure() plt.plot(d[T==0], z[T==0], 'r.') plt.plot(d[T==1], z[T==1], 'k.') plt.plot(d[T==2], z[T==2], 'g.') plt.plot(dists, g, 'k-', linewidth=3, alpha=.5) for i in xrange(len(canopy_cover)): canopy = ma.asarray(g+h) canopy[C!=i] = ma.masked plt.fill_between(dists, g, canopy, color='g', alpha=canopy_cover[i]*.7) def moveon(event): plt.close() fig.canvas.mpl_connect('key_press_event', moveon) plt.show()
def sample(self, model, evidence): z = evidence['z'] T, surfaces, sigma_g, sigma_h = [evidence[var] for var in ['T', 'surfaces', 'sigma_g', 'sigma_h']] mu_h, phi, sigma_z_g, sigma_z_h = [model.known_params[var] for var in ['mu_h', 'phi', 'sigma_z_g', 'sigma_z_h']] prior_mu_g, prior_cov_g = [model.hyper_params[var] for var in ['prior_mu_g', 'prior_cov_g']] prior_mu_h, prior_cov_h = [model.hyper_params[var] for var in ['prior_mu_h', 'prior_cov_h']] n = len(g) y = ma.asarray(ones((n, 2))*nan) if sum(T==1) > 0: y[T==1, 0] = z[T==1] if sum(T==2) > 0: y[T==2, 1] = z[T==2] y[isnan(y)] = ma.masked kalman = self._kalman kalman.initial_state_mean=[prior_mu_g[0], prior_mu_h[0]] kalman.initial_state_covariance=diag([prior_cov_g[0,0], prior_cov_h[0,0]]) kalman.transition_matrices=[[1, 0], [0, phi]] kalman.transition_offsets =ones((n, 2))*[0, mu_h*(1-phi)] kalman.transition_covariance=[[sigma_g**2, 0], [0, sigma_h**2]] kalman.observation_matrices=[[1, 0], [1, 1]] kalman.observation_covariance=[[sigma_z_g**2, 0], [0, sigma_z_h**2]] sampled_surfaces = forward_filter_backward_sample(kalman, y) return sampled_surfaces
def sample(self, model, evidence): z = evidence['z'] T, g, sigma_g = [evidence[var] for var in ['T', 'g', 'sigma_g']] sigma_z_g = model.known_params['sigma_z_g'] prior_mu_g, prior_cov_g = [ model.hyper_params[var] for var in ['prior_mu_g', 'prior_cov_g'] ] n = len(g) z_g = z.copy() z_g[T == 0] = nan z_g = ma.asarray(z_g) z_g[isnan(z_g)] = ma.masked kalman = self._kalman kalman.initial_state_mean = prior_mu_g[0] kalman.initial_state_covariance = prior_cov_g[0, 0] kalman.transition_matrices = 1 kalman.transition_covariance = sigma_g**2 kalman.observation_matrices = 1 kalman.observation_covariance = sigma_z_g**2 pdb.set_trace() sampled_g = forward_filter_backward_sample(kalman, z_g) return sampled_g
def sample(self, model, evidence): z = evidence['z'] T, g, h, sigma_g = [evidence[var] for var in ['T', 'g', 'h', 'sigma_g']] sigma_z_g = model.known_params['sigma_z_g'] sigma_z_h = model.known_params['sigma_z_h'] prior_mu_g, prior_cov_g = [model.hyper_params[var] for var in ['prior_mu_g', 'prior_cov_g']] n = len(g) # Must be a more concise way to deal with scalar vs vector g = g.copy().reshape((n,1)) h = h.copy().reshape((n,1)) z_g = ma.asarray(z.copy().reshape((n,1))) obs_cov = sigma_z_g**2*ones((n,1,1)) if sum(T == 0) > 0: z_g[T == 0] = nan if sum(T == 2) > 0: z_g[T == 2] -= h[T == 2] obs_cov[T == 2] = sigma_z_h**2 z_g[isnan(z_g)] = ma.masked kalman = self._kalman kalman.initial_state_mean = array([prior_mu_g[0],]) kalman.initial_state_covariance = array([prior_cov_g[0,0],]) kalman.transition_matrices = eye(1) kalman.transition_covariance = array([sigma_g**2,]) kalman.observation_matrices = eye(1) kalman.observation_covariance = obs_cov sampled_g = forward_filter_backward_sample(kalman, z_g) return sampled_g.reshape((n,))
def sample(self, model, evidence): z, T, g, h, sigma_h, phi = [evidence[var] for var in ['z', 'T', 'g', 'h', 'sigma_h', 'phi']] sigma_z_h = model.known_params['sigma_z_h'] mu_h = model.known_params['mu_h'] prior_mu_h = model.hyper_params['prior_mu_h'] prior_cov_h = model.hyper_params['prior_cov_h'] n = len(h) g = g.copy().reshape((n,1)) h = h.copy().reshape((n,1)) z_h = ma.asarray(z.copy().reshape((n,1))) if sum(T == 0) > 0: z_h[T == 0] = nan if sum(T == 1) > 0: z_h[T == 1] = nan if sum(T == 2) > 0: z_h[T == 2] -= g[T == 2] z_h[isnan(z_h)] = ma.masked kalman = self._kalman kalman.initial_state_mean = array([prior_mu_h[0],]) kalman.initial_state_covariance = array([prior_cov_h[0,0],]) kalman.transition_matrices = array([phi,]) kalman.transition_covariance = array([sigma_h**2,]) kalman.transition_offsets = mu_h*(1-phi)*ones((n, 1)) kalman.observation_matrices = eye(1) kalman.observation_covariance = array([sigma_z_h**2,]) sampled_h = forward_filter_backward_sample(kalman, z_h) return sampled_h.reshape((n,))
def visualize_gibbs(sampler, evidence): pdb.set_trace() z, T, C, d, g, h, transition_var_g, transition_var_h, canopy_cover = \ [evidence[var] for var in ['z', 'T', 'C', 'd', 'g', 'h', 'transition_var_g', 'transition_var_h', 'canopy_cover']] g = g.reshape((len(g), )) h = h.reshape((len(h), )) dists = sorted(list(set(d))) print "transition_var_g: %s" % transition_var_g print "transition_var_h: %s" % transition_var_h print "T counts: %s" % [sum(T == i) for i in range(3)] from matplotlib import pyplot as plt fig = plt.figure() plt.plot(d[T == 0], z[T == 0], 'r.') plt.plot(d[T == 1], z[T == 1], 'k.') plt.plot(d[T == 2], z[T == 2], 'g.') plt.plot(dists, g, 'k-', linewidth=3, alpha=.5) for i in xrange(len(canopy_cover)): canopy = ma.asarray(g + h) canopy[C != i] = ma.masked plt.fill_between(dists, g, canopy, color='g', alpha=canopy_cover[i] * .7) def moveon(event): plt.close() fig.canvas.mpl_connect('key_press_event', moveon) plt.show()
def sample(self, model, evidence): z = evidence['z'] g = evidence['g'] h = evidence['h'] T = evidence['T'] phi = evidence['phi'] transition_var_h = evidence['transition_var_h'] shot_id = evidence['shot_id'] observation_var_h = model.known_params['observation_var_h'] mu_h = model.known_params['mu_h'] prior_mu_h = model.hyper_params['h']['mu'] prior_cov_h = model.hyper_params['h']['cov'] n = len(h) N = len(z) # Making g, h, and z vector valued to avoid ambiguity z_h = ma.asarray(nan + zeros(n)) obs_cov = ma.asarray(inf + zeros(n)) if 2 in T: z_h[T==2] = z[T==2] obs_cov[T==2] = observation_var_h pdb.set_trace() #for i in xrange(n): # z_i = z[shot_id == i] # T_i = T[shot_id == i] # if 2 in T_i: # # Sample mean and variance for multiple observations # n_obs = sum(T_i == 2) # z_h[i] = mean(z_i[T_i == 2]) # obs_cov[i] = observation_var_h/n_obs z_h[isnan(z_h)] = ma.masked obs_cov[isinf(obs_cov)] = ma.masked kalman = self._kalman kalman.initial_state_mean = array([prior_mu_h[0],]) kalman.initial_state_covariance = array([prior_cov_h[0],]) kalman.transition_matrices = array([phi,]) kalman.transition_covariance = array([transition_var_h,]) kalman.transition_offsets = mu_h*(1-phi)*ones((n, 1)) kalman.observation_matrices = eye(1) kalman.observation_offsets = g kalman.observation_covariance = obs_cov sampled_h = forward_filter_backward_sample(kalman, z_h, prior_mu_h, prior_cov_h) return sampled_h.reshape((n,))
def sample(self, model, evidence): z, T, g, h, sigma_h, phi = [ evidence[var] for var in ['z', 'T', 'g', 'h', 'sigma_h', 'phi'] ] sigma_z_h = model.known_params['sigma_z_h'] mu_h = model.known_params['mu_h'] prior_mu_h = model.hyper_params['prior_mu_h'] prior_cov_h = model.hyper_params['prior_cov_h'] n = len(h) g = g.copy().reshape((n, 1)) h = h.copy().reshape((n, 1)) z_h = ma.asarray(z.copy().reshape((n, 1))) if sum(T == 0) > 0: z_h[T == 0] = nan if sum(T == 1) > 0: z_h[T == 1] = nan if sum(T == 2) > 0: z_h[T == 2] -= g[T == 2] z_h[isnan(z_h)] = ma.masked kalman = self._kalman kalman.initial_state_mean = array([ prior_mu_h[0], ]) kalman.initial_state_covariance = array([ prior_cov_h[0, 0], ]) kalman.transition_matrices = array([ phi, ]) kalman.transition_covariance = array([ sigma_h**2, ]) kalman.transition_offsets = mu_h * (1 - phi) * ones((n, 1)) kalman.observation_matrices = eye(1) kalman.observation_covariance = array([ sigma_z_h**2, ]) sampled_h = forward_filter_backward_sample(kalman, z_h) return sampled_h.reshape((n, ))
def sample(self, model, evidence): z = evidence['z'] T, g, h, sigma_g = [ evidence[var] for var in ['T', 'g', 'h', 'sigma_g'] ] sigma_z_g = model.known_params['sigma_z_g'] sigma_z_h = model.known_params['sigma_z_h'] prior_mu_g, prior_cov_g = [ model.hyper_params[var] for var in ['prior_mu_g', 'prior_cov_g'] ] n = len(g) # Must be a more concise way to deal with scalar vs vector g = g.copy().reshape((n, 1)) h = h.copy().reshape((n, 1)) z_g = ma.asarray(z.copy().reshape((n, 1))) obs_cov = sigma_z_g**2 * ones((n, 1, 1)) if sum(T == 0) > 0: z_g[T == 0] = nan if sum(T == 2) > 0: z_g[T == 2] -= h[T == 2] obs_cov[T == 2] = sigma_z_h**2 z_g[isnan(z_g)] = ma.masked kalman = self._kalman kalman.initial_state_mean = array([ prior_mu_g[0], ]) kalman.initial_state_covariance = array([ prior_cov_g[0, 0], ]) kalman.transition_matrices = eye(1) kalman.transition_covariance = array([ sigma_g**2, ]) kalman.observation_matrices = eye(1) kalman.observation_covariance = obs_cov sampled_g = forward_filter_backward_sample(kalman, z_g) return sampled_g.reshape((n, ))
def sample(self, model, evidence): z = evidence['z'] T, g, sigma_g = [evidence[var] for var in ['T', 'g', 'sigma_g']] sigma_z_g = model.known_params['sigma_z_g'] prior_mu_g, prior_cov_g = [model.hyper_params[var] for var in ['prior_mu_g', 'prior_cov_g']] n = len(g) z_g = z.copy() z_g[T == 0] = nan z_g = ma.asarray(z_g) z_g[isnan(z_g)] = ma.masked kalman = self._kalman kalman.initial_state_mean=prior_mu_g[0] kalman.initial_state_covariance=prior_cov_g[0,0] kalman.transition_matrices=1 kalman.transition_covariance=sigma_g**2 kalman.observation_matrices=1 kalman.observation_covariance=sigma_z_g**2 pdb.set_trace() sampled_g = forward_filter_backward_sample(kalman, z_g) return sampled_g
def sample(self, model, evidence): z = evidence['z'] T, surfaces, sigma_g, sigma_h = [ evidence[var] for var in ['T', 'surfaces', 'sigma_g', 'sigma_h'] ] mu_h, phi, sigma_z_g, sigma_z_h = [ model.known_params[var] for var in ['mu_h', 'phi', 'sigma_z_g', 'sigma_z_h'] ] prior_mu_g, prior_cov_g = [ model.hyper_params[var] for var in ['prior_mu_g', 'prior_cov_g'] ] prior_mu_h, prior_cov_h = [ model.hyper_params[var] for var in ['prior_mu_h', 'prior_cov_h'] ] n = len(g) y = ma.asarray(ones((n, 2)) * nan) if sum(T == 1) > 0: y[T == 1, 0] = z[T == 1] if sum(T == 2) > 0: y[T == 2, 1] = z[T == 2] y[isnan(y)] = ma.masked kalman = self._kalman kalman.initial_state_mean = [prior_mu_g[0], prior_mu_h[0]] kalman.initial_state_covariance = diag( [prior_cov_g[0, 0], prior_cov_h[0, 0]]) kalman.transition_matrices = [[1, 0], [0, phi]] kalman.transition_offsets = ones((n, 2)) * [0, mu_h * (1 - phi)] kalman.transition_covariance = [[sigma_g**2, 0], [0, sigma_h**2]] kalman.observation_matrices = [[1, 0], [1, 1]] kalman.observation_covariance = [[sigma_z_g**2, 0], [0, sigma_z_h**2]] sampled_surfaces = forward_filter_backward_sample(kalman, y) return sampled_surfaces