lmdk_bgt.discount: Initial commit
This commit is contained in:
parent
44b1ac7e9c
commit
5f7c9d0945
@ -1,5 +1,6 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from datetime import datetime
|
||||||
from geopy.distance import distance
|
from geopy.distance import distance
|
||||||
import math
|
import math
|
||||||
import numpy as np
|
import numpy as np
|
||||||
@ -420,6 +421,52 @@ def sample(seq, lmdks, epsilon):
|
|||||||
return rls_data, bgts, skipped
|
return rls_data, bgts, skipped
|
||||||
|
|
||||||
|
|
||||||
|
def discount(seq, lmdks, epsilon):
|
||||||
|
'''
|
||||||
|
Temporally discounted sampling.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
seq - The point sequence.
|
||||||
|
lmdks - The landmarks.
|
||||||
|
epsilon - The available privacy budget.
|
||||||
|
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)
|
||||||
|
# Track landmarks
|
||||||
|
lmdk_cur = 0
|
||||||
|
# Track skipped releases
|
||||||
|
skipped = 0
|
||||||
|
for i, p in enumerate(seq):
|
||||||
|
# The sampling rate
|
||||||
|
samp_rt = datetime.fromtimestamp(int(lmdks[lmdk_cur][3]))/datetime.fromtimestamp(int(lmdks[len(lmdks) - 1][3]))
|
||||||
|
# Check if current point is a landmark
|
||||||
|
if lmdk_lib.is_landmark(p, lmdks):
|
||||||
|
lmdk_cur += 1
|
||||||
|
# Get coordinates
|
||||||
|
loc = (p[1], p[2])
|
||||||
|
if i == 0 or lmdk_lib.should_sample(samp_rt):
|
||||||
|
# Add noise to original data
|
||||||
|
new_loc = lmdk_lib.add_polar_noise(loc, bgts[i])
|
||||||
|
rls_data[i] = [p[0], new_loc[0], new_loc[1], p[3]]
|
||||||
|
else:
|
||||||
|
skipped += 1
|
||||||
|
# Skip current release and approximate with previous
|
||||||
|
rls_data[i] = rls_data[i - 1]
|
||||||
|
if lmdk_lib.is_landmark(p, lmdks):
|
||||||
|
# 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 uniform_r(seq, lmdks, epsilon):
|
def uniform_r(seq, lmdks, epsilon):
|
||||||
# Released
|
# Released
|
||||||
rls_data = [None]*len(seq)
|
rls_data = [None]*len(seq)
|
||||||
|
Loading…
Reference in New Issue
Block a user