code: Added functions for HUE
This commit is contained in:
parent
dd3cff7b30
commit
2aeb1149e5
@ -398,6 +398,61 @@ def adaptive_cont(seq, lmdks, epsilon, inc_rt, dec_rt):
|
|||||||
return rls_data, bgts, skipped
|
return rls_data, bgts, skipped
|
||||||
|
|
||||||
|
|
||||||
|
def adaptive_cons(seq, lmdks, epsilon, inc_rt, dec_rt):
|
||||||
|
'''
|
||||||
|
Adaptive budget allocation.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
seq - The point sequence.
|
||||||
|
lmdks - The landmarks.
|
||||||
|
epsilon - The available privacy budget.
|
||||||
|
inc_rt - Sampling rate increase rate.
|
||||||
|
dec_rt - Sampling rate decrease rate.
|
||||||
|
Returns:
|
||||||
|
rls_data - The perturbed data.
|
||||||
|
bgts - The privacy budget allocation.
|
||||||
|
skipped - The number of skipped releases.
|
||||||
|
'''
|
||||||
|
# Uniform budget allocation
|
||||||
|
bgts = uniform(seq, lmdks, epsilon)
|
||||||
|
# Released
|
||||||
|
rls_data = [None]*len(seq)
|
||||||
|
# The sampling rate
|
||||||
|
samp_rt = 1
|
||||||
|
# Track landmarks
|
||||||
|
lmdk_cur = 0
|
||||||
|
# Track skipped releases
|
||||||
|
skipped = 0
|
||||||
|
for i, p in enumerate(seq):
|
||||||
|
# Check if current point is a landmark
|
||||||
|
is_landmark = any((lmdks[:]==p).all(1))
|
||||||
|
if is_landmark:
|
||||||
|
lmdk_cur += 1
|
||||||
|
if lmdk_lib.should_sample(samp_rt) or i == 0:
|
||||||
|
# Add noise to original data
|
||||||
|
o = lmdk_lib.add_laplace_noise(p[1], 1, bgts[i])
|
||||||
|
rls_data[i] = [p[0], o]
|
||||||
|
# Adjust sampling rate
|
||||||
|
if i > 0:
|
||||||
|
if abs(rls_data[i - 1][1] - o) < 1/bgts[i]:
|
||||||
|
# Decrease
|
||||||
|
samp_rt -= samp_rt*dec_rt
|
||||||
|
else:
|
||||||
|
# Increase
|
||||||
|
samp_rt += (1 - samp_rt)*inc_rt
|
||||||
|
else:
|
||||||
|
skipped += 1
|
||||||
|
# Skip current release and approximate with previous
|
||||||
|
rls_data[i] = rls_data[i - 1]
|
||||||
|
if is_landmark:
|
||||||
|
# Allocate the current budget to the following releases uniformly
|
||||||
|
for j in range(i + 1, len(seq)):
|
||||||
|
bgts[j] += bgts[i]/(len(lmdks) - lmdk_cur + 1)
|
||||||
|
# No budget was spent
|
||||||
|
bgts[i] = 0
|
||||||
|
return rls_data, bgts, skipped
|
||||||
|
|
||||||
|
|
||||||
def skip(seq, lmdks, epsilon):
|
def skip(seq, lmdks, epsilon):
|
||||||
'''
|
'''
|
||||||
Skip landmarks.
|
Skip landmarks.
|
||||||
@ -459,6 +514,36 @@ def skip_cont(seq, lmdks, epsilon):
|
|||||||
return rls_data, bgts
|
return rls_data, bgts
|
||||||
|
|
||||||
|
|
||||||
|
def skip_cons(seq, lmdks, epsilon):
|
||||||
|
'''
|
||||||
|
Skip landmarks.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
seq - The point sequence.
|
||||||
|
lmdks - The landmarks.
|
||||||
|
epsilon - The available privacy budget.
|
||||||
|
Returns:
|
||||||
|
rls_data - The perturbed data.
|
||||||
|
bgts - The privacy budget allocation.
|
||||||
|
'''
|
||||||
|
# Event-level budget allocation
|
||||||
|
bgts = np.array(len(seq)*[epsilon])
|
||||||
|
# Released
|
||||||
|
rls_data = [None]*len(seq)
|
||||||
|
for i, p in enumerate(seq):
|
||||||
|
# Check if current point is a landmark
|
||||||
|
is_landmark = any((lmdks[:]==p).all(1))
|
||||||
|
# Add noise
|
||||||
|
o = [p[0], lmdk_lib.add_laplace_noise(p[1], 1, bgts[i])]
|
||||||
|
if is_landmark:
|
||||||
|
if i > 0:
|
||||||
|
# Approximate with previous
|
||||||
|
o = rls_data[i - 1]
|
||||||
|
bgts[i] = 0
|
||||||
|
rls_data[i] = o
|
||||||
|
return rls_data, bgts
|
||||||
|
|
||||||
|
|
||||||
def sample(seq, lmdks, epsilon):
|
def sample(seq, lmdks, epsilon):
|
||||||
'''
|
'''
|
||||||
Publish randomly.
|
Publish randomly.
|
||||||
@ -642,6 +727,18 @@ def uniform_cont(seq, lmdks, epsilon):
|
|||||||
return rls_data, bgts
|
return rls_data, bgts
|
||||||
|
|
||||||
|
|
||||||
|
def uniform_cons(seq, lmdks, epsilon):
|
||||||
|
# Released
|
||||||
|
rls_data = [None]*len(seq)
|
||||||
|
# Budgets
|
||||||
|
bgts = uniform(seq, lmdks, epsilon)
|
||||||
|
for i, p in enumerate(seq):
|
||||||
|
is_landmark = any((lmdks[:]==p).all(1))
|
||||||
|
# [timestamp, perturbed consumption]
|
||||||
|
rls_data[i] = [p[0], lmdk_lib.add_laplace_noise(p[1], 1, bgts[i])]
|
||||||
|
return rls_data, bgts
|
||||||
|
|
||||||
|
|
||||||
def utility_analysis(seq, lmdks, o, epsilon):
|
def utility_analysis(seq, lmdks, o, epsilon):
|
||||||
'''
|
'''
|
||||||
Analyze the utility.
|
Analyze the utility.
|
||||||
@ -688,3 +785,10 @@ def mae_cont(o):
|
|||||||
if p[0] != p[1]:
|
if p[0] != p[1]:
|
||||||
mae += 1/len(o)
|
mae += 1/len(o)
|
||||||
return mae
|
return mae
|
||||||
|
|
||||||
|
|
||||||
|
def mae_cons(seq, o):
|
||||||
|
mae = 0
|
||||||
|
for i, p in enumerate(seq):
|
||||||
|
mae += abs(p[1] - o[i][1])/len(seq)
|
||||||
|
return mae
|
||||||
|
Loading…
Reference in New Issue
Block a user