Я написал свою собственную реализацию LOF и пытаюсь сравнить результаты с реализациями в ELKI и RapidMiner, но все 3 дают разные результаты! Я пытаюсь понять, почему.
Мой эталонный набор данных одномерный, 102 реальных значения с множеством дубликатов. Постараюсь выложить ниже.
Во-первых, реализация RapidMiner. Оценки LOF сильно отличаются от ELKI и от моих результатов; многие возвращаются с LOF бесконечности. Была ли эта реализация подтверждена как правильная?
Мои результаты аналогичны ELKI, но я не получаю точно такие же значения LOF. Из быстрого просмотра комментариев в исходном коде ELKI я думаю, что это может быть из-за различий в способах вычисления k-окрестности.
В документе LOF параметр MinPts (в другом месте называемый k) указывает минимальный номер. точек, входящих в k-окрестность. Я думаю, что в реализации ELKI они определяют k-окрестность как ровно k точек, а не как все точки в пределах k-расстояния или k-различного расстояния. Кто-нибудь может точно подтвердить, как ELKI строит k-окрестность? Также есть частная переменная, которая позволяет включить саму точку в свою окрестность, но похоже, что по умолчанию она не включена.
Кто-нибудь знает об общедоступном справочном наборе данных, к которому прикреплены оценки LOF для целей проверки?
--- подробности следуют ---
Ссылка: Исходный код ELKI находится здесь:
http://elki.dbs.ifi.lmu.de/browser/elki/trunk/src/de/lmu/ifi/dbs/elki/algorithm/outlier/lof/LOF.java
Исходный код RapidMiner находится здесь:
Вот мой тестовый набор данных:
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.15651 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
Например, я получаю следующую оценку LOF для первого числа (4,32323):
- RapidMiner: бесконечность (с установленными нижними/верхними границами MinPts на 10 100)
- ELKI: 2,6774 (с k = 10 и параметрами distfunction/reachdistfunction по умолчанию)
- Моя реализация: 1.9531
Еще немного подробностей о том, что делает моя реализация:
- MinPts равно 10, поэтому я нахожу 10 различных соседей точки. Таким образом, окрестность 4,32323 на самом деле составляет 48 точек, от 5,12595 до 6,77579.
- Это дает мне k-различное расстояние 2,45256.
- Я рассчитываю расстояние достижимости первого соседа как 1,58277.
- Я рассчитываю LRD образца как 1/(99,9103/48)
- Сумма lrd(o)/lrd(p) для всех 48 соседей равна 93,748939.
- Разделите на 48, чтобы получить LOF 1,9531.