MCPcopy Create free account
hub / github.com/Xtra-Computing/thundersvm / multiclass_probability

Method multiclass_probability

src/thundersvm/model/svc.cpp:194–250  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

192}
193
194void 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

Callers

nothing calls this directly

Calls 1

maxFunction · 0.85

Tested by

no test coverage detected