Будучи новичком в R, я не очень уверен, как выбрать лучшее количество кластеров для анализа k-средних. После построения подмножества данных ниже, сколько кластеров будет уместным? Как я могу выполнить кластерный анализ дендро?
n = 1000
kk = 10
x1 = runif(kk)
y1 = runif(kk)
z1 = runif(kk)
x4 = sample(x1,length(x1))
y4 = sample(y1,length(y1))
randObs <- function()
{
ix = sample( 1:length(x4), 1 )
iy = sample( 1:length(y4), 1 )
rx = rnorm( 1, x4[ix], runif(1)/8 )
ry = rnorm( 1, y4[ix], runif(1)/8 )
return( c(rx,ry) )
}
x = c()
y = c()
for ( k in 1:n )
{
rPair = randObs()
x = c( x, rPair[1] )
y = c( y, rPair[2] )
}
z <- rnorm(n)
d <- data.frame( x, y, z )
r
cluster-analysis
k-means
user2153893
источник
источник
fpc
пакете. Это правда, тогда вам нужно установить два параметра ... но я обнаружил, чтоfpc::dbscan
тогда он довольно хорошо справляется с автоматическим определением большого количества кластеров. Кроме того, он может на самом деле выводить один кластер, если это то, о чем вам говорят данные - некоторые методы из превосходных ответов @ Ben не помогут вам определить, является ли k = 1 на самом деле лучшим.Ответы:
Если ваш вопрос
how can I determine how many clusters are appropriate for a kmeans analysis of my data?
, то вот несколько вариантов. Википедия статья об определении числа кластеров имеет хороший обзор некоторых из этих методов.Во-первых, некоторые воспроизводимые данные (данные в Q ... для меня неясны):
Один . Ищите изгиб или колено на графике осциллограммы суммы квадратов ошибок (SSE). См. Http://www.statmethods.net/advstats/cluster.html & http://www.mattpeeples.net/kmeans.html для получения дополнительной информации. Расположение колена на полученном графике предполагает подходящее количество кластеров для kmeans:
Мы могли бы заключить, что 4 кластера будут обозначены этим методом:
Два . Вы можете выполнить разбиение вокруг медоидов, чтобы оценить количество кластеров, используя
pamk
функцию в пакете fpc.Три . Критерий Калинского: еще один подход к диагностике того, сколько кластеров соответствует данным. В этом случае мы пробуем от 1 до 10 групп.
Четыре . Определить оптимальную модель и количество кластеров согласно байесовскому информационному критерию для максимизации ожидания, инициализированному иерархической кластеризацией для параметризованных моделей гауссовой смеси
Пять . Кластеризация распространения сродства (AP), см. Http://dx.doi.org/10.1126/science.1136800
Шесть . Статистика разрыва для оценки количества кластеров. Смотрите также некоторый код для хорошего графического вывода . Попытка 2-10 кластеров здесь:
Вот результат реализации статистики разрыва Эдвином Ченом:
Семь . Вам также может быть полезно изучить данные с помощью кластерных диаграмм для визуализации назначения кластеров, см. Http://www.r-statistics.com/2010/06/clustergram-visualization-and-diagnostics-for-cluster-analysis-r- код / для более подробной информации.
Восемь . Пакет NbClust предоставляет 30 индексов для определения количества кластеров в наборе данных.
Если ваш вопрос
how can I produce a dendrogram to visualize the results of my cluster analysis
, то вы должны начать с этих: http://www.statmethods.net/advstats/cluster.html http://www.r-tutor.com/gpu-computing/clustering/hierarchical-cluster-analysis http://gastonsanchez.wordpress.com/2012/10/03/7-ways-to-plot-dendrograms-in-r/ И посмотрите здесь более экзотические методы: http://cran.r-project.org/ веб / просмотров / Cluster.htmlВот несколько примеров:
Также для данных большого размера есть
pvclust
библиотека, которая вычисляет p-значения для иерархической кластеризации с помощью мультимасштабной начальной загрузки. Вот пример из документации (не будет работать с такими низкоразмерными данными, как в моем примере):Помогает ли что-нибудь из этого?
источник
R
пакетов (он находится на моем GitHub - вы можете посмотреть); 3) мое решение, кажется, работает достаточно хорошо, к тому же прошло много времени, и я уже завершил подготовку своего диссертационного программного обеспечения, отчета по диссертации (тезис) и в настоящее время я готовлюсь к защите :-). Несмотря на это, я очень ценю ваш комментарий и ссылки. Всего наилучшего!Трудно добавить что-то слишком сложный ответ. Хотя я чувствую, что мы должны упомянуть
identify
здесь, особенно потому, что @Ben показывает много примеров дендрограмм.identify
позволяет вам интерактивно выбирать кластеры из дендрограммы и сохраняет ваши выборы в списке. Нажмите Esc, чтобы выйти из интерактивного режима и вернуться в консоль R. Обратите внимание, что список содержит индексы, а не имена строк (в отличие отcutree
).источник
Для определения оптимального k-кластера в методах кластеризации. Я обычно использую
Elbow
метод, сопровождаемый параллельной обработкой, чтобы избежать затрат времени. Этот код может привести пример:Метод локтя
Бег Локоть параллельно
Это работает хорошо.
источник
Великолепный ответ от Бена. Однако я удивлен, что метод Affinity Propagation (AP) был предложен здесь только для того, чтобы найти номер кластера для метода k-средних, где в общем случае AP лучше выполняет кластеризацию данных. Пожалуйста, смотрите научную статью, поддерживающую этот метод в науке здесь:
Фрей, Брендан Дж. И Дельберт Дуек. «Кластеризация путем передачи сообщений между точками данных». наука 315.5814 (2007): 972-976.
Поэтому, если вы не склонны к k-средствам, я предлагаю использовать AP напрямую, что позволит кластеризовать данные без необходимости знать количество кластеров:
Если отрицательные евклидовы расстояния не подходят, то вы можете использовать другие меры подобия, представленные в том же пакете. Например, для сходств, основанных на корреляциях Спирмена, это то, что вам нужно:
Обратите внимание, что эти функции для сходства в пакете AP просто предоставлены для простоты. Фактически, функция apcluster () в R будет принимать любую матрицу корреляций. То же самое ранее с помощью corSimMat () можно сделать с помощью этого:
или
в зависимости от того, что вы хотите кластеризовать на вашей матрице (строки или столбцы).
источник
Эти методы хороши, но при попытке найти k для гораздо больших наборов данных, они могут быть очень медленными в R.
Хорошее решение, которое я нашел, - это пакет «RWeka», который имеет эффективную реализацию алгоритма X-Means - расширенную версию K-Means, которая лучше масштабируется и определит оптимальное количество кластеров для вас.
Сначала вы должны убедиться, что Weka установлена в вашей системе и что XMeans установлен через инструмент менеджера пакетов Weka.
источник
Простое решение - библиотека
factoextra
. Вы можете изменить метод кластеризации и метод расчета наилучшего количества групп. Например, если вы хотите узнать наилучшее количество кластеров для k-средних:Данные: mtcars
Наконец, мы получаем график вроде:
источник
Ответы отличные. Если вы хотите дать шанс другому методу кластеризации, вы можете использовать иерархическую кластеризацию и посмотреть, как данные разделяются.
В зависимости от того, сколько классов вам нужно, вы можете вырезать свою дендрограмму как;
Если вы напечатаете,
?cutree
вы увидите определения. Если ваш набор данных имеет три класса, это будет простоcutree(hc.complete, k = 3)
. Эквивалентомcutree(hc.complete,k = 2)
являетсяcutree(hc.complete,h = 4.9)
.источник