算法:

代码:
vector<double>  Duchi_mech(double eps, map<int, pair<double, double>>& Numeric, fmat& NX, vector<double>& truenumeric, double B) {
	int d = NX.n_rows;
	vector<double> noisynumeric_Duchi;
	noisynumeric_Duchi.resize(d, 0);
	for (int i_1 = 0; i_1 < NX.n_cols; i_1++) {
		fvec tuple = NX.unsafe_col(i_1);
		vec v = randu<vec>(Numeric.size());
		int j = 0;
		for (map<int, pair<double, double>>::iterator itr = Numeric.begin(); itr != Numeric.end(); itr++, j++) {
			int i = itr->first;
			int bit = 0;
			if (v[j] <= 0.5 + tuple[i] / 2.0) bit = 1;
			v[j] = 2.0*bit - 1.0;
		}
		int T = 0;
		double pia_double = exp(eps) / (exp(eps) + 1);
		if (randu() <= pia_double) T = 1;
		vec z;
		while (1) {
			z = (randi<vec>(Numeric.size(), distr_param(0, 1))) * 2 - 1;
			double vl = dot(z, v);
			if (T == 1 && vl >= 0) {
				break;
			}
			if (T == 0 && vl <= 0) {
				break;
			}
		}
		int k = 0;
		for (map<int, pair<double, double>>::iterator itr = Numeric.begin(); itr != Numeric.end(); itr++, k++) {
			noisynumeric_Duchi[itr->first] += z(k)*B;
		}
	}
	double error_Duchi = 0;
	for (map<int, pair<double, double>>::iterator itr = Numeric.begin(); itr != Numeric.end(); itr++) {
		double t = fabs(noisynumeric_Duchi[itr->first] / NX.n_cols - truenumeric[itr->first] / NX.n_cols);
		error_Duchi += t * t;
	}
	error_Duchi /= Numeric.size();
	vector<double> rv;
	rv.push_back(error_Duchi);
	return rv;
}