алгоритм k-means - распределение кластера по отдельным клиентам - PullRequest
0 голосов
/ 16 июня 2020

Я использую кластеризацию K-средних, чтобы увидеть похожее поведение клиентов.

Запуск алгоритма k-средних

library(cluster) # Needed for silhouette function

kmeansDat <- data_tbl
kmeansDat.t <- t(kmeansDat)  # Get customers in rows and products in columns

# Setup for k-means loop 
km.out <- list()
sil.out <- list()
x <- vector()
y <- vector()
minClust <- 2      # Hypothesized minimum number of segments
maxClust <- 10    # Hypothesized maximum number of segments

# Compute k-means clustering over various clusters, k, from minClust to maxClust
for (centr in minClust:maxClust) {
        i <- centr-(minClust-1) # relevels start as 1, and increases with centr
        set.seed(11) # For reproducibility
        km.out[i] <- list(kmeans(kmeansDat.t, centers = centr, nstart = 50))
        sil.out[i] <- list(silhouette(km.out[[i]][[1]], dist(kmeansDat.t)))
        # Used for plotting silhouette average widths
        x[i] = centr  # value of k
        y[i] = summary(sil.out[[i]])[[4]]  # Silhouette average width
}

# Get customer names that are in each segment ----------------------------------

# Get attributes of optimal k-means output
maxSilRow <- which.max(y)          # Row number of max silhouette value
optimalClusters <- x[maxSilRow]    # Number of clusters
km.out.best <- km.out[[maxSilRow]] # k-means output of best cluster

# Create list of customer names for each cluster
clusterNames <- list()
clusterList <- list()
for (clustr in 1:optimalClusters) {
  clusterNames[clustr] <- paste0("X", clustr)
  clusterList[clustr] <- list(
    names(
        km.out.best$cluster[km.out.best$cluster == clustr]
        )
    )
}
names(clusterList) <- clusterNames

print(clusterList)

Объединенный кадр данных

Затем я объединял кластер Центроиды с моим набором данных для проверки функций

cust_segment_cntrs <- t(km.out.best$centers)  # Get centroids for groups
colnames(cust_segment_cntrs) <- make.names(colnames(cust_segment_cntrs))
customer_clustered <- bind_cols(data_tbl[, 1:7], as.data.frame(cust_segment_cntrs))

Я получил следующий результат:

$ nr_caes                            <int> 1, 3, 1, 1, 2, 1, 1, 2, 1, 1, 1, …
$ sum_day                            <int> 67, 155, 210, 42, 7, 51, 392, 310…
$ avg_lifetime                       <dbl> 45.00000, 91.50000, 137.00000, 37…
$ avg_perc                           <dbl> 0.800118, 0.427191, 0.570201, 0.7…
$ age                                 <int> 35, 29, 27, 51, 31, 63, 35, 27, 4…
$ lifetime                            <int> 90, 366, 274, 756, 546, 702, 28, …
$ perc_seen                           <dbl> 31.78205, 81.42577, 93.25000, 58.…
$ X1                                  <dbl> -0.160736676, 0.101188572, -0.021…
$ X2                                  <dbl> -0.44987836, -0.37890378, -0.3508…
$ X3                                  <dbl> -0.25349377, -0.41840180, 0.32034…
$ X4                                  <dbl> 0.07813974, 0.09580886, 0.1019051…
$ X5                                  <dbl> -0.58865724, -0.58865724, -0.5886…
$ X6                                  <dbl> -0.36094591, -0.36094591, -0.3609…
$ X7                                  <dbl> -0.22366143, -0.26367804, -0.2645…
$ X8                                  <dbl> -0.1806002, -0.1727053, -0.146464…

Однако все кластеры имеют значения центроидов для всех клиентов для каждого кластера с X1 по X8. Мне трудно понять, какие клиенты принадлежат к какому кластеру.

  • Мне интересно, что я могу сделать, чтобы назначить какой-то порог?
  • Итак, я могу сказать, что этот клиент принадлежит к определенный кластер, например, начальное и конечное значение на основе центроида.

Извините, если не смог хорошо объяснить.

  • В конце концов, я хочу увидеть, какой клиент к какой группе принадлежит, а также характеристики функций.

Заранее спасибо

...