java、python--差分隐私拉普拉斯分布(Laplace)实现
近在研究差分隐私,先⽤java实现了拉普拉斯分布,做了个Hive交互式接⼝。后来⼜⽤python画图,准备做个⾮交互式数据发布。
差分隐私的原理我先简单介绍⼀下,Apple ⽤它来实现信息安全。这⾥举⼀个例⼦来帮助理解,考虑⼀个医疗数据场景:
上图显⽰了⼀个医疗数据集D,其中每条记录表⽰⼀个患者是否患有癌症,当数据集作为科研数据或者社会调研被发布出来时,他对⽤户仅提供前n ⾏的统计查询服务,这⾥选取计数查询,⽤count (n) 表⽰前n ⾏⾥有多少个⼈患有癌症。
这⾥攻击者A 知道Jack 排在第3⾏(医疗数据记录⼀般按⼀定顺序排列,例如⾝份证号等),由于不能直接访问D(注意 D 仅提供 count (n) 查询服务), A ⼀开始并不知道Jack 的第⼆列属性值是否为1,但是A 可以通过如下攻击获取Jack 的个⼈隐私信息(是否患有癌症):count (3) - count (2)。
那么差分隐私技术在该案例中是如何保证信息安全的呢?我们可以把删除掉Jack ⼀⾏的数据集(或修改)看成D',要求A 根据D 获取的count 值,与根据D' 获取的count 值的概率分布差不多,假设count (3) 的输出可能来⾃{1.5, 2},那么count (2) 以近似的概率输出{1.5, 2} 中的任意值,Laplace 机制便能实现此功能,具体证明这⾥就不说了都是复杂的数学公式。 ϵ-DP的 ϵ 值就是⽤来控制概率分布的相似性,当 ϵ 越⼩时,exp( ϵ ) 越接近于1。
拉普拉斯分布图:
废话不说上代码,java代码:
[java]
1. import org.apachemons.math3.distribution.LaplaceDistribution;
2. double laplaceMechanismCount(long realCountResult, double epsilon) {
3. LaplaceDistribution ld = new LaplaceDistribution(0, 1 / epsilon);
python转java代码4. double noise = ld.sample();
5. return realCountResult + noise;
6. }
python代码:
[python]
1. import numpy as np
2. loc, scale = 0., 1.
3. s = np.random.laplace(loc, scale, 1)
4. ss=s[0]
5. print ss
其中epsilon和scale调节保护性的⼤⼩。