| 192 | } |
| 193 | |
| 194 | void SVC::multiclass_probability(const vector<vector<float_type> > &r, vector<float_type> &p) const { |
| 195 | int nrClass = n_classes; |
| 196 | int t, j; |
| 197 | int iter = 0, max_iter = max(100, nrClass); |
| 198 | double **Q = (double **) malloc(sizeof(double *) * nrClass); |
| 199 | double *Qp = (double *) malloc(sizeof(double) * nrClass); |
| 200 | double pQp, eps = 0.005 / nrClass; |
| 201 | |
| 202 | for (t = 0; t < nrClass; t++) { |
| 203 | p[t] = 1.0 / nrClass; // Valid if k = 1 |
| 204 | Q[t] = (double *) malloc(sizeof(double) * nrClass); |
| 205 | Q[t][t] = 0; |
| 206 | for (j = 0; j < t; j++) { |
| 207 | Q[t][t] += r[j][t] * r[j][t]; |
| 208 | Q[t][j] = Q[j][t]; |
| 209 | } |
| 210 | for (j = t + 1; j < nrClass; j++) { |
| 211 | Q[t][t] += r[j][t] * r[j][t]; |
| 212 | Q[t][j] = -r[j][t] * r[t][j]; |
| 213 | } |
| 214 | } |
| 215 | for (iter = 0; iter < max_iter; iter++) { |
| 216 | // stopping condition, recalculate QP,pQP for numerical accuracy |
| 217 | pQp = 0; |
| 218 | for (t = 0; t < nrClass; t++) { |
| 219 | Qp[t] = 0; |
| 220 | for (j = 0; j < nrClass; j++) |
| 221 | Qp[t] += Q[t][j] * p[j]; |
| 222 | pQp += p[t] * Qp[t]; |
| 223 | } |
| 224 | double max_error = 0; |
| 225 | for (t = 0; t < nrClass; t++) { |
| 226 | double error = fabs(Qp[t] - pQp); |
| 227 | if (error > max_error) |
| 228 | max_error = error; |
| 229 | } |
| 230 | if (max_error < eps) |
| 231 | break; |
| 232 | |
| 233 | for (t = 0; t < nrClass; t++) { |
| 234 | double diff = (-Qp[t] + pQp) / Q[t][t]; |
| 235 | p[t] += diff; |
| 236 | pQp = (pQp + diff * (diff * Q[t][t] + 2 * Qp[t])) / (1 + diff) |
| 237 | / (1 + diff); |
| 238 | for (j = 0; j < nrClass; j++) { |
| 239 | Qp[j] = (Qp[j] + diff * Q[t][j]) / (1 + diff); |
| 240 | p[j] /= (1 + diff); |
| 241 | } |
| 242 | } |
| 243 | } |
| 244 | if (iter >= max_iter) |
| 245 | printf("Exceeds max_iter in multiclass_prob\n"); |
| 246 | for (t = 0; t < nrClass; t++) |
| 247 | free(Q[t]); |
| 248 | free(Q); |
| 249 | free(Qp); |
| 250 | } |
| 251 | |