土法炼钢兴趣小组的算法知识备份

DP Aggregation Demo(Postgres + Laplace)

源码下载

本文相关源码已整理,共 1 个文件。

打开下载目录 →

目录

DP Aggregation Demo(Postgres + Laplace)

本 demo 演示在 PostgreSQL 上包一层 Laplace 机制,对 COUNTSUMAVG 三个聚合函数做差分隐私发布。它是教学级实现,刻意忽略了很多生产必需的 能力(见文末”不包含什么”)。

依赖

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

生产部署建议直接使用 OpenDPTumult Analytics,它们把上面这些坑都补齐了,并且提供可审计的机制实现。


By .