java、python--差分隐私拉普拉斯分布(Laplace)实现

近在研究差分隐私,先用java实现了拉普拉斯分布,做了个Hive交互式接口。后来又用python画图,准备做个非交互式数据发布。

差分隐私的原理我先简单介绍一下,Apple 用它来实现信息安全。这里举一个例子来帮助理解,考虑一个医疗数据场景:

java、python--差分隐私拉普拉斯分布(Laplace)实现

       上图显示了一个医疗数据集D,其中每条记录表示一个患者是否患有癌症,当数据集作为科研数据或者社会调研被发布出来时,他对用户提供前行的统计查询服务,这里选取计数查询,用count (n) 表示前行里有多少个人患有癌症。

       这里攻击者知道Jack 排在第3行(医疗数据记录一般按一定顺序排列,例如身份证号等),由于不能直接访问D(注意 D 仅提供 count (n) 查询服务), 一开始并不知道Jack 的第二列属性值是否为1,但是可以通过如下攻击获取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、python--差分隐私拉普拉斯分布(Laplace)实现

java、python--差分隐私拉普拉斯分布(Laplace)实现

       废话不说上代码,java代码:

[java] view plain copy
  1. import org.apache.commons.math3.distribution.LaplaceDistribution;  
  2. double laplaceMechanismCount(long realCountResult, double epsilon) {  
  3. LaplaceDistribution ld = new LaplaceDistribution(01 / epsilon);  
  4. double noise = ld.sample();  
  5. return realCountResult + noise;  
  6. }  
      python代码:

[python] view plain copy
  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调节保护性的大小。