EXPERIMENT 01 / JOINT DISTRIBUTIONS

Privacy Waves.

Paint a distribution, add privacy noise, and see where the mass moves.

01 / SOURCE

Wavetable

Paint weights for two bucketed variables.

Drag to paint256 bins

Use arrow keys and Space to paint with the keyboard.

02 / SIMULATION

Privacy controls

Set the budget and draw size.

More noiseLess noise
10250k
Random seed
Count noise scale2 / ε = 3.08 per cell

03 / RESULTS

Distortion

Compare independent runs.

Preparing the first simulation…

How the simulation works

  1. Normalize the painted weights to a joint distribution, then draw one histogram of N observations. Every run in the batch uses this same input sample.
  2. Laplace per cell. Add independent Laplace noise with scale 2/ε to each count, using fixed-size, replace-one adjacency. Clamp negative counts to zero and normalize. If every count is zero, use a uniform distribution.
  3. Private moments. Map the ordered bucket indices to [−1, 1]. Split ε equally across the means of X, Y, X², Y² and XY. Add Laplace noise calibrated to each mean’s range divided by N, then fit a regularized maximum-entropy distribution on the grid. The fit can trade fine cell detail for more accurate correlation.
  4. Draw N synthetic observations per run from the corresponding fitted distribution. Loss is synthetic probability minus painted probability. TV is half the sum of absolute losses. Pearson r uses the bucket indices and is undefined if either axis has zero variance.

Each run uses ε independently. The original, loss tables, and seeded simulation are for exploration with synthetic inputs. Releasing multiple private runs on real data would require composition accounting.

Read the Laplace mechanism reference ↗