Classificazione e machine learning

In questo ultimo esercizio bisogna generare due classi di eventi ed utilizzare un metodo di Machine Learning a scelta dello studente per separare le classi di dato. Abbiamo deciso di utilizzare libsvm, un'implementazione molto utilizzata in letteratura che implementa l'algoritmo di Support Vector Machines.

Il codice utilizzato è abbastanza semplice, in quanto serve unicamente a generare i nostri dati. Li generiamo con il solito generatore personalizzato descritto in precedenza e salviamo i dati in un formato (simil-csv) utilizzabile da libsvm.

Analisi con libsvm[modifica | modifica wikitesto]

Una volta salvati i dati da utilizzare per creare il nostro modello, riscaliamo tutte le quantità tra -1 e 1, in modo da ottenere un range uniforme. Scegliamo inoltre un tipo di kernel di tipo esponenziale, che ci consente di ottenere la superficie di separazione operando una trasformazione di coordinate in uno spazio infinito-dimensionale. A questo punto, attraverso una cross-validazione 10-fold (per evitare overfitting), andiamo a ottimizzare i parametri per il nostro particolare problema di ottimizzazione.

Il risultato dell'ottimizzazione 10-fold del nostro modello a support vector machines - viene valutata l'accuratezza di predizione per le differenti scelte di gamma e di C (rho).

Ciò che otteniamo è la seguente scelta di parametri.

Parametro Valore
Tipo di kernel Radial Basis Function (RBF)
8
-0.31926

Questo modello separa correttamente le due classi di eventi con un'efficienza del 99.2%.

Di seguito il modello completo trovato con la cross-validazione 10-fold.

Il nostro dataset separato da libsvm, con evidenziato il piano di separazione e i vettori di supporto.

La curva ROC[modifica | modifica wikitesto]

Per caratterizzare il nostro classificatore in termini di purezza del segnale e rigezione del fondo, riportiamo la "receiver operating characteristic", anche detta curva ROC.

Ruphy-SVM-ROC Curve-Data.scale-roc.png
svm_type c_svc
kernel_type rbf
gamma 8
nr_class 2
total_sv 175
rho -0.31926
label 0 1
nr_sv 93 82
SV
0.125 1:-0.255224 2:0.0564037 
0.06876683095333982 1:0.54466 2:0.0549351 
0.001295204469425319 1:0.523926 2:0.135951 
0.125 1:-0.212067 2:-0.0552857 
0.125 1:-0.0227556 2:0.95062 
0.06982585404507882 1:0.636108 2:-0.466343 
0.125 1:-0.106014 2:-0.178156 
0.125 1:-0.199845 2:-0.144461 
0.03189766661066989 1:0.413364 2:0.318642 
0.125 1:0.873778 2:-0.449126 
0.125 1:-0.10535 2:-0.105934 
0.125 1:-0.42529 2:0.202875 
0.125 1:-0.0703571 2:-0.125611 
0.125 1:-0.310267 2:-0.0555996 
0.125 1:0.197849 2:-0.321088 
0.125 1:0.93008 2:0.00884425 
0.125 1:-0.140984 2:-0.100142 
0.125 1:-0.147024 2:-0.197585 
0.008874136405506487 1:-0.0366826 2:-0.126863 
0.125 1:0.688245 2:0.723866 
0.125 1:-0.545274 2:0.456667 
0.1148729812214391 1:0.02106 2:0.882379 
0.125 1:0.0204177 2:-0.226427 
0.125 1:0.0688194 2:-0.293641 
0.01227384345901066 1:0.460372 2:0.291867 
0.06729520804592784 1:0.491362 2:0.211329 
0.125 1:0.0787614 2:-0.389978 
0.125 1:0.891435 2:0.64195 
0.125 1:0.106246 2:-0.307287 
0.125 1:0.907767 2:0.471987 
0.125 1:-0.441166 2:0.392 
0.001207907209948768 1:0.198526 2:0.463441 
0.125 1:-0.334303 2:0.149812 
0.125 1:-0.343341 2:0.691268 
0.125 1:-0.151755 2:-0.355534 
0.125 1:0.366299 2:-0.818739 
0.125 1:-0.208358 2:-0.0567019 
0.125 1:0.656842 2:0.796122 
0.125 1:-0.171146 2:-0.0603749 
0.06311694848994219 1:-0.332641 2:0.153436 
0.125 1:-0.0360295 2:-0.457144 
0.02263557893516084 1:0.778979 2:0.631691 
0.125 1:-0.00513784 2:-0.271032 
0.125 1:0.849172 2:-0.237665 
0.125 1:0.642727 2:-0.512094 
0.125 1:-0.59217 2:-0.0536288 
0.125 1:0.517285 2:0.795042 
0.1076046306116459 1:0.911685 2:0.0393919 
0.125 1:0.1048 2:-0.275588 
0.125 1:-0.288132 2:-0.221197 
0.125 1:-0.270997 2:-0.093298 
0.125 1:-0.254754 2:-0.0920458 
0.125 1:-0.273102 2:0.00439683 
0.0931156989861783 1:-0.237097 2:0.608793 
0.125 1:0.94586 2:0.370672 
0.125 1:0.408489 2:1 
0.000406487447447212 1:-0.364744 2:0.525349 
0.125 1:-0.372533 2:0.153563 
0.125 1:-0.139438 2:-0.0461101 
0.125 1:-0.271555 2:0.905893 
0.125 1:-0.253023 2:-0.214062 
0.125 1:-0.306597 2:-0.169049 
0.125 1:-0.0703571 2:-0.258199 
0.107811506921757 1:0.526244 2:0.105521 
0.125 1:0.156838 2:0.494924 
0.125 1:-0.227896 2:-0.0285873 
0.125 1:0.019011 2:-0.206323 
0.04858549280563047 1:0.780061 2:-0.303603 
0.125 1:-0.412902 2:0.0770676 
0.125 1:-0.145389 2:-0.0415406 
0.125 1:-0.0181838 2:-0.218759 
0.001405311374573036 1:0.125575 2:0.502577 
0.125 1:-0.227602 2:-0.310316 
0.125 1:-0.400858 2:0.0464624 
0.125 1:0.0270564 2:-0.419778 
0.125 1:0.161632 2:0.498039 
0.02895084402133051 1:-0.188534 2:0.00348817 
0.125 1:1 2:0.116043 
0.125 1:-0.0386975 2:-0.450657 
0.125 1:0.128026 2:-0.408429 
0.07505761769296397 1:0.93571 2:0.341322 
0.125 1:-0.0192371 2:0.932542 
0.125 1:0.651235 2:-0.49097 
0.004708220231163475 1:0.333524 2:0.393026 
0.1157255145948334 1:0.394838 2:0.357849 
0.125 1:-0.0395731 2:-0.171156 
0.125 1:0.36964 2:-0.439216 
0.01349831900252141 1:0.582259 2:0.0169944 
0.125 1:-0.102551 2:-0.132993 
0.1137954880614728 1:0.288552 2:0.826886 
0.125 1:-0.320632 2:0.0131033 
0.125 1:-0.0444786 2:-0.583068 
0.02803081424342107 1:0.429803 2:0.302837 
-0.125 1:-0.128647 2:-0.3789 
-0.125 1:-0.224376 2:-0.202671 
-0.125 1:-0.495165 2:-0.115059 
-0.125 1:-0.175972 2:-0.260179 
-0.125 1:-0.157726 2:-0.336179 
-0.125 1:-0.244809 2:-0.0365944 
-0.125 1:-0.068247 2:-0.723221 
-0.125 1:-0.215209 2:-0.895362 
-0.07226864791261441 1:-0.317386 2:-0.235922 
-0.125 1:-0.132343 2:-0.280314 
-0.125 1:-0.258256 2:-0.969754 
-0.125 1:-0.849557 2:-0.933634 
-0.125 1:-0.428966 2:0.0690064 
-0.06912125382445646 1:-0.268724 2:-0.273375 
-0.125 1:-0.283609 2:-0.260458 
-0.125 1:-0.26445 2:-0.91022 
-0.125 1:-0.0978701 2:-0.473449 
-0.125 1:-0.464092 2:0.087246 
-0.125 1:-0.25177 2:-0.276919 
-0.125 1:-0.882715 2:-0.169537 
-0.125 1:-0.890782 2:-0.803398 
-0.125 1:-0.632711 2:-0.09721 
-0.125 1:-0.551362 2:-0.0973774 
-0.125 1:-0.110624 2:-0.236895 
-0.125 1:-0.136055 2:-0.37403 
-0.125 1:-0.604023 2:-0.959108 
-0.125 1:-0.397257 2:-0.0694825 
-0.125 1:-0.179656 2:-0.208425 
-0.125 1:-0.0820341 2:-0.535073 
-0.125 1:-0.338918 2:-0.105904 
-0.125 1:-0.00959476 2:-0.617491 
-0.01678747920307413 1:-0.247007 2:-0.292369 
-0.125 1:-0.922914 2:-0.471592 
-0.1057548955097488 1:-0.63332 2:-0.101649 
-0.125 1:-0.352421 2:-0.12668 
-0.125 1:-0.5894 2:-0.954389 
-0.125 1:-0.859864 2:-0.424847 
-0.125 1:-0.224566 2:-0.301301 
-0.125 1:-0.0664115 2:-0.500263 
-0.125 1:-0.887947 2:-0.0924033 
-0.125 1:0.0466084 2:-0.480169 
-0.125 1:-0.223769 2:-0.234968 
-0.125 1:-0.0578637 2:-0.433717 
-0.125 1:-0.696646 2:-0.992966 
-0.125 1:-0.209236 2:-0.296859 
-0.125 1:-0.144063 2:-0.843468 
-0.125 1:-0.684553 2:-0.00909714 
-0.125 1:-0.878588 2:-0.483636 
-0.125 1:-0.425976 2:-0.157609 
-0.125 1:0.0374003 2:-0.648014 
-0.125 1:-0.244077 2:-0.123284 
-0.125 1:-0.0653619 2:-0.420129 
-0.125 1:-0.230566 2:-0.175777 
-0.125 1:-0.0951931 2:-0.796743 
-0.125 1:-0.0956219 2:-0.342469 
-0.125 1:-0.0428566 2:-0.381594 
-0.125 1:-0.156465 2:-0.272972 
-0.125 1:-0.25259 2:-0.220278 
-0.125 1:-0.564487 2:-0.0743974 
-0.125 1:-0.122721 2:-0.428737 
-0.1080370958889271 1:-0.866416 2:-0.620416 
-0.125 1:-0.500872 2:-1 
-0.125 1:-0.0875765 2:-0.448173 
-0.125 1:-0.384123 2:-0.163696 
-0.125 1:-0.219187 2:-0.146719 
-0.125 1:-0.80373 2:-0.959942 
-0.125 1:-0.71773 2:-0.0590669 
-0.125 1:-0.407619 2:-0.111956 
-0.125 1:-0.197885 2:-0.306134 
-0.05751435390168858 1:-0.831649 2:-0.249292 
-0.07006443076555316 1:-0.221772 2:-0.87057 
-0.125 1:-0.247602 2:-0.263348 
-0.125 1:-0.380696 2:-0.190614 
-0.125 1:0.177101 2:-0.794669 
-0.125 1:-0.158098 2:-0.182265 
-0.125 1:-0.921428 2:-0.686201 
-0.125 1:-0.63924 2:-0.947064 
-0.08551787043731943 1:-0.501825 2:-0.910888 
-0.125 1:-0.931129 2:-0.627258 
-0.1156920783970063 1:-0.84976 2:-0.749047 
-0.125 1:-0.357737 2:-0.182558 
-0.125 1:-1 2:-0.351932
#include "singleslit.h"
#include "randomnumber.h"
#include <cmath>
#include <iostream>
#include <vector>
#include <algorithm>

#include <libsvm/svm.h>

real generate_gaussian(real mu, real sigma)
{
    static RandomNumber r;
    static double z0, z1;
    static bool generate;
    generate = !generate;

    if (!generate) {
        return z1 * sigma + mu;
    }

    double u1, u2;
    u1 = r.get_rand();
    u2 = r.get_rand();

    z0 = sqrt(-2.0 * log(u1)) * cos(2*3.1412 * u2);
    z1 = sqrt(-2.0 * log(u1)) * sin(2*3.1412 * u2);
    return z0 * sigma + mu;
}

#ifdef ESERCIZIO7
int main()
{
    auto Segnale_t = [&] (real x) { return exp(-1*x*x/(2)); };
    auto Fondo_t = [&] (real x) { return exp(-1*pow(x-4, 2)/(2*1.5*1.5)); };
    real min = -5;
    real max = 15;
    
    for (int i = 0; i < 2000; i++) {
        
        // Generiamo un uguale numero di eventi per il segnale e per il fondo.
        
        if (i % 2) {
            std::cout << "1\t" << "1:" << generate_gaussian(0, 1) << "\t2:" << generate_gaussian(0, 1) << std::endl;
        } else {
            std::cout <<  "0\t" << "1:" << generate_gaussian(4, 1.5) << "\t2:" << generate_gaussian(4, 1.5) << std::endl;
        }
    }
    
    // Il resto dell'analisi viene svolta con libsvm.
    
    return 0;
}

#endif
 Precedente