def calc_covariance(s, decisions, ips_weights): new_s = (2 * s) - 1 if ips_weights is not None: mu_s = mean(new_s * ips_weights, axis=0) d = decisions * ips_weights else: mu_s = mean(new_s, axis=0) d = decisions covariance = (new_s - mu_s) * d return covariance
def fairness_function(type=None, **fairness_kwargs): s = fairness_kwargs["s"] ips_weights = fairness_kwargs[ "ips_weights"] if "ips_weights" in fairness_kwargs else None decisions = "decision_probabilities" not in fairness_kwargs or not args.policy_type == "NN" decisions = fairness_kwargs["decisions"] if decisions else fairness_kwargs[ "decision_probabilities"] y = fairness_kwargs["y"] type = args.fairness_type if type is None else type if type == "BD_DP": benefit = calc_benefit(decisions, ips_weights) return mean_difference(benefit, s) elif type == "COV_DP": covariance = calc_covariance(s, decisions, ips_weights) return mean(covariance, axis=0) elif type == "BD_EOP": benefit = calc_benefit(decisions, ips_weights) y1_indices = np.where(y.squeeze() == 1) return mean_difference(benefit[y1_indices], s[y1_indices])
def fairness_function_gradient(**fairness_kwargs): policy = fairness_kwargs["policy"] x = fairness_kwargs["x"] s = fairness_kwargs["s"] y = fairness_kwargs["y"] decisions = fairness_kwargs["decisions"] ips_weights = fairness_kwargs["ips_weights"] if args.fairness_type == "BD_DP" or args.fairness_type == "BD_EOP": result = calc_benefit(decisions, ips_weights) elif args.fairness_type == "COV_DP": result = calc_covariance(s, decisions, ips_weights) log_gradient = policy.log_policy_gradient(x, s) grad = log_gradient * result if args.fairness_type == "BD_DP": return mean_difference(grad, s) elif args.fairness_type == "COV_DP": return mean(grad, axis=0) elif args.fairness_type == "BD_EOP": y1_indices = np.where(y == 1) return mean_difference(grad[y1_indices], s[y1_indices])
def mean(self): return mean(self._measure, axis=1)
def cost_utility_probability(cost_factor=0.5, **utility_parameters): utility = _utility_core(cost_factor, True, **utility_parameters) return mean(utility, axis=0)
def cost_utility_gradient(cost_factor=0.5, **utility_parameters): utility = _utility_core(cost_factor, False, **utility_parameters) log_policy_gradient = utility_parameters["policy"].log_policy_gradient( utility_parameters["x"], utility_parameters["s"]) utility_grad = log_policy_gradient * utility return mean(utility_grad, axis=0)