算法:
代码:
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;
}