Иерархическая кластеризация: определение оптимального количества кластеров и статистическое описание кластеров

Я мог бы использовать некоторые рекомендации по методам в R, чтобы определить оптимальное количество кластеров, а затем описать кластеры с различными статистическими критериями. Я новичок в R с базовыми знаниями о статистических основах кластерного анализа.

  • Методы определения количества кластеров: В литературе одним из распространенных методов является так называемый "критерий локтя", который сравнивает сумму квадратов разностей (SSD) для различных кластерных решений. Поэтому SSD рассчитывается против числа кластеров в анализе, и оптимальное количество кластеров определяется путем определения "локтя" на графике (например, здесь: https://en.wikipedia.org/wiki/File:DataClustering_ElbowCriterion.JPG) Этот метод является первым подходом к получению субъективного впечатления. Поэтому Id нравится реализовывать его в R. Информация в Интернете по этому поводу разрежена. Здесь есть один хороший пример: http://www.mattpeeples.net/kmeans.html, где автор также сделал интересный итеративный подход, чтобы увидеть, как локоть как-то стабилен после нескольких повторений процесса кластеризации (тем не менее, для разбиения кластерных методов не на иерархические). Другие методы в литературе содержат так называемые "правила остановки". МИЛЛИГАН и КУПЕР сравнили 30 из этих правил остановки в своей статье "Рассмотрение процедур определения количества кластеров в наборе данных" (см. Здесь http://link.springer.com/article/10.1007%2FBF02294245), установив, что правило остановки от Калинского и Харабаша обеспечило наилучшие результаты в оценке Монте-Карло. Информация о реализации этого в R еще реже. Поэтому, если кто-либо когда-либо выполнял это или другое правило остановки (или другой метод), некоторые советы были бы очень полезными.

  • Статистически описывать кластеры. Для описания кластеров я думал об использовании среднего и своего рода вариационного критерия. Мои данные касаются сельскохозяйственного землепользования и показывают количество производства различных культур в каждом муниципалитете. Моя цель - найти аналогичные модели землепользования в моем наборе данных.

Я создал script для подмножества объектов для выполнения первого тестового прогона. Это выглядит так (пояснения по шагам в script, ниже).

    #Clusteranalysis agriculture

    #Load data
    agriculture <-read.table ("C:\\Users\\etc...", header=T,sep=";")
    attach(agriculture)

    #Define Dataframe to work with
    df<-data.frame(agriculture)

    #Define a Subset of objects to first test the script
    a<-df[1,]
    b<-df[2,]
    c<-df[3,]
    d<-df[4,]
    e<-df[5,]
    f<-df[6,]
    g<-df[7,]
    h<-df[8,]
    i<-df[9,]
    j<-df[10,]
    k<-df[11,]
    #Bind the objects
    aTOk<-rbind(a,b,c,d,e,f,g,h,i,j,k)

    #Calculate euclidian distances including only the columns 4 to 24
    dist.euklid<-dist(aTOk[,4:24],method="euclidean",diag=TRUE,upper=FALSE, p=2)
    print(dist.euklid)

    #Cluster with Ward
    cluster.ward<-hclust(dist.euklid,method="ward")

    #Plot the dendogramm. define Labels with labels=df$Geocode didn't work
    plot(cluster.ward, hang = -0.01, cex = 0.7)

    #here are missing methods to determine the optimal number of clusters

    #Calculate different solutions with different number of clusters
    n.cluster<-sapply(2:5, function(n.cluster)table(cutree(cluster.ward,n.cluster)))
    n.cluster

    #Show the objects within clusters for the three cluster solution
    three.cluster<-cutree(cluster.ward,3)
    sapply(unique(three.cluster), function(g)aTOk$Geocode[three.cluster==g])

    #Calculate some statistics to describe the clusters
    three.cluster.median<-aggregate(aTOk[,4:24],list(three.cluster),median)
    three.cluster.median
    three.cluster.min<-aggregate(aTOk[,4:24],list(three.cluster),min)
    three.cluster.min
    three.cluster.max<-aggregate(aTOk[,4:24],list(three.cluster),max)
    three.cluster.max
    #Summary statistics for one variable
    three.cluster.summary<-aggregate(aTOk[,4],list(three.cluster),summary)
    three.cluster.summary

    detach(agriculture)

Источники

Ответ 1

Критерий локтя, обозначенный вашими ссылками, равен k-означает. Кроме того, среднее значение кластера, очевидно, связано с k-средствами и не подходит для кластеризации связей (в частности, не для одиночной связи, см. Эффект с одной связью).

Заголовок вопроса, однако, упоминает иерархическую кластеризацию, а также ваш код?

Обратите внимание, что критерий локтя не выбирает оптимальное количество кластеров. Он выбирает оптимальное количество кластеров k-сред. Если вы используете другой метод кластеризации, может потребоваться другое количество кластеров.

Существует нет такой вещи, как объективно лучшая кластеризация. Таким образом, также нет объективно лучшего числа кластеров. Существует правило для k-средств, которое выбирает (возможно, лучший) компромисс между количеством кластеров и минимизацией целевой функции (поскольку увеличение количества кластеров всегда может улучшить целевую функцию); но это в основном для противодействия дефициту k-средств. Это отнюдь не объективно.

Кластерный анализ сам по себе не является объективной задачей. Кластеризация может быть математически хорошей, но бесполезной. Кластеризация может значительно ухудшаться математически, но она может обеспечить вам понимание ваших данных, которые невозможно измерить математически.

Ответ 2

Это очень поздний ответ, и, вероятно, он не полезен для искателя, но, возможно, для других. Проверьте пакет NbClust. Он содержит 26 индексов, которые дают вам рекомендуемое количество кластеров (и вы также можете выбрать тип кластеризации). Вы можете запустить его таким образом, чтобы получить результаты для всех индексов, а затем вы можете в основном пойти с количеством кластеров, рекомендованных большинством индексов. И да, я думаю, что основные статистические данные - лучший способ описания кластеров.