Ho scritto la mia implementazione di LOF e sto provando a confrontare i risultati con le implementazioni in ELKI e RapidMiner, ma tutti e 3 danno risultati diversi! Sto cercando di capire perché.Diversi risultati dall'implementazione LOF in ELKI e RapidMiner
Il mio set di dati di riferimento è monodimensionale, 102 valori reali con molti duplicati. Proverò a postarlo qui sotto.
In primo luogo, l'implementazione RapidMiner. I punteggi LOF sono molto diversi da ELKI e dai miei risultati; molti tornano con un LOF di infinito. Questa implementazione è stata confermata corretta?
I miei risultati sono simili a ELKI, ma non ottengo esattamente gli stessi valori di LOF. Da una rapida scansione dei commenti nel codice sorgente ELKI, penso che questo possa essere dovuto alle differenze nel modo in cui viene calcolato il k-vicinato.
Nella carta LOF, il parametro MinPts (altrimenti chiamato k) specifica il numero minimo. di punti da includere nel k-quartiere. Nell'implementazione ELKI, penso che stiano definendo il k-vicinato come esattamente k punti piuttosto che tutti i punti all'interno della distanza k o della distanza k-distinta. Qualcuno può confermare esattamente come ELKI costruisce il k-quartiere? Inoltre c'è una variabile privata che permette al punto stesso di essere incluso nel suo stesso vicinato, ma sembra che il default non lo includa.
Qualcuno sa di un set di dati di riferimento pubblico che ha i punteggi LOF allegati ai fini della convalida?
--- più dettagli seguono ---
Riferimento: Elki codice sorgente è qui:
http://elki.dbs.ifi.lmu.de/browser/elki/trunk/src/de/lmu/ifi/dbs/elki/algorithm/outlier/lof/LOF.java
RapidMiner codice sorgente è qui:
Qui è il mio set di dati di prova:
4,32323 5,12595 5,12595 5,12595 5,12595 5,7457 5,7457 5,7457 5,7457 5,7457 5,7457 5,97766 5,97766 6,07352 6,07352 6,12015 6,12015 6,12015 6,44797 6,44797 6,48131 6,48131 6,48131 6,48131 6,48131 6,48131 6,6333 6,6333 6,6333 6,70872 6,70872 6,70872 6,70872 6,70872 6,77579 6,77579 6,77579 6,77579 6,77579 6,77579 6,77579 6,77579 6,77579 6,77579 6,77579 6,77579 6,77579 6,77579 6,77579 7,03654 7,03654 7,03654 7,03654 7,03654 7,03654 7,03654 7,03654 7,03654 7,03654 7,03654 7,03654 7,03654 7,03654 7,03654 7,10361 7,10361 7,10361 7,10361 7,10361 7,10361 7,10361 7,10361 7,15651 7,1 5651 7,15651 7,15651 7,15651 7,15651 7,15651 7,15651 8,22598 8,22598 8,22598 8,22598 8,5538 8,5538 8,5538 8,5538 8,5538 8,5538 8,5538 8,5538 8,5538 8,5538 8,5538 8,5538 8,5538 8,5538 8,5538 8,5538 8,5538 8,5538
Per esempio, ricevo il seguente punteggio LOF per il primo numero (4,32,323 mila):
- RapidMiner: infinito (con MinPts limiti inferiore/superiore impostati su 10.100)
- Elki: 2.6774 (con k = 10 e distfunction/reachdistfunction impostato di default)
- mia realizzazione: 1,9531
Alcune maggiori dettagli su quello che la mia applicazione sta facendo:
- MinPts è 10, così ho' Sto trovando i 10 vicini distinti del punto. Quindi il vicinato di 4.32323 è in realtà 48 punti, da 5.12595 a 6.77579.
- Questo mi dà una distanza k-distinta di 2,45256
- Sto calcolando la distanza raggiungibilità del primo prossimo come 1,58277
- Sto calcolando la LRD del campione come 1/(99,9103/48)
- Somma di LRD (o)/LRD (p) per tutti i 48 vicini è 93,748939
- Dividere per 48 per ottenere un LOF di 1,9531
Volete aggiungere il risultato RapidMiner per MinPts = 10 (senza un max superiore)? Sarebbe interessante vedere se è d'accordo, o va sempre all'infinito qui. –