Как кластеризовать экземпляр с помощью DBSCAN Weka?
Я пытался использовать кластер DBSCAN от Weka для кластеризации экземпляров. Из того, что я понимаю, я должен использовать clusterInstance()
метод для этого, но, к моему удивлению, при взгляде на код этого метода, похоже, что реализация игнорирует параметр:
/**
* Classifies a given instance.
*
* @param instance The instance to be assigned to a cluster
* @return int The number of the assigned cluster as an integer
* @throws java.lang.Exception If instance could not be clustered
* successfully
*/
public int clusterInstance(Instance instance) throws Exception {
if (processed_InstanceID >= database.size()) processed_InstanceID = 0;
int cnum = (database.getDataObject(Integer.toString(processed_InstanceID++))).getClusterLabel();
if (cnum == DataObject.NOISE)
throw new Exception();
else
return cnum;
}
Это не кажется правильным. Как это должно работать? Есть ли другой метод, который я должен использовать для кластеризации? Нужно ли запускать этот метод последовательно на всех экземплярах, в каком-то определенном порядке, если я хочу извлечь из него какую-либо полезную информацию?
3 ответа
Как ответил Марк, это явно ошибка. Пока вы запрашиваете экземпляры в том же порядке, в котором они были вставлены в кластер, все в порядке; но это не будет работать в любом другом случае.
Сотрудница решила эту проблему, написав собственную версию класса DBScan: практически идентичную (вставленную при копировании), за исключением того, что она поддерживает отображение между экземплярами и метками кластера. Это отображение может быть произведено путем перебора содержимого database
пример. Соответствующий кластер для экземпляра может быть немедленно извлечен из этого сопоставления.
Редактирование этого метода также является хорошей возможностью изменить throw new Exception
в нечто более разумное в этом контексте, например, return -1
,
Это было сообщено как ошибка - [Wekalist] DBScan - Проблема / Ошибка с "clusterInstance()"- Функция.
Я делаю кластеризацию с библиотекой DBScan. К сожалению, похоже, что есть ошибка в функции clusterInstance (). Функция не возвращает номер назначенного кластера, а только возвращает номер кластера первого элемента базы данных (или второго при втором вызове, третьего при третьем вызове и т. Д.) И НЕ назначенного экземпляра,
Это просто не может работать, потому что назначенная переменная никогда не используется в функции.
Ответ гласит:
DBScan и Optics являются вкладом в Weka. Возможно, лучше всего связаться с авторами, чтобы узнать, могут ли они предложить исправление ошибки. Код и информация о пакете (Weka 3.7) имеет контактную информацию:
http://weka.sourceforge.net/packageMetaData/optics_dbScan/index.html
Боюсь, я не знаком с алгоритмом DBScan, а код довольно старый (2004 год), возможно, вам повезет, и вы по-прежнему сможете связаться с авторами в LMU Munich.
Я нашел многочисленные копии этого через Google Code Search и GitHub, но я не смог найти пример, где это было исправлено. Во время поиска я заметил несколько других реализаций DBScan, которые вы могли бы изучить, чтобы выяснить, как это можно исправить (например, DBSCAN ELKI)
Как я уже сказал, я незнаком с DBScan, но просмотр JavaDocs дал мне впечатление, что фактическая кластеризация вызывается вызовом buildClusterer(экземпляры Instances). Изучение исходного кода в методе buildClusterer происходит гораздо больше, чем в методе clusterInstance. OPTICS.java также содержит метод clusterInstance, который просто вызывает исключение. Если вам повезло, возможно, вы можете обойтись без работающего метода clusterInstance.
Я нашел пример использования DBScan Weka здесь: DBSCANClustering.java
Приведенный Марком пример хорошо показывает, как использовать класс DBScan.
Метод, который делает фактическую кластеризацию DBScan.buildClusterer(Instances instances)
,
DBScan.clusterInstance(Instance instance)
должен вернуть номер назначенного кластера для данного экземпляра (после того, как вы запустили buildClusterer
метод). Но это правда, что параметр фактически игнорируется, поэтому я думаю, что он не будет делать то, что должен делать.