Korzystanie z pakietu statystyk w R do grupowania kmeansów

10

Mam problem ze zrozumieniem jednego lub dwóch aspektów pakietu klastra. Dokładnie podążam za przykładem z Quick-R , ale nie rozumiem jednego lub dwóch aspektów analizy. Dołączyłem kod, którego używam w tym konkretnym przykładzie.

## 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")

Następnie standaryzuję zmienne:

# 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)

Moje pytanie brzmi: w jaki sposób wykres pokazujący liczbę klastrów (zaznaczonych Q1w moim kodzie) może być powiązany z rzeczywistymi wartościami (numer klastra i nazwa zmiennej)?

Aktualizacja: Teraz rozumiem, że clusplot()funkcja jest dwuwymiarowa, z PCA1 i PCA2. Nie rozumiem jednak związku między komponentami PCA i grupami klastrów. Jaki jest związek między wartościami PCA a grupami klastrowymi? Czytałem gdzie indziej o związku między kmeans a PCA, ale nadal nie rozumiem, jak można je wyświetlać na tym samym wykresie dwuwymiarowym.

celenius
źródło
przepraszam, że w ciągu ostatnich kilku dni zadałem zbyt wiele pytań dotyczących grupowania. Próbuję szybko lepiej zapoznać się z tym polem (również zamieściłem to pytanie na SO, stackoverflow.com/questions/4997870/…, ale sugerowano przeniesienie go tutaj)
celenius
W porządku, to nie jest TCS.SE (-;
# Określ liczbę klastrów Czy możesz wyjaśnić, dlaczego używamy tej formuły (mydata, 2, var) i dlaczego 2:15?

Odpowiedzi:

8

Nie do końca zrozumiałem pytanie 1, ale spróbuję odpowiedzieć. Wykres Q1 pokazuje, jak zmienia się suma kwadratów (wss) wraz ze zmianą liczby skupień. Na tego rodzaju wykresach należy szukać załamań na wykresie, załamanie na 5 oznacza, że ​​dobrym pomysłem jest użycie 5 skupień.

WSS ma związek z twoimi zmiennymi w następującym znaczeniu, wzór na WSS jest

jxiCj||xiμj||2

gdzie to średni punkt dla klastra a to obserwacja. Klaster j oznaczamy jako . WSS jest czasami interpretowany jako „jak podobne są punkty w każdym klastrze”. To podobieństwo dotyczy zmiennych. j x i i C jμjjxiiCj

Odpowiedź na pytanie 2 jest następująca. To, co tak naprawdę oglądasz, clusplot()to wykres twoich obserwacji w głównej płaszczyźnie. Ta funkcja wykonuje obliczanie wyniku głównego składnika dla każdej z twoich obserwacji, wykreślanie tych wyników i kolorowanie według skupień.

Analiza głównych składników (PCA) to technika redukcji wymiarów; „podsumowuje” informacje wszystkich zmiennych w kilka „nowych” zmiennych zwanych składnikami. Każdy składnik odpowiada za wyjaśnienie pewnego odsetka całkowitej zmienności. W przykładzie czytałeś „Te dwa składniki wyjaśniają 73,95% całkowitej zmienności”.

Funkcja clusplot()służy do identyfikacji skuteczności klastrowania. Jeśli masz udane grupowanie, zobaczysz, że klastry są wyraźnie oddzielone w płaszczyźnie głównej. Z drugiej strony zobaczysz, że klastry zostały scalone w płaszczyźnie głównej, gdy klastrowanie się nie powiedzie.

Więcej informacji na temat analizy głównych składników można znaleźć na wiki. jeśli chcesz książkę, sugeruję Nowoczesne techniki wielowymiarowe Izenmanna, tam znajdziesz PCA i k-średnich.

Mam nadzieję że to pomoże :)

deps_stats
źródło
1
Dziękuję za Twoją odpowiedź. Miałem jeszcze jedno pytanie dotyczące clusplot()funkcji. Jaki jest związek między wartościami PCA a grupami klastrowymi? Czytałem gdzie indziej o związku między kmeans a PCA, ale nadal nie rozumiem, jak można je wyświetlać na tym samym wykresie dwuwymiarowym. (Być może powinno to być nowe pytanie samo w sobie).
celenius
2
W rzeczywistości wartości PCA i grupy klastrowe są niezależne. PCA tworzy „nowe” współrzędne dla każdej obserwacji w mydata, to jest to, co faktycznie widzisz na wykresie. Kształt punktów jest wykreślany za pomocą fit$clusterdrugiego parametru clusplot(). Może powinieneś głębiej przyjrzeć się PCA. Daj mi znać, czy to ci pomogło, lub czy masz dalsze referencje.
deps_stats
1
Pomaga (w tym sensie, że dopracowuję mój problem!). Jaki jest fit$clusterzwiązek z „współrzędnymi” PCA? Wydaje mi się, że rozumiem, jak działa PCA, ale jak rozumiem, nie można wyjaśnić każdego komponentu za pomocą zmiennych z oryginalnych danych (raczej jest to liniowa kombinacja surowych danych), dlatego nie rozumiem, jak to może być związane z klastrami.
celenius
2
Prawie go masz :) fit$clusternie jest związany z PCA. Co clusplot()polega na wykreśleniu punktów za pomocą „nowych” współrzędnych i oznaczeniu ich za pomocą fit$cluster. Mam „+” dla klastra 3, „o” dla klastra 1 i trójkąt dla klastra 2. Funkcja clusplot()jest przydatna do wizualizacji klastrowania.
deps_stats
1
Przez „nowe” współrzędne rozumiem PCA1 i PCA2. Masz rację, są one całkowicie niezwiązane z fit$cluster:)
deps_stats