局部差分隐私实现的广义随机响应
Generalized Random Response for local differential privacy implementation
我的任务是实施本地(非交互式)差分隐私机制。我正在处理一个大型人口普查数据数据库。唯一的敏感属性是 "Number of children",它是一个介于 0 到 13 之间的数值。
我决定采用广义随机响应机制,因为它看起来是最直观的方法。 here and presented here.
描述了这种机制
将每个值加载到数组后(暂时忽略其他属性),我按如下方式执行扰动。
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 差分隐私。
但是,我很难理解聚合器必须如何解释此数据集。按照上面的 presentation,我尝试实现一种方法来估计回答特定值的人数。
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,我被引导相信我可能实施了错误的东西。
这是广义随机响应机制的预期行为,还是我在实施过程中犯了错误?
max_v = 13
min_v = 0
for row in dataset: #row就是dataset里的真实值
coin = random.random()
if coin <= p:
p_dataset.append(row)
else:
ans = []
if row == min_v:
ans = np.arange(min_v + 1, max_v + 1).tolist()
elif row == max_v:
ans = np.arange(min_v, max_v).tolist()
else:
a = np.arange(min_v, row).tolist()
b = np.arange(row + 1, max_v + 1).tolist()
[ans.append(i) for i in a]
[ans.append(i) for i in b]
p_dataset.append(random.sample(ans, 1)) # 这其实有一点问题 应该是真实值以外的其他值 这样写还包括真实值
我觉得当得到假答案时,我们不能直接使用p_dataset.append(random.randint(0,13))
,因为它包含真答案
我的任务是实施本地(非交互式)差分隐私机制。我正在处理一个大型人口普查数据数据库。唯一的敏感属性是 "Number of children",它是一个介于 0 到 13 之间的数值。
我决定采用广义随机响应机制,因为它看起来是最直观的方法。 here and presented here.
描述了这种机制将每个值加载到数组后(暂时忽略其他属性),我按如下方式执行扰动。
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 差分隐私。
但是,我很难理解聚合器必须如何解释此数据集。按照上面的 presentation,我尝试实现一种方法来估计回答特定值的人数。
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,我被引导相信我可能实施了错误的东西。
这是广义随机响应机制的预期行为,还是我在实施过程中犯了错误?
max_v = 13
min_v = 0
for row in dataset: #row就是dataset里的真实值
coin = random.random()
if coin <= p:
p_dataset.append(row)
else:
ans = []
if row == min_v:
ans = np.arange(min_v + 1, max_v + 1).tolist()
elif row == max_v:
ans = np.arange(min_v, max_v).tolist()
else:
a = np.arange(min_v, row).tolist()
b = np.arange(row + 1, max_v + 1).tolist()
[ans.append(i) for i in a]
[ans.append(i) for i in b]
p_dataset.append(random.sample(ans, 1)) # 这其实有一点问题 应该是真实值以外的其他值 这样写还包括真实值
我觉得当得到假答案时,我们不能直接使用p_dataset.append(random.randint(0,13))
,因为它包含真答案