我的任务是实施本地(非交互式)差异隐私机制。我正在使用一个庞大的人口普查数据数据库。唯一敏感的属性是“孩子的数量”,它是一个介于 0 到 13 之间的数值。
我决定使用广义随机响应机制,因为它似乎是最直观的方法。此机制在此处进行了描述和介绍。
将每个值加载到数组中(暂时忽略其他属性)后,我执行如下扰动。
d = 14 # values may range from 0 to 13
eps = 1 # epsilon level of privacy
p = (math.exp(eps)/(math.exp(eps)+d-1))
q = 1/(math.exp(eps)+d-1)
p_dataset = []
for row in dataset:
coin = random.random()
if coin <= p:
p_dataset.append(row)
else:
p_dataset.append(random.randint(0,13))
除非我误解了定义,否则我相信这将保证 p_dataset 上的 epsilon 差分隐私。
但是,我很难理解聚合器必须如何解释这个数据集。根据上面的介绍,我尝试实现一种方法来估计回答特定值的个人数量。
v = 0 # we are estimating the number of individuals in the dataset who answered 0
nv = 0 # number of users in the perturbed dataset who answered the value
for row in p_dataset:
if row == v:
nv += 1
Iv = nv * p + (n - nv) * q
estimation = (Iv - (n*q)) / (p-q)
我不知道我是否正确实现了所描述的方法,因为我不完全理解它在做什么,也找不到明确的定义。
无论如何,我使用这种方法来估计回答数据集中每个值的人的总数,其 epsilon 值从 1 到 14 不等,然后将其与实际值进行比较。结果如下(请原谅格式)。
如您所见,数据集的实用性因 epsilon 值较低而受到很大影响。此外,当多次执行时,估计的偏差相对较小,即使对于小的 epsilon 值也是如此。
例如,在估计回答为 0 的参与者数量并使用 1 的 epsilon 时,所有估计似乎都以 1600 为中心,估计之间的最大距离为 100。考虑到这个查询的实际值为 5969,我被引导相信我可能错误地实施了某些事情。
这是广义随机响应机制的预期行为,还是我在实现中犯了错误?