I’m modeling a PDE for wildfire spread and want to use PyMC to recover parameters. I’m using a custom likelihood function that finds the Intersection Over Union metric comparing the predicted and observed burned areas. I want to use map these metrics to a Beta(5,1) distribution and use that as a likelihood estimate. The code should be something like what’s shown below. However, when I try to run it I get an error that the initial evaluation of the model at the starting point failed. These are the results given:
Any ideas for how to approach troubleshooting this would be appreciated.
def get_IoUs(T_preds, T_obs, burn=600): ''' Calculates IOU score between observed and predicted fire perimeters and maps it to a likelihood. ''' n_per, n_data = T_obs.shape burn_pred = T_preds >= burn burn_obs = T_obs >= burn IoUs = tt.zeros(n_per) for p in range(n_per): pred = burn_pred[p*n_data:(p+1)*n_data] obs = burn_obs[p].flatten() intersection = pred*obs union = pred + obs if tt.gt(union.sum(),0): IoU = intersection.sum()/union.sum() else: IoU = 1 IoUs = tt.set_subtensor(IoUs[p], IoU) return IoUs with pm.Model() as model: # Set prior distributions. k = pm.Lognormal("k", mu=np.log(1), sigma=4, shape=(1,)) # Collision frequency A = pm.Lognormal("A", mu=np.log(9000.), sigma=100, shape=(1,)) # Pre-exponential factor (rate) B = pm.Lognormal("B", mu=np.log(300.), sigma=100, shape=(1,)) # Proportionality Coefficient/Activation Energy C = pm.Lognormal("C", mu=np.log(1/10000), sigma=1/10000, shape=(1,)) # Scaled Heat Transfer Coefficient Cs = pm.Lognormal("Cs", mu=np.log(3), sigma=3, shape=(1,)) # Fuel Relative Disappearance Rate # Run the model. T_preds = theano_fem_solver(k, A, B, C, Cs) # Calculate the likelihood. IoUs = pm.Deterministic("IoUs",get_IoUs(T_preds, Ts_observed)) likelihood = Beta('likelihood', alpha=5, beta=1, observed=IoUs) # MCMC: trace = pm.sample(tune=5, draws=5)