import numpy as np
def laplace_mechanism(data, sensitivity, epsilon):
# 计算噪声比例
beta = sensitivity / epsilon
# 生成符合拉普拉斯分布的噪声
noise = np.random.laplace(loc=0.0, scale=beta, size=data.shape)
# 加密数据
encrypted_data = data + noise
return encrypted_data
def laplace_mechanism_inverse(encrypted_data, sensitivity, epsilon):
# 计算噪声比例
beta = sensitivity / epsilon
# 生成符合拉普拉斯分布的噪声
noise = np.random.laplace(loc=0.0, scale=beta, size=encrypted_data.shape)
# 解密还原数据
decrypted_data = encrypted_data - noise
return decrypted_data
# 加载数据集
data = np.array([[5.1, 3.5, 1.4, 0.2],
[4.9, 3.0, 1.4, 0.2],
[4.7, 3.2, 1.3, 0.2],
[4.6, 3.1, 1.5, 0.2],
[5.0, 3.6, 1.4, 0.2],
[5.4, 3.9, 1.7, 0.4],
[4.6, 3.4, 1.4, 0.3],
[5.0, 3.4, 1.5, 0.2]])
epsilon = 1.0 # 加密参数,可根据需求进行调整
sensitivity = 1.0 # 敏感度,对于每一列数据,这里假设为1
# 数据加密
encrypted_data = laplace_mechanism(data, sensitivity, epsilon)
print("加密数据:")
print(encrypted_data)
# 数据解密还原
decrypted_data = laplace_mechanism_inverse(encrypted_data, sensitivity, epsilon)
print("解密还原后的数据:")
print(decrypted_data)
要想满足解误差足够小,需要复杂算法和调参,暂时没有思路,四舍五入精度不够。
运行结果如下: