java、python--差分隱私拉普拉斯分佈(Laplace)實現
阿新 • • 發佈:2018-12-31
最近在研究差分隱私,先用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程式碼:
python程式碼: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; }
import numpy as np
loc, scale = 0., 1.
s = np.random.laplace(loc, scale, 1)
ss=s[0]
print ss
其中epsilon和scale調節保護性的大小。