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]
Beispiel #2
0
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)
Beispiel #3
0
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
Beispiel #4
0
 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))
Beispiel #8
0
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