Как сравнить количество кластеров для больших наборов данных? - PullRequest
2 голосов
/ 26 октября 2019

Я пытаюсь сгруппировать набор данных с примерно 1 100 000 наблюдений, каждое из которых имеет три значения. Поскольку я не знаю нужного количества кластеров, я попробовал иерархическую кластеризацию, но для решения проблемы требуется 4095 ГБ памяти. В качестве альтернативы я использовал K-средства и решил проблему для k = 2-10. Теперь проблема в том, что я не могу найти способ сравнить производительность этих кластеров. Этот веб-сайт предлагает десять способов "предварительно" угадать оптимальное количество кластеров, но они не работают для довольно большого набора данных и возвращают сообщение об ошибке памяти.

Мой вопрос: существует ли какой-либо метод (пакет), который может выполнить ту же задачу, но не является ли эта память жадной, чтобы я мог запустить тест?

Моя машина имеет 64 ГБ ОЗУ,и его виртуальная память составляет 171 ГБ. Спасибо!

Ответы [ 2 ]

1 голос
/ 27 октября 2019

Метод Elbow использует только статистику, уже вычисленную с помощью k-средних, поэтому он даже не обращается к данным. Тем не менее, он даже не очень хорошо определен и работает исключительно плохо, за исключением 2d игрушечных данных, используемых в классе. Так что я бы не рекомендовал это. По крайней мере, используйте WSS / (k + 1) вместо или лучше VRC.

Скорее всего, k-means не работает с вашими данными. Будьте готовы признать, что, возможно, ни один из результатов не является хорошим, потому что ваши данные не удовлетворяют требованиям k-средних (например, все атрибуты имеют одинаковую важность и масштаб, являются линейными и не сильно искажены, и все кластеры имеют одинаковое расширение). В частности, последний - аналогичное расширение кластеров - действует только тогда, когда ваши данные фактически генерируются k чистыми сигналами и шумом iid. Если ваши данные поступают от пользователей, скорее всего, они не будут работать. В таких случаях приведенная выше эвристика также не сильно поможет при выборе k ...

Теперь для решения проблемы масштабируемости: просто используйте подвыборку .

K-среднихусреднение, и поэтому большинство показателей качества. Для средних значений субсэмплинг даст вам результаты, очень похожие на весь набор данных. Так что просто подберите 10k или даже 1k ваших очков и используйте только этот набор для оценки (или даже для кластеризации). Если сомневаетесь, оцените несколько раз с разными подвыборками.

0 голосов
/ 27 октября 2019

Вот код, который я нашел и изменил, чтобы «предварительно» предложить вероятные оптимальные кластеры на основе комментария om @ G5W с использованием elbow method и within-cluster sum of the squares

# Determine number of clusters
wss <- (nrow(data)-1)*sum(apply(data,2,var)) 
for (i in 2:9) { 
   wss[i] <- sum(kmeans(data, centers = i)$withinss) 
}  

# Plot the clusters 
plot(1:9, wss, type = "b", xlab = "Number of Clusters", 
   ylab = "Within groups sum of squares")
...