(with applications to differential privacy)
Documentation can be found at https://private-pgm.readthedocs.io/en/latest/!
Consider joining the Google Differential Privacy community in Slack.
from mbi import Domain, estimation, marginal_loss, callbacks
# Define a domain
domain = Domain(["age", "sex", "income"], [10, 2, 5])
# Provide noisy marginal measurements
measurements = [
marginal_loss.LinearMeasurement(noisy_marginal_1, ("age", "sex")),
marginal_loss.LinearMeasurement(noisy_marginal_2, ("sex", "income")),
]
# Estimate a graphical model
model = estimation.MirrorDescent().estimate(domain, measurements, iters=1000)
# Use the model
synthetic_data = model.synthetic_data(rows=1000)
age_sex_marginal = model.project(("age", "sex")).datavector()All estimators share the same Estimator API:
# Mirror Descent (recommended)
model = estimation.MirrorDescent().estimate(domain, measurements)
# Dual Averaging
model = estimation.DualAveraging().estimate(domain, measurements)
# Interior Gradient
model = estimation.InteriorGradient().estimate(domain, measurements)Extension estimators provide alternative representations:
from mbi.extensions.mixture_of_products import MixtureOfProductsEstimator
from mbi.extensions.reweighted_dataset import ReweightedDatasetEstimator
# Mixture of Products (scalable, no graphical model)
model = MixtureOfProductsEstimator(num_components=100).estimate(domain, measurements)
# Reweighted Dataset (produces a weighted dataset)
model = ReweightedDatasetEstimator(seed_data=data).estimate(domain, measurements)Monitor optimization progress with callbacks:
cb = callbacks.default(measurements)
model = estimation.MirrorDescent().estimate(
domain, measurements, iters=1000, callback_fn=cb,
)