v4.0.0b1
Pre-release
Pre-release
PyMC 4.0.0 beta 1
⚠ This is the first beta of the next major release for PyMC 4.0.0 (formerly PyMC3). 4.0.0 is a rewrite of large parts of the PyMC code base which make it faster, adds many new features, and introduces some breaking changes. For the most part, the API remains stable and we expect that most models will work without any changes.
Not-yet working features
We plan to get these working again, but at this point, their inner workings have not been refactored.
- Timeseries distributions (see #4642)
- Mixture distributions (see #4781)
- Cholesky distributions (see WIP PR #4784)
- Variational inference submodule (see WIP PR #4582)
- Elliptical slice sampling (see #5137)
BaseStochasticGradient(see #5138)pm.sample_posterior_predictive_w(see #4807)- Partially observed Multivariate distributions (see #5260)
Also, check out the milestones for a potentially more complete list.
Unexpected breaking changes (action needed)
- New API is not available in
v3.11.5. - Old API does not work in
v4.0.0.
All of the above applies to:
- ⚠ The library is now named, installed, and imported as "pymc". For example:
pip install pymc. (Usepip install pymc --prewhile we are in the pre-release phase.) - ⚠ Theano-PyMC has been replaced with Aesara, so all external references to
theano,tt, andpymc3.theanofneed to be replaced withaesara,at, andpymc.aesaraf(see 4471). pm.Distribution(...).logp(x)is nowpm.logp(pm.Distribution(...), x)pm.Distribution(...).logcdf(x)is nowpm.logcdf(pm.Distribution(...), x)pm.Distribution(...).random()is nowpm.Distribution(...).eval()pm.draw_values(...)andpm.generate_samples(...)were removed. The tensors can now be evaluated with.eval().pm.fast_sample_posterior_predictivewas removed.pm.sample_prior_predictive,pm.sample_posterior_predictiveandpm.sample_posterior_predictive_wnow return anInferenceDataobject by default, instead of a dictionary (see #5073).pm.sample_prior_predictiveno longer returns transformed variable values by default. Pass them by name invar_namesif you want to obtain these draws (see 4769).pm.sample(trace=...)no longer acceptsMultiTraceorlen(.) > 0traces (see 5019#).- The GLM submodule was removed, please use Bambi instead.
pm.Boundinterface no longer accepts a callable class as an argument, instead, it requires an instantiated distribution (created via the.dist()API) to be passed as an argument. In addition, Bound no longer returns a class instance but works as a normal PyMC distribution. Finally, it is no longer possible to do predictive random sampling from Bounded variables. Please, consult the new documentation for details on how to use Bounded variables (see 4815).pm.logpt(transformed=...)kwarg was removed (816b5f).Model(model=...)kwarg was removedModel(theano_config=...)kwarg was removedModel.sizeproperty was removed (useModel.ndiminstead).dimsandcoordshandling:Model.update_start_values(...)was removed. Initial values can be set in theModel.initial_valuesdictionary directly.- Test values can no longer be set through
pm.Distribution(testval=...)and must be assigned manually. Transform.forwardandTransform.backwardsignatures changed.pm.DensityDistno longer accepts thelogpas its first positional argument. It is now an optional keyword argument. If you pass a callable as the first positional argument, aTypeErrorwill be raised (see 5026).pm.DensityDistnow accepts distribution parameters as positional arguments. Passing them as a dictionary in theobservedkeyword argument is no longer supported and will raise an error (see 5026).- The signature of the
logpandrandomfunctions that can be passed into apm.DensityDisthas been changed (see 5026). - Changes to the Gaussian process (
gp) submodule:- The
gp.prior(..., shape=...)kwarg was renamed tosize. - Multiple methods including
gp.priornow require explicit kwargs.
- The
- Changes to the BART implementation:
- Changes to the Gaussian Process (GP) submodule (see 5055):
- For all implementations,
gp.Latent,gp.Marginaletc.,cov_funcandmean_funcare required kwargs. - In Windows test conda environment the
mklversion is fixed to verison 2020.4, andmkl-serviceis fixed to2.3.0. This was required forgp.MarginalKronto function properly. gp.MvStudentTuses rotated samples fromStudentTdirectly now, instead of sampling frompm.Chi2and then frompm.Normal.- The "jitter" parameter, or the diagonal noise term added to Gram matrices such that the Cholesky is numerically stable, is now exposed to the user instead of hard-coded. See the function
gp.util.stabilize. - The
is_observedargument forgp.Marginal*implementations has been deprecated. - In the gp.utils file, the
kmeans_inducing_pointsfunction now passes throughkmeans_kwargsto scipy's k-means function. - The function
replace_with_valuesfunction has been added togp.utils. MarginalSparsehas been renamedMarginalApprox.
- For all implementations,
Expected breaks
- New API was already available in
v3. - Old API had deprecation warnings since at least
3.11.0(2021-01). - Old API stops working in
v4(preferably with informative errors).
All of the above apply to:
pm.sample(return_inferencedata=True)is now the default (see #4744).- ArviZ
plotsandstatswrappers were removed. The functions are now just available by their original names (see #4549 and3.11.2release notes). pm.sample_posterior_predictive(vars=...)kwarg was removed in favor ofvar_names(see #4343).ElemwiseCategoricalstep method was removed (see #4701)
Ongoing deprecations
- Old API still works in
v4and has a deprecation warning. - Preferably the new API should be available in
v3already
New features
- The length of
dimsin the model is now tracked symbolically throughModel.dim_lengths(see #4625). - The
CARdistribution has been added to allow for use of conditional autoregressions which often are used in spatial and network models. - The dimensionality of model variables can now be parametrized through either of
shape,dimsorsize(see #4696):- With
shapethe length of dimensions must be given numerically or as scalar AesaraVariables. Numeric entries inshaperestrict the model variable to the exact length and re-sizing is no longer possible. dimskeeps model variables re-sizeable (for example throughpm.Data) and leads to well-defined coordinates inInferenceDataobjects.- The
sizekwarg behaves as it does in Aesara/NumPy. For univariate RVs it is the same asshape, but for multivariate RVs it depends on how the RV implements broadcasting to dimensionality greater thanRVOp.ndim_supp. - An
Ellipsis(...) in the last position ofshapeordimscan be used as shorthand notation for implied dimensions.
- With
- Added a
logcdfimplementation for the Kumaraswamy distribution (see #4706). - The
OrderedMultinomialdistribution has been added for use on ordinal data which are aggregated by trial, like multinomial observations, whereasOrderedLogisticonly accepts ordinal data in a disaggregated format, like categorical
observations (see #4773). - The
Polya-Gammadistribution has been added (see #4531). To make use of this distribution, thepolyagamma>=1.3.1library must be installed and available in the user's environment. - A small change to the mass matrix tuning methods jitter+adapt_diag (the default) and adapt_diag improves performance early on during tuning for some models. #5004
- New experimental mass matrix tuning method jitter+adapt_diag_grad. #5004
pm.DensityDistcan now accept an optionallogcdfkeyword argument to pass in a function to compute the cummulative density function of the distribution (see 5026).pm.DensityDistcan now accept an optionalget_momentkeyword argument to pass in a function to compute the moment of the distribution (see 5026).- New features for BART:
pm.Datanow passes additional kwargs toaesara.shared. #5098- ...
Internal changes
- ⚠ PyMC now requires Scipy version
>= 1.4.1(see 4857). - Removed float128 dtype support (see #4514).
- Logp method of
UniformandDiscreteUniformno longer depends onpymc.distributions.dist_math.boundfor proper evaluation (see #4541). - We now include
cloudpickleas a required dependency, and no longer depend ondill(see #4858). - The
incomplete_betafunction inpymc.distributions.dist_mathwas replaced byaesara.tensor.betainc(see 4857). math.log1mexpandmath.log1mexp_numpywill expect negative inputs in the future. AFutureWarningis now raised unlessnegative_input=Trueis set (see #4860).- Changed name of
Lognormaldistribution toLogNormalto harmonize CamelCase usage for distribution names. - Attempt to iterate over MultiTrace will raise NotImplementedError.
- ...