-
Notifications
You must be signed in to change notification settings - Fork 0
/
Main_KL-Divergence.py
115 lines (103 loc) · 4.12 KB
/
Main_KL-Divergence.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import getopt
import sys
import BandMatrix
import CAHDalgorithm
import time
import numpy as np
import KLDivergence
import random
"""
Main per l'esecuzione di
MatriceBanda e CAHDalgorithm
con calcolo KL_Divergence
"""
if __name__ == "__main__":
dim_finale = 2000 # dimensione massima matrice
num_sensibile = 10 # n° dati sensibili
grado_privacy = 10 # grado privacy richiesto
alpha = 3
# lettura da file del dataset
nameFile = "Dataset/BMS1.csv"
listaItem = "Dataset/Items_BMS1.txt"
# controllo gli eventuali argomenti di command line
try:
opts, args = getopt.getopt(sys.argv[1:], "hd:i:n:m:p:",
["dataset=", "items=", "n=", "m=", "p="])
except getopt.GetoptError:
print(
'Main_KL-Divergence.py\n' +
' -d <path del dataset>\n' +
' -i <path del file con i codici prodotti>\n' +
' -n <dimensione matrice quadrata>\n' +
' -m <numero attributi sensibili>\n' +
' -p <grado di privacy>\n')
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print(
'Main_KL-Divergence.py\n' +
' -d <path del dataset>\n' +
' -i <path del file con i codici prodotti>\n' +
' -n <dimensione matrice quadrata>\n' +
' -m <numero attributi sensibili>\n' +
' -p <grado di privacy>\n')
sys.exit()
elif opt in ("-d", "--dataset"):
nameFile = arg
elif opt in ("-i", "--items"):
listaItem = arg
elif opt in ("-n", "--n"):
dim_finale = int(arg)
elif opt in ("-m", "--m"):
num_sensibile = int(arg)
elif opt in ("-p", "--p"):
grado_privacy = int(arg)
print("Read Dataset")
df = BandMatrix.BandMatrix(nameFile)
# partenza cronometro per registrazione prestazioni
start_time = time.time()
print("Calcolo la band matrix")
# calcolo matrice banda
df.compute_band_matrix(
dim_finale=dim_finale,
nome_file_item=listaItem,
num_sensibile=num_sensibile)
# applicazione algoritmo CAHD
cahd = CAHDalgorithm.CAHDalgorithm(
df,
grado_privacy=grado_privacy,
alfa=alpha)
cahd.compute_hist()
hist_item = cahd.hist
print("Eseguo Anonimizzazione")
if cahd.CAHD_algorithm():
end_time = time.time() - start_time
print("Il tempo di esecuzione per il grado di privacy %s è %s" % (cahd.grado_privacy, end_time) + "\n")
# selezione n° QID nella query per KL_Divergence
r = 4
all_item = list(df.items_final.keys())
columns_item_sensibili = df.lista_sensibili
dataframe_bandizzato = df.dataframe_bandizzato
QID = cahd.lista_gruppi[0].columns.tolist()
QID_select = list()
while len(QID_select) < r:
temp = random.choice(QID)
if temp not in QID_select:
QID_select.append(temp)
# calcolo di tutte le combinazioni per la cella C
all_value = KLDivergence.get_all_combination_of_n(r)
# calcolo il valore massimo nei sensitive items
item_sensibile = int(max(hist_item.keys(), key=(lambda k: hist_item[k])))
KL_Divergence = 0
# calcolo actsc e estsc richieste per KL_Divergence
for valori in all_value:
actsc = KLDivergence.compute_act_s_in_c(dataframe_bandizzato, QID_select, valori, item_sensibile)
estsc = KLDivergence.compute_est_s_in_c(dataframe_bandizzato, cahd.sd_gruppi,
cahd.lista_gruppi, QID_select, valori, item_sensibile)
if actsc > 0 and estsc > 0:
temp = actsc * np.log(actsc / estsc)
else:
temp = 0
KL_Divergence = KL_Divergence + temp
print("Grado di privacy: " + str(cahd.grado_privacy) + ", Numero items sensibili: " + str(num_sensibile)
+ ", KL_Divergence: " + str(KL_Divergence))