Exemplo n.º 1
0
    def _windsorized(self, epsilon, lower_bounds, higher_bounds, output):
        """
        Privatize each dimension of the output in a winsorized manner
        """
        if isiterable(output[0]):
            noise = []
            estimate = []
            for index in range(len(output)):
                e, n = self._windsorized(epsilon / len(output), lower_bounds[index], higher_bounds[index], output[index])
                estimate.append(e)
                noise.append(n)
            return estimate, noise

        dimension = list(output)
        rad = len(output) ** (1.0 / 3 + 0.1)
        
        lps = dpalgos.estimate_percentile(0.25, dimension,
                                          epsilon / 4,
                                          lower_bounds,
                                          higher_bounds)
        hps = dpalgos.estimate_percentile(0.75, dimension,
                                          epsilon / 4,
                                          lower_bounds,
                                          higher_bounds)
        crude_mu = float(lps + hps) / 2
        crude_iqr = abs(hps - lps)
        u = crude_mu + 4 * rad * crude_iqr
        l = crude_mu - 4 * rad * crude_iqr
        # Compute windsorized mean for range
        self._sanitize_multidim(dimension, [l] * len(dimension), [u] * len(dimension))
                
        mean_estimate = float(sum(dimension)) / len(dimension)
        noise = dpalgos.gen_noise(self.sensitivity_factor * float(abs(u - l)) / (2 * epsilon * len(dimension)))
        return mean_estimate, noise
Exemplo n.º 2
0
    def _windsorized(self, epsilon, lower_bounds, higher_bounds, output):
        """
        Privatize each dimension of the output in a winsorized manner
        """
        if isiterable(output[0]):
            noise = []
            estimate = []
            for index in range(len(output)):
                e, n = self._windsorized(epsilon / len(output),
                                         lower_bounds[index],
                                         higher_bounds[index], output[index])
                estimate.append(e)
                noise.append(n)
            return estimate, noise

        dimension = list(output)
        rad = len(output)**(1.0 / 3 + 0.1)

        lps = dpalgos.estimate_percentile(0.25, dimension, epsilon / 4,
                                          lower_bounds, higher_bounds)
        hps = dpalgos.estimate_percentile(0.75, dimension, epsilon / 4,
                                          lower_bounds, higher_bounds)
        crude_mu = float(lps + hps) / 2
        crude_iqr = abs(hps - lps)
        u = crude_mu + 4 * rad * crude_iqr
        l = crude_mu - 4 * rad * crude_iqr
        # Compute windsorized mean for range
        self._sanitize_multidim(dimension, [l] * len(dimension),
                                [u] * len(dimension))

        mean_estimate = float(sum(dimension)) / len(dimension)
        noise = dpalgos.gen_noise(self.sensitivity_factor * float(abs(u - l)) /
                                  (2 * epsilon * len(dimension)))
        return mean_estimate, noise
Exemplo n.º 3
0
    def _perturb(self, bound_ranges, epsilon):
        if not isiterable(bound_ranges):
            return dpalgos.gen_noise(self.sensitivity_factor *
                                     float(bound_ranges) / epsilon)

        return [
            self._perturb(br, epsilon / len(bound_ranges))
            for br in bound_ranges
        ]
Exemplo n.º 4
0
Arquivo: gupt.py Projeto: yw3xs/GUPT
    def _perturb(self, bound_ranges, epsilon):
        if not isiterable(bound_ranges):
            return dpalgos.gen_noise(
                self.sensitivity_factor * float(bound_ranges) / epsilon)

        return [
            self._perturb(br, epsilon / len(bound_ranges))
            for br in bound_ranges
        ]