1. Уважаемые посетители форума ЭСПП!

    Для просмотра сообщений достаточно прокрутить данное сообщение, а для просмотра списка разделов - вызвать "Каталог".

    Для комментариев необходимо предварительно ознакомиться c Правилами Форума и пройти регистрацию!



    Для того, чтобы быстро ознакомится с возможностями форума, загляните в подраздел Для новичков.

    Если при входе на форум появляется сообщение об ошибке, попробуйте восстановить или сменить пароль, нажав здесь.

Сколько кластеров следует выделять?

Тема в разделе 'Виноградов А.Г.', создана пользователем Виноградов А.Г., 29 фев 2016.

  1. Виноградов А.Г.

    Виноградов А.Г. Модератор Команда форума

    При проведении кластерного анализа одной из важных проблем является определение числа кластеров, на которые следует разбивать совокупность наблюдений. Для непрерывных переменных я предложил следующий подход, который строится на тех же принципах, что и оценка качества модели в конфирматорном факторном анализе.
    Кластерное решение, по сути, призвано репрезентировать наблюдаемые данные. Оценить то, насколько хорошо это удается сделать, можно следующим образом: каждое наблюдение заменяется профилем кластера, к которому оно относится. Разница между корреляционными матрицами для исходных данных и массива, воспроизведенного на основании кластерной модели (например, таблицы центров кластеров), говорит о качестве модели. По матрице остатков можно вычислить привычный критерий SRMR (standardized root mean square residual). Вот пример, который на данных опросника bfi демонстрирует суть подхода:

    require(psych)
    data(bfi)
    dframe <- na.omit(bfi[1:5])
    model <- kmeans(dframe, 100)

    n <- rep(1:nrow(model$centers), model$size)
    reproduced.df <- model$centers[n, ]
    residuals <- cor(dframe) - cor(reproduced.df)

    p <- nrow(residuals)
    e <- p*(p+1)/2
    SRMR <- sqrt(sum(residuals[lower.tri(residuals, diag = TRUE)]^2)/e)
    SRMR

    Как видим, понадобилось 100 кластеров для того, чтобы достичь приемлемого уровня SRMR (0.039)

    ссылка на мою статью: Виноградов О.Г. Номенклатура сигнатур емоційного реагування на ситуації публічного виступу // Актуальні проблеми соціології, психології, педагогіки: Збірник наукових праць. – Вип. 18 – К.: Логос, 2013. - с. 119-126
    Тукачев Ю.А. и Шмелев А.Г. нравится это.
  2. Митина О.В.

    Митина О.В. Активист Команда форума

    Александр Геннадьевич, спасибо большое, а что такое "профиль кластера" и как его посчитать?
    Виноградов А.Г. нравится это.
  3. Виноградов А.Г.

    Виноградов А.Г. Модератор Команда форума

    Это его вектор средних по кластеризуемым переменным. В R функции kmeans() возвращается в массиве $centers
  4. Митина О.В.

    Митина О.В. Активист Команда форума

    В SPSS есть функция K-mean анализ, где можно задать априорно количество кластеров (в сочетании с дискриминантным анализом это такой вариант конфирматорного кластерного анализа в отличие от иерархического кластерного анализа - который может быть условно назван эксплораторным кластерным анализом).
    Как вы думаете, это близко?
  5. Виноградов А.Г.

    Виноградов А.Г. Модератор Команда форума

    Это один из альтернативных опосредованных способов подтверждения решения о количестве кластеров, не без своих недостатков (разделение кластеров линейными функциями, предположение о равенстве ковариационных матриц и т.п.). Мой подход мне кажется проще и нагляднее
    Шмелев А.Г. нравится это.
  6. Тукачев Ю.А.

    Тукачев Ю.А. Администратор Команда форума

    Александр Геннадьевич, а есть пакет NbClust, в котором около 30 индексов для опредения числа кластеров. Вы не пробовали его?
    NbClust http ://cran.r-project.org/web/packages/NbClust/index.html
    Никитина И.А. нравится это.
  7. Виноградов А.Г.

    Виноградов А.Г. Модератор Команда форума

    Вы нашли какие-то совпадения?

  8. Тукачев Ю.А.

    Тукачев Ю.А. Администратор Команда форума

    Нет, не успел попробовать, надо в R (windows) пакет устанавливать, под linux у меня R 3.0.2
    Для MONEX я так пробовал определять число кластеров:
    Выделение_349.png

    output$clusters <- renderPlot({
    tdata <- workdata()
    validate(
    need(nrow(tdata) != 0, "Нет данных для анализа. Выберите группу экспертов!")
    )
    tdata <- tdata[match(input$exps,rownames(tdata)),]
    data <- data.frame(t(tdata), stringsAsFactors = FALSE)
    d <- dist(t(data[,1:(ncol(data))]))
    clmodel <- hclust(d, method = "ward")
    plot(clmodel, col = "#02818a", col.main = "#02818a", col.lab = "#02818a",
    col.axis = "#02818a", lwd = 2, lty = 1, hang = -1,
    main = "Дендрограмма")
    if (input$numclust == TRUE) {
    rect.hclust(clmodel, input$cl_adjust)
    }
    })

    #Функция для определения числа кластеров
    plot.hclust.trace <- function(h, k=1:7) {
    g <- rev(h$height)
    k <- k[k < length(g)]
    #g <- sqrt(g)
    if(h$method != "single") {
    g <- -diff(g)
    }
    qplot(k,g[k], ylab = "Цена объединения кластеров \n(сумма квадратов ошибок, SSE)",xlab = "Число кластеров", geom = "line") + scale_x_continuous(breaks=1:10)
    }

    Не уверен, что правильно, но вроде работает :)