The Innovate library provides tools for modeling innovation and policy diffusion, with implementations of classic diffusion models and advanced fitting techniques.
For new user code, prefer the stable package-level imports:
from innovate import BassModel, GompertzModel, LogisticModel, ScipyFitter
from innovate.compete import MultiProductDiffusionModel, LotkaVolterraModel
from innovate.substitute import CompositeDiffusionModel, FisherPryModel, NortonBassModel
from innovate.ecosystem import ComplementaryGoodsModel
from innovate.backends import use_backendLegacy imports such as innovate.backend and innovate.compete.competition remain importable for compatibility, but the package-level imports above define the intended public API surface.
- Bass Model (
innovate.diffuse.bass.BassModel): Implementation of the classic Bass diffusion model - Logistic Model (
innovate.diffuse.logistic.LogisticModel): Logistic growth model - Gompertz Model (
innovate.diffuse.gompertz.GompertzModel): Gompertz growth model
The Bass model is defined by the differential equation:
Where:
pis the coefficient of innovationqis the coefficient of imitationmis the market potential
Key Methods:
initial_guesses(t, y): Provides initial parameter guessesbounds(t, y): Defines parameter boundspredict(t, covariates=None): Predicts cumulative adoptionscore(t, y, covariates=None): Calculates R² scoreparams_: Property for accessing/modifying model parameters
- DiffusionModel (
innovate.base.base.DiffusionModel): Abstract base class for diffusion models
- ScipyFitter (
innovate.fitters.scipy_fitter.ScipyFitter): Fitting using scipy optimizers - BayesianFitter (
innovate.fitters.bayesian_fitter.BayesianFitter): Bayesian parameter estimation - BlackJaxFitter (
innovate.fitters.blackjax_fitter.BlackjaxFitter): JAX-based MCMC fitting
- MultiProductDiffusionModel (
innovate.compete.MultiProductDiffusionModel): Stable matrix-form multi-product diffusion API
- Backend switching: Support for NumPy and JAX backends
use_backend(name): Switch between computational backends
- Growth Models: Various growth curve implementations
- Competition Models:
innovate.dynamics.competition- Lotka-Volterra, Market Share Attraction, Replicator Dynamics - Contagion Models:
innovate.dynamics.contagion- SIR, SIS, SEIR models for contagion dynamics
- LotkaVolterraCompetition (
innovate.dynamics.competition.lotka_volterra.LotkaVolterraCompetition): Models competition between two species using Lotka-Volterra equations - MarketShareAttraction (
innovate.dynamics.competition.market_share_attraction.MarketShareAttraction): Determines market share based on relative attractiveness - ReplicatorDynamics (
innovate.dynamics.competition.replicator_dynamics.ReplicatorDynamics): Models evolution of strategy proportions based on relative fitness
- SIRModel (
innovate.dynamics.contagion.sir.SIRModel): Susceptible-Infected-Recovered model - SISModel (
innovate.dynamics.contagion.sis.SISModel): Susceptible-Infected-Susceptible model - SEIRModel (
innovate.dynamics.contagion.seir.SEIRModel): Susceptible-Exposed-Infected-Recovered model
Common Methods for Dynamics Models:
compute_spread_rate(**params)orcompute_interaction_rates(**params): Calculate instantaneous ratespredict_states(time_points, **params): Predict states at specified time pointsget_parameters_schema(): Get parameters schema
from innovate import BassModel, ScipyFitter
# Create model and fitter
model = BassModel()
fitter = ScipyFitter()
# Fit to data
t_data = [0, 1, 2, 3, 4, 5] # time points
y_data = [10, 25, 45, 70, 90, 95] # adoption values
# Perform fitting
fitted_model = model.fit(fitter, t_data, y_data)
# Make predictions
predictions = fitted_model.predict([6, 7, 8])# Create model with covariates
model = BassModel(covariates=["marketing_spend", "price"])
# The model will automatically include parameters for covariate effects
# like beta_p_marketing_spend, beta_q_marketing_spend, etc.from innovate.backends import use_backend
# Switch to JAX backend for GPU acceleration
use_backend('jax')
# Switch back to NumPy
use_backend('numpy')- Flexible Parameterization: Models support covariates and structural breaks
- Multiple Backends: NumPy and JAX support with automatic differentiation
- Advanced Fitting: Classical, Bayesian, and MCMC fitting methods
- Competition Modeling: Multi-product models with competitive effects
- Performance Optimized: Designed for computational efficiency
- Unfitted Model Errors: Calling
predict()on unfitted models raisesRuntimeError - Parameter Validation: Automatic parameter bounds checking
- Numerical Stability: Built-in checks for numerical issues
# Use NumPy backend (default)
from innovate.backend import use_backend
use_backend('numpy')
# Use JAX backend (for advanced features)
use_backend('jax')The library implements diffusion processes based on ordinary differential equations:
- Bass Model:
(dN/dt) = p(M-N) + q(M-N)(N/M)where N is cumulative adoptions, M is market size - Logistic Model:
(dP/dt) = rP(1-P/K)where P is population, r is growth rate, K is carrying capacity - Gompertz Model:
(dP/dt) = rP*ln(K/P)with similar parameters as logistic
- Use JAX backend for maximum performance and GPU acceleration
- Consider using batched fitting for multiple time series
- For large datasets, consider using the Bayesian fitters
- Memory usage grows with the number of parameters and time points
To create a new diffusion model, inherit from DiffusionModel and implement the required abstract methods:
from innovate.base.base import DiffusionModel
class NewModel(DiffusionModel):
def predict(self, t):
# Implement prediction logic
pass
def score(self, t, y):
# Implement scoring logic
pass
@property
def params_(self):
# Implement params property
pass
@params_.setter
def params_(self, value):
# Implement params setter
pass