Как кластеризовать экземпляр с помощью DBSCAN Weka? - PullRequest
9 голосов
/ 17 сентября 2011

Я пытался использовать кластер 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 ]

5 голосов
/ 22 сентября 2011

Об этом сообщалось как об ошибке - [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

0 голосов
/ 16 ноября 2011

Как ответил Марк, это явно ошибка. Пока вы запрашиваете экземпляры в том же порядке, в котором они были вставлены в кластер, все в порядке; но это не сработает ни в одном другом случае.

Сотрудница решила эту проблему, написав собственную версию класса DBScan: практически идентичную (вставленную при копировании), за исключением того, что она поддерживает отображение между экземплярами и метками кластера. Это отображение может быть произведено путем перебора содержимого экземпляра database. Соответствующий кластер для экземпляра может быть немедленно извлечен из этого сопоставления.

Редактирование этого метода также является хорошей возможностью изменить throw new Exception на что-то более разумное в этом контексте, например return -1.

0 голосов
/ 22 сентября 2011

Пример, опубликованный Марком, хорошо показывает, как использовать класс DBScan.

Метод, который выполняет фактическую кластеризацию: DBScan.buildClusterer(Instances instances).

Предполагается, что DBScan.clusterInstance(Instance instance) возвращает номер назначенного кластера для данного экземпляра (после запуска метода buildClusterer). Но это правда, что параметр на самом деле игнорируется, поэтому я думаю, что он не будет делать то, что должен.

...