Skip to content

sample_crp_tablecounts in cstats fails in certain cases #57

@jonahpearl

Description

@jonahpearl

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 p

pybasicbayes/util/cstats.pyx in pybasicbayes.util.cstats.__pyx_fused_cpdef()

TypeError: Function call with ambiguous argument types

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions