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
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
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 ]
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 ]