-
Notifications
You must be signed in to change notification settings - Fork 65
Description
Trying to model some data with a negative binomial duration distribution...the /util/cstats/sample_crp_tablecounts function was failing because its second argument integral[:,:] customers was being passed in as a float. The numbers being passed in appear to be durations in n_samples, so they're guaranteed to be integers, so I fixed by changing line 31 in pyhsmm/distributions (within the _StartAtOneMixin.resample() method) from
return super(_StartAtOneMixin,self).resample(data-1, *args,**kwargs)
to
return super(_StartAtOneMixin,self).resample((data-1).astype('int'), *args,**kwargs).
If I have time I'll try to track down what caused the error in the first place.
*** Code to reproduce ***
data = np.arange(10).reshape(-1,1)
Nmax = 25
# and some hyperparameters
obs_dim = data.shape[1]
obs_hypparams = {'mu_0':np.zeros(obs_dim),
'sigma_0':np.eye(obs_dim),
'kappa_0':0.25,
'nu_0':obs_dim+2}
obs_distns = [pyhsmm.distributions.Gaussian(**obs_hypparams) for state in range(Nmax)]
dur_hypparams = {'r':3., 'p':0.5, 'k_0':2., 'theta_0':2., 'alpha_0':2., 'beta_0':2.}
dur_distns = [pyhsmm.distributions.NegativeBinomialDuration(**dur_hypparams) for state in range(Nmax)]
posteriormodel = pyhsmm.models.WeakLimitHDPHSMM(
alpha=6.,gamma=6., # these can matter; see concentration-resampling.py
init_state_concentration=6., # pretty inconsequential
obs_distns=obs_distns,
dur_distns=dur_distns)
posteriormodel.add_data(data, trunc=60) # duration truncation speeds things up when it's possible
for idx in progprint_xrange(150):
posteriormodel.resample_model()
*** Traceback from error ***
TypeError Traceback (most recent call last)
/tmp/ipykernel_16301/156295421.py in
35
36 for idx in progprint_xrange(150):
---> 37 posteriormodel.resample_model()~/datta-lab/pyhsmm/pyhsmm/models.py in resample_model(self, num_procs)
454 @line_profiled
455 def resample_model(self,num_procs=0):
--> 456 self.resample_parameters()
457 self.resample_states(num_procs=num_procs)
458~/datta-lab/pyhsmm/pyhsmm/models.py in resample_parameters(self, **kwargs)
964 @line_profiled
965 def resample_parameters(self,**kwargs):
--> 966 self.resample_dur_distns()
967 super(_HSMMGibbsSampling,self).resample_parameters(**kwargs)
968~/datta-lab/pyhsmm/pyhsmm/models.py in resample_dur_distns(self)
969 def resample_dur_distns(self):
970 for state, distn in enumerate(self.dur_distns):
--> 971 distn.resample_with_censoring_and_truncation(
972 data=
973 [s.durations_censored[s.untrunc_slice][s.stateseq_norep[s.untrunc_slice] == state]~/datta-lab/pyhsmm/pyhsmm/basic/abstractions.py in resample_with_censoring_and_truncation(self, data, censored_data, left_truncation_level)
101 rejected_observations = []
102
--> 103 self.resample(data=combinedata((data,filled_in,rejected_observations)))
104
105 @Property~/datta-lab/pyhsmm/pyhsmm/basic/distributions.py in resample(self, data, *args, **kwargs)
33 else:
34 # return super(_StartAtOneMixin,self).resample([(d-1).astype('int') for d in data],*args,**kwargs)
---> 35 return super(_StartAtOneMixin,self).resample([d-1 for d in data],*args,**kwargs)
36
37 def max_likelihood(self,data,weights=None,*args,**kwargs):~/miniconda3/envs/dataPy_NWB/lib/python3.9/site-packages/pybasicbayes/distributions/negativebinomial.py in resample(self, data, niter)
113 for itr in range(niter):
114 ### resample r
--> 115 msum = sample_crp_tablecounts(self.r,data).sum()
116 self.r = np.random.gamma(self.k_0 + msum, 1/(1/self.theta_0 - N*np.log(1-self.p)))
117 ### resample ppybasicbayes/util/cstats.pyx in pybasicbayes.util.cstats.__pyx_fused_cpdef()
TypeError: Function call with ambiguous argument types