DP Aggregation Demo(Postgres + Laplace)
本 demo 演示在 PostgreSQL 上包一层 Laplace 机制,对
COUNT、SUM、AVG
三个聚合函数做差分隐私发布。它是教学级实现,刻意忽略了很多生产必需的
能力(见文末”不包含什么”)。
依赖
- Python 3.10+
psycopg >= 3.1numpy >= 1.24
pip install 'psycopg[binary]>=3.1' 'numpy>=1.24'准备一张最小表
CREATE TABLE people (
id SERIAL PRIMARY KEY,
age INT,
salary NUMERIC
);
INSERT INTO people (age, salary)
SELECT (random()*60+18)::int,
(random()*100000+20000)::numeric
FROM generate_series(1, 10000);运行
python dp_agg.py --dsn postgresql://user:pw@localhost/demo \
--table people --epsilon 1.0输出类似:
Budget total = 1.0
dp_count(age > 30) ~= 7823.91
dp_sum(salary where age > 30) ~= 548219100.33
dp_avg(salary where age > 30) ~= 70104.55
Budget remaining = 0.0
如何观察噪声与 ε 的关系
多次运行、对比
ε = 0.1、ε = 1.0、ε = 10.0
的输出方差:
for e in 0.1 1.0 10.0; do
for i in 1 2 3 4 5; do
python dp_agg.py --dsn "$DSN" --table people --epsilon "$e"
done
done直观感受:ε 越小,加噪越重;ε 越大,越接近真值但隐私越弱。
不包含什么
| 能力 | 状态 | 说明 |
|---|---|---|
| 持久化预算账本 | 未实现 | 程序退出即丢,生产必须放数据库 / KMS |
| Rényi / zCDP 会计 | 未实现 | 用的是 basic composition,浪费预算 |
| JOIN 敏感度 | 未实现 | 参考 FLEX (VLDB 2018) 的 Elastic Sensitivity |
| COUNT DISTINCT | 未实现 | 敏感度不是 1,需要专门机制 |
| 私有均值(Private Mean) | 未实现 | 这里用 “SUM/COUNT” 是有偏估计 |
| User-level DP | 未实现 | 默认 event-level;需按用户聚合后再加噪 |
| 随机数安全性 | 仅教学 | 用的是 NumPy PRNG,不是 crypto-grade;生产用 secrets 或 OpenDP |
生产部署建议直接使用 OpenDP 或 Tumult Analytics,它们把上面这些坑都补齐了,并且提供可审计的机制实现。