差分隐私技术

差分隐私的核心思想是通过在查询结果中添加噪音来保护数据隐私。
添加的噪音应该满足拉普拉斯分布或高斯分布等概率分布。由于添加噪音的过程是不可逆的,因此不能直接从添加噪音后的数据中还原出原始数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde

# epsilon是隐私预算,delta是安全参数,sensitivity是数据敏感度
def add_noise(data, epsilon, delta, sensitivity):
beta = sensitivity / epsilon
noise = np.random.laplace(0, beta / delta, len(data))
return data + noise

# 示例数据
# original_data = np.array([129, 209, 311, 423, 52, 918, 392, 200, 500])
original_data = np.random.normal(loc=50, scale=100, size=500)

# 隐私预算, 较小的值表示更强的隐私保护, 但是数据会更为失真
epsilon = 0.8
# 安全参数, 较小的值表示更强的隐私保护
delta = 0.01
# 数据敏感度, 用于衡量对单个数据点更改可能引起的输出变化 敏感度越大,数据变化对输出的影响越大
sensitivity = 0.2
noisy_data = add_noise(original_data, epsilon, delta, sensitivity)

# 打印原始数据和添加噪音后的数据
print("Original data:", original_data)
print("Noisy data:", noisy_data)
print(sum(original_data), sum(noisy_data)) # 会有一定的偏移

# 计算原始数据的概率密度估计
original_density = gaussian_kde(original_data)
original_x = np.linspace(np.min(original_data), np.max(original_data), 1000)
original_y = original_density(original_x)

# 计算加密后数据的概率密度估计
noisy_density = gaussian_kde(noisy_data)
noisy_x = np.linspace(np.min(noisy_data), np.max(noisy_data), 1000)
noisy_y = noisy_density(noisy_x)

# 绘制原始数据和加密后数据的概率密度曲线图
plt.figure(figsize=(8, 6))
plt.plot(original_x, original_y, label='Original Data')
plt.plot(noisy_x, noisy_y, label='Noisy Data')
plt.xlabel('Value')
plt.ylabel('Probability Density')
plt.title('Data Distribution')
plt.legend()
plt.show()