| 2561 | } |
| 2562 | |
| 2563 | double svm_predict_probability( |
| 2564 | const svm_model *model, const svm_node *x, double *prob_estimates) |
| 2565 | { |
| 2566 | if ((model->param.svm_type == C_SVC || model->param.svm_type == NU_SVC) && |
| 2567 | model->probA!=NULL && model->probB!=NULL) |
| 2568 | { |
| 2569 | int i; |
| 2570 | int nr_class = model->nr_class; |
| 2571 | double *dec_values = Malloc(double, nr_class*(nr_class-1)/2); |
| 2572 | svm_predict_values(model, x, dec_values); |
| 2573 | |
| 2574 | double min_prob=1e-7; |
| 2575 | double **pairwise_prob=Malloc(double *,nr_class); |
| 2576 | for(i=0;i<nr_class;i++) |
| 2577 | pairwise_prob[i]=Malloc(double,nr_class); |
| 2578 | int k=0; |
| 2579 | for(i=0;i<nr_class;i++) |
| 2580 | for(int j=i+1;j<nr_class;j++) |
| 2581 | { |
| 2582 | pairwise_prob[i][j]=min(max(sigmoid_predict(dec_values[k],model->probA[k],model->probB[k]),min_prob),1-min_prob); |
| 2583 | pairwise_prob[j][i]=1-pairwise_prob[i][j]; |
| 2584 | k++; |
| 2585 | } |
| 2586 | multiclass_probability(nr_class,pairwise_prob,prob_estimates); |
| 2587 | |
| 2588 | int prob_max_idx = 0; |
| 2589 | for(i=1;i<nr_class;i++) |
| 2590 | if(prob_estimates[i] > prob_estimates[prob_max_idx]) |
| 2591 | prob_max_idx = i; |
| 2592 | for(i=0;i<nr_class;i++) |
| 2593 | free(pairwise_prob[i]); |
| 2594 | free(dec_values); |
| 2595 | free(pairwise_prob); |
| 2596 | return model->label[prob_max_idx]; |
| 2597 | } |
| 2598 | else |
| 2599 | return svm_predict(model, x); |
| 2600 | } |
| 2601 | |
| 2602 | const char *svm_type_table[] = |
| 2603 | { |
no test coverage detected