1. 程式人生 > >java、python--差分隱私拉普拉斯分佈(Laplace)實現

java、python--差分隱私拉普拉斯分佈(Laplace)實現

最近在研究差分隱私,先用java實現了拉普拉斯分佈,做了個Hive互動式介面。後來又用python畫圖,準備做個非互動式資料釋出。

差分隱私的原理我先簡單介紹一下,Apple 用它來實現資訊保安。這裡舉一個例子來幫助理解,考慮一個醫療資料場景:


       上圖顯示了一個醫療資料集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程式碼:

import org.apache.commons.math3.distribution.LaplaceDistribution;
double laplaceMechanismCount(long realCountResult, double epsilon) {
LaplaceDistribution ld = new LaplaceDistribution(0, 1 / epsilon);
double noise = ld.sample();
return realCountResult + noise;
}
      python程式碼:
import numpy as np
loc, scale = 0., 1.
s = np.random.laplace(loc, scale, 1)
ss=s[0]
print ss
其中epsilon和scale調節保護性的大小。