2017-10-05 3 views
0

J'ai été chargé de mettre en œuvre un mécanisme de confidentialité différentiel local (non interactif). Je travaille avec une grande base de données de recensement. Le seul attribut sensible est "Nombre d'enfants" qui est une valeur numérique allant de 0 à 13.Réponse aléatoire généralisée pour la mise en œuvre de la confidentialité différentielle locale

J'ai décidé d'utiliser le mécanisme de réponse aléatoire généralisée car il semble être la méthode la plus intuitive. Ce mécanisme est décrit here et présenté here. Après avoir chargé chaque valeur dans un tableau (en ignorant les autres attributs pour l'instant), j'effectue la perturbation comme suit.

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)) 

À moins que j'ai mal interprété la définition, je crois que cela garantira la confidentialité différentielle epsilon sur p_dataset.

Cependant, j'ai de la difficulté à comprendre comment l'agrégateur doit interpréter cet ensemble de données. Après le presentation ci-dessus, j'ai essayé de mettre en œuvre une méthode pour estimer le nombre d'individus qui ont répondu à une valeur particulière.

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) 

Je ne sais pas si je l'ai correctement mis en œuvre la méthode décrite comme je ne comprends pas tout à fait ce qu'il fait, et ne peut pas trouver une définition claire. Quoiqu'il en soit, j'ai utilisé cette méthode pour estimer le nombre total d'individus ayant répondu à chaque valeur de l'ensemble de données avec une valeur pour epsilon comprise entre 1 et 14, puis l'ai comparée aux valeurs réelles. Les résultats sont ci-dessous (veuillez excuser le formatage).

Results of estimation

Comme vous pouvez le voir, l'utilité de l'ensemble de données souffre beaucoup pour de faibles valeurs de epsilon. De plus, lorsqu'il était exécuté plusieurs fois, il y avait relativement peu d'écart dans les estimations, même pour de petites valeurs d'epsilon. Par exemple, lors de l'estimation du nombre de participants ayant répondu 0 et utilisant un epsilon de 1, toutes les estimations semblaient être centrées autour de 1600, la plus grande distance entre les estimations étant 100. Considérant que la valeur réelle de cette requête est 5969 , Je suis amené à croire que j'ai peut-être mal implémenté quelque chose.

Est-ce le comportement attendu du mécanisme de réponse aléatoire généralisée, ou ai-je fait une erreur dans ma mise en œuvre?

Répondre

-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)) # 这其实有一点问题 应该是真实值以外的其他值 这样写还包括真实值 
+4

Bien que cela puisse être une réponse à la question, il est invité à ajouter une explication au code. – MrT

0

Je pense que lors de l'obtention d'une réponse fausse, nous ne pouvons pas utiliser directement p_dataset.append(random.randint(0,13)), car il contient vraie réponse