def kv_en_privkv(kv, epsilon1, epsilon2, set_value=None): k, v = int(kv[0]), kv[1] if k == 1: k = ldplib.perturbation(value=k, perturbed_value=1 - k, epsilon=epsilon1) if k == 1: discretize_v = ldplib.discretization(v, -1, 1) p_k, p_v = 1, ldplib.perturbation(value=discretize_v, perturbed_value=-discretize_v, epsilon=epsilon2) else: p_k, p_v = 0, 0 else: k = ldplib.perturbation(value=k, perturbed_value=1 - k, epsilon=epsilon1) if k == 1: v = np.random.uniform(low=-1, high=1) if set_value is None else set_value discretize_v = ldplib.discretization(v, -1, 1) p_k, p_v = 1, ldplib.perturbation(value=discretize_v, perturbed_value=-discretize_v, epsilon=epsilon2) else: p_k, p_v = 0, 0 return [p_k, p_v]
def mean_estimation_experiment(): # generated data data = np.clip(np.random.normal(loc=0.5, scale=0.2, size=[100000]), 0, 1) print("this is generated data\n", data) discretized_data = [ dp.discretization(value=value, lower=0, upper=1) for value in data ] print("this is discretized data\n", discretized_data) mean = np.average(data) print("the mean_solutions of original data is: ", mean) mean_d = np.average(discretized_data) print("the mean_solutions of discretized data is: ", mean_d) epsilon = 1 # dp_data = [dp.random_response_old(B=value, p=dp.eps2p(epsilon)) for value in discretized_data] dp_data = [ dp.random_response(bits=value, p=dp.eps2p(epsilon)) for value in discretized_data ] est_one = dp.random_response_reverse(data_list=np.asarray(dp_data), p=dp.eps2p(epsilon)) est_mean = est_one / len(dp_data) print("the estimated mean_solutions is: ", est_mean)
def encode_duchi(value, epsilon): value = dp.discretization(value=value, lower=-1, upper=1) value = dp.perturbation(value=value, perturbed_value=-value, epsilon=epsilon) value = (np.e**epsilon + 1) / (np.e**epsilon - 1) * value return value
def encode(self, v): if not -1 <= v <= 1: raise Exception( "Error, The input domain is [-1, 1], while the input is ", v) value = ldplib.discretization(value=v, lower=-1, upper=1) value = ldplib.perturbation(value=value, perturbed_value=-value, epsilon=self.epsilon) return self.C * value
def kv_en_state_encoding(kv, epsilon): """ The unary encoding, also known as k-random response, is used in user side. It works as follows First, key value data is mapped into {0, 1, 2}. Basically, [0,0]->1; [1,-1]->0; [1,1]->2; Then the k-rr is used to report. :param kv: key value data, in which k in {0,1} and value in [-1,1] :param epsilon: privacy budget :return: the encoded key value data, the res is in {0,1,2} """ k, v = kv[0], ldplib.discretization(value=kv[1], lower=-1, upper=1) unary = k * v + 1 return ldplib.k_random_response(unary, values=[0, 1, 2], epsilon=epsilon)
def kvlist_get_baseline(kv_list: np.ndarray, discretization=False): if not isinstance(discretization, bool): raise Exception("Input type error: ", type(discretization)) f = np.average(kv_list[:, 0]) value_list = [] for kv in kv_list: if int(kv[0]) == 1 and discretization is True: value_list.append(ldplib.discretization(kv[1], lower=-1, upper=1)) elif int(kv[0]) == 1 and discretization is False: value_list.append(kv[1]) else: pass m = np.average(np.asarray(value_list)) return f, m
def kv_en_onehot(kv, epsilon): """ encode a kv into [a,b,c], where: a=1 represents if the k == 0 b represents if v == -1 c represents if v == 1 """ k, v = int(kv[0]), kv[1] onehot = np.zeros([3]) if k == 0: onehot[0] = 1 else: d_v = ldplib.discretization(v, -1, 1) if d_v == -1: onehot[1] = 1 else: onehot[2] = 1 return ldplib.random_response(bit_array=onehot, p=ldplib.eps2p(epsilon / 2))
def kvlist_get_baseline(kv_list: np.ndarray, discretization=False): """ Noted by Leilei Du This function return the average of the first column and the average of discretization(if False, equal to the former) of the first column """ if not isinstance(discretization, bool): raise Exception("Input type error: ", type(discretization)) f = np.average(kv_list[:, 0]) value_list = [] for kv in kv_list: if int(kv[0]) == 1 and discretization is True: value_list.append(ldplib.discretization(kv[1], lower=-1, upper=1)) elif int(kv[0]) == 1 and discretization is False: value_list.append(kv[1]) else: pass m = np.average(np.asarray(value_list)) return f, m