0

我的任务是实施本地(非交互式)差异隐私机制。我正在使用一个庞大的人口普查数据数据库。唯一敏感的属性是“孩子的数量”,它是一个介于 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,我被引导相信我可能错误地实施了某些事情。

这是广义随机响应机制的预期行为,还是我在实现中犯了错误?

4

2 回答 2

1

我认为当得到错误答案时,我们不能直接使用p_dataset.append(random.randint(0,13)),因为它包含真实答案

于 2018-03-09T12:30:27.303 回答
-1
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))  # 这其实有一点问题  应该是真实值以外的其他值 这样写还包括真实值
于 2018-03-09T12:06:46.470 回答