Ich habe meine eigene Implementierung von LOF geschrieben und ich versuche, Ergebnisse mit den Implementierungen in ELKI und RapidMiner zu vergleichen, aber alle 3 geben andere Ergebnisse! Ich versuche herauszufinden, warum.Verschiedene Ergebnisse von LOF Implementierung in ELKI und RapidMiner
Mein Referenzdatensatz ist eindimensional, 102 echte Werte mit vielen Duplikaten. Ich werde es versuchen und es unten posten.
Zuerst die RapidMiner-Implementierung. Die LOF-Werte unterscheiden sich stark von ELKI und von meinen Ergebnissen; viele kommen mit einem LOF der Unendlichkeit zurück. Wurde diese Implementierung als richtig validiert?
Meine Ergebnisse sind ähnlich wie ELKI, aber ich bekomme nicht genau die gleichen LOF-Werte. Aus einem kurzen Blick auf die Kommentare im ELKI-Quellcode, denke ich, kann dies an den Unterschieden in der Art und Weise liegen, wie die k-Nachbarschaft berechnet wird.
Im LOF-Papier gibt der MinPts-Parameter (an anderer Stelle k genannt) die minimale Anzahl an. von Punkten, die in der k-Nachbarschaft enthalten sein sollen. In der ELKI-Implementierung, glaube ich, definieren sie die k-Nachbarschaft als genau k Punkte und nicht als alle Punkte innerhalb der k-Distanz oder k-distinkten Distanz. Kann jemand genau bestätigen, wie ELKI die k-Nachbarschaft konstruiert? Es gibt auch eine private Variable, die es erlaubt, den Punkt selbst in seine eigene Nachbarschaft aufzunehmen, aber es sieht so aus, als ob der Punkt nicht darin enthalten wäre.
Kennt jemand einen öffentlichen Referenzdatensatz, der die LOF-Scores für Validierungszwecke angehängt hat?
--- mehr Details folgen ---
Referenz: ELKI Quellcode ist hier:
http://elki.dbs.ifi.lmu.de/browser/elki/trunk/src/de/lmu/ifi/dbs/elki/algorithm/outlier/lof/LOF.java
Rapidminer Quellcode ist hier:
Hier ist mein Testdatensatz:
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
Zum Beispiel bekomme ich folgende LOF Punktzahl für die erste Reihe (4,32323):
- Rapid: unendlich (mit MinPts unterer/oberer Grenze eingestellt 10.100)
- ELKI: 2.6774 (mit k = 10 und distfunction/reachdistfunction auf Standard gesetzt)
- Meine Implementierung: 1,9531
Einige weitere Details darüber, was meine Implementierung tut:
- MinPts ist 10, so dass ich Ich finde die 10 verschiedenen Nachbarn des Punktes. So ist die Nachbarschaft von 4,33232 tatsächlich 48 Punkte, von 5,12595 bis zu 6,77579.
- Das hat mir einen k-deutlichen Abstand von 2,45256
- gibt ich die Berechnung den Erreichbarkeits Abstandes des ersten Nächsten wie 1,58277
- ich die LRD der Probe als 1/(99,9103/48) Berechnung
- Summe LRD (o)/LRD (p) für alle 48 Nachbarn ist 93,748939
- Division durch 48 eine LOF von 1,9531
Würden Sie das Ergebnis für Rapidminer MinPts = 10 (ohne höheren max) hinzufügen? Es wäre interessant zu sehen, ob es stimmt, oder hier immer ins Unendliche geht. –