Utilisation du package de statistiques dans R pour le clustering de kmeans

10

J'ai du mal à comprendre un ou deux aspects du package de cluster. Je suis de près l'exemple de Quick-R , mais je ne comprends pas un ou deux aspects de l'analyse. J'ai inclus le code que j'utilise pour cet exemple particulier.

## Libraries
library(stats)
library(fpc) 

## Data
mydata = structure(list(a = c(461.4210925, 1549.524107, 936.42856, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131.4349206, 0, 762.6110846, 
3837.850406), b = c(19578.64174, 2233.308842, 4714.514274, 0, 
2760.510002, 1225.392118, 3706.428246, 2693.353714, 2674.126613, 
592.7384164, 1820.976961, 1318.654162, 1075.854792, 1211.248996, 
1851.363623, 3245.540062, 1711.817955, 2127.285272, 2186.671242
), c = c(1101.899095, 3.166506463, 0, 0, 0, 1130.890295, 0, 654.5054857, 
100.9491289, 0, 0, 0, 0, 0, 789.091922, 0, 0, 0, 0), d = c(33184.53871, 
11777.47447, 15961.71874, 10951.32402, 12840.14983, 13305.26424, 
12193.16597, 14873.26461, 11129.10269, 11642.93146, 9684.238583, 
15946.48195, 11025.08607, 11686.32213, 10608.82649, 8635.844964, 
10837.96219, 10772.53223, 14844.76478), e = c(13252.50358, 2509.5037, 
1418.364947, 2217.952853, 166.92007, 3585.488983, 1776.410835, 
3445.14319, 1675.722506, 1902.396338, 945.5376228, 1205.456943, 
2048.880329, 2883.497101, 1253.020175, 1507.442736, 0, 1686.548559, 
5662.704559), f = c(44.24828759, 0, 485.9617601, 372.108855, 
0, 509.4916263, 0, 0, 0, 212.9541122, 80.62920455, 0, 0, 30.16525587, 
135.0501384, 68.38023073, 0, 21.9317122, 65.09052886), g = c(415.8909649, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 637.2629479, 0, 0, 
0), h = c(583.2213618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0), i = c(68206.47387, 18072.97762, 23516.98828, 
13541.38572, 15767.5799, 19756.52726, 17676.00505, 21666.267, 
15579.90094, 14351.02033, 12531.38237, 18470.59306, 14149.82119, 
15811.23348, 14637.35235, 13588.64291, 12549.78014, 15370.90886, 
26597.08152)), .Names = c("a", "b", "c", "d", "e", "f", "g", 
"h", "i"), row.names = c(NA, -19L), class = "data.frame")

Ensuite, je standardise les variables:

# standardize variables
mydata <- scale(mydata) 

## K-means Clustering 

# Determine number of clusters
wss <- (nrow(mydata)-1)*sum(apply(mydata,2,var))
for (i in 2:15) wss[i] <- sum(kmeans(mydata, centers=i)$withinss)
# Q1
plot(1:15, wss, type="b", xlab="Number of Clusters",  ylab="Within groups sum of squares") 

# K-Means Cluster Analysis
fit <- kmeans(mydata, 3) # number of values in cluster solution

# get cluster means 
aggregate(mydata,by=list(fit$cluster),FUN=mean)

# append cluster assignment
mydata <- data.frame(mydata, cluster = fit$cluster)

# Cluster Plot against 1st 2 principal components - vary parameters for most readable graph
clusplot(mydata, fit$cluster, color=TRUE, shade=TRUE, labels=0, lines=0) # Q2

# Centroid Plot against 1st 2 discriminant functions
plotcluster(mydata, fit$cluster)

Ma question est, comment le graphique qui montre le nombre de clusters (marqué Q1dans mon code) peut-il être lié aux valeurs réelles (numéro de cluster et nom de variable)?

Mise à jour: je comprends maintenant que la clusplot()fonction est un tracé bivarié, avec PCA1 et PCA2. Cependant, je ne comprends pas le lien entre les composants PCA et les groupes de clusters. Quelle est la relation entre les valeurs PCA et les groupes de clustering? J'ai lu ailleurs sur le lien entre kmeans et PCA, mais je ne comprends toujours pas comment ils peuvent être affichés sur le même graphique bivarié.

celenius
la source
excuses si j'ai posé trop de questions sur le clustering au cours des derniers jours. J'essaie de me familiariser rapidement avec ce domaine (j'ai également
posté
Ce n'est pas grave, ce n'est pas TCS.SE (-;
# Déterminer le nombre de clusters Pouvez-vous expliquer pourquoi nous utilisons cette formule (mydata, 2, var) et pourquoi 2:15?

Réponses:

8

Je n'ai pas complètement saisi la question 1, mais je vais tenter une réponse. Le tracé de Q1 montre comment la somme intérieure des carrés (wss) change à mesure que le numéro de cluster change. Dans ce type de graphique, vous devez rechercher les plis dans le graphique, un pli à 5 indique que c'est une bonne idée d'utiliser 5 clusters.

WSS a une relation avec vos variables dans le sens suivant, la formule pour WSS est

jxiCj||xiμj||2

μjjxiiCj

La réponse à la question 2 est la suivante. Ce que vous regardez réellement dans le clusplot()graphique, c'est l'intrigue de vos observations dans le plan principal. Cette fonction consiste à calculer le score de la composante principale pour chacune de vos observations, à tracer ces scores et à les colorier par grappe.

L'analyse en composantes principales (ACP) est une technique de réduction de dimension; il "résume" les informations de toutes les variables en deux "nouvelles" variables appelées composants. Chaque composante est responsable d'expliquer un certain pourcentage de la variabilité totale. Dans l'exemple, vous lisez "Ces deux composantes expliquent 73,95% de la variabilité totale".

La fonction clusplot()est utilisée pour identifier l'efficacité du clustering. Dans le cas où vous avez réussi un clustering, vous verrez que les clusters sont clairement séparés dans le plan principal. En revanche, vous verrez les clusters fusionnés dans le plan principal lorsque le clustering échoue.

Pour plus d'informations sur l'analyse des composants principaux, vous pouvez lire le wiki. si vous voulez un livre que je suggère Modern Multivariate Techniques by Izenmann, vous y trouverez PCA et k-means.

J'espère que cela t'aides :)

deps_stats
la source
1
Merci pour votre réponse. J'avais une autre question sur la clusplot()fonction. Quelle est la relation entre les valeurs PCA et les groupes de clustering? J'ai lu ailleurs sur le lien entre kmeans et PCA, mais je ne comprends toujours pas comment ils peuvent être affichés sur le même graphique bivarié. (Peut-être que cela devrait être une nouvelle question en soi).
celenius
2
En fait, les valeurs PCA et les groupes de clustering sont indépendants. PCA crée de "nouvelles" coordonnées pour chaque observation mydata, c'est ce que vous voyez réellement sur l'intrigue. La forme des points est tracée à l'aide fit$clusterdu deuxième paramètre de clusplot(). Vous devriez peut-être approfondir votre connaissance de l'ACP. Faites-moi savoir si cela vous a aidé ou si vous avez d'autres références.
deps_stats
1
Cela aide (dans le sens où je me concentre sur mon problème!). Quel est le fit$clusterlien avec les "coordonnées" PCA? Je pense que je comprends le fonctionnement de l'ACP, mais si je comprends bien, chaque composant ne peut pas être expliqué en utilisant des variables des données d'origine (c'est plutôt une combinaison linéaire des données brutes), c'est pourquoi je ne comprends pas comment il peut être liés aux clusters.
celenius
2
Vous avez presque compris :) fit$clustern'a aucun rapport avec PCA. Ce qui clusplot()fait est de tracer les points en utilisant les "nouvelles" coordonnées et de les étiqueter en utilisant fit$cluster. J'ai obtenu «+» pour le cluster 3, «o» pour le cluster 1 et un triangle pour le cluster 2. La fonction clusplot()est utile pour visualiser le clustering.
deps_stats
1
Par les "nouvelles" coordonnées, j'entends PCA1 et PCA2. Vous avez raison, ils n'ont aucun lien avec fit$cluster:)
deps_stats