У меня есть набор данных с десятком измерений (столбцов) и около 200 наблюдений (строк). Этот набор данных был нормализован с использованием quantile_transform_normalize. (Обновлено: я попытался запустить кластеризацию без нормализации, но все равно не повезло, поэтому я не верю, что это причина.) Теперь я хочу сгруппировать данные в несколько кластеров. До сих пор я использовал KMeans, но читал, что он может быть неточным в более высоких измерениях и плохо обрабатывать выбросы, поэтому я хотел сравнить с DBSCAN, чтобы увидеть, получу ли я другой результат.
Однако, когда я пытаюсь кластеризовать данные с помощью DBSCAN с использованием метрики расстояния Махаланобиса, каждый элемент кластеризуется в -1. По документации:
Noisy samples are given the label -1.
Я не совсем уверен, что это означает, но я получал несколько хороших кластеров с KMeans, поэтому я знаю, что есть что-то для кластеризации - это не просто случайное.
Вот код, который я использую для кластеризации:
covariance = np.cov(data.values.astype("float32"), rowvar=False)
clusterer = sklearn.cluster.DBSCAN(min_samples=6, metric = "mahalanobis", metric_params = {"V": covariance})
clusterer.fit(data)
И это все. Я точно знаю, что data - это числовой DataFrame Pandas, поскольку я проверил его в отладчике.
Что могло вызвать эту проблему?






Вам также необходимо выбрать параметр eps.
Результаты DBSCAN очень сильно зависят от этого параметра. Вы можете найти некоторые методы его оценки в литературе.
IMHO, sklearn должен предоставить нет значение по умолчанию для этого параметра, потому что он редко когда-либо работает (с нормализованными игрушечными данными это обычно нормально, но это все).
200 экземпляров, вероятно, слишком мало для надежного измерения плотности, особенно с дюжиной переменных.
Как определяется дефолтный eps? Я немного заподозрил это, но не смог найти никакой документации, поэтому решил, что это приемлемое значение по умолчанию.
Кто-то в какой-то момент выбрал значение по умолчанию. Нет процесса, зависящего от данных. Поэтому чаще всего не работает. Сообщите об ошибке, если значение по умолчанию вводит в заблуждение.
Возможно, ваши данные просто недостаточно "плотные" для DBScan. Вы пробовали использовать другую метрику и отрегулировать значение min_samples?