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 Q1
w 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.
źródło
Odpowiedzi:
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
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μj j xi i Cj
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 :)
źródło
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).mydata
, to jest to, co faktycznie widzisz na wykresie. Kształt punktów jest wykreślany za pomocąfit$cluster
drugiego parametruclusplot()
. Może powinieneś głębiej przyjrzeć się PCA. Daj mi znać, czy to ci pomogło, lub czy masz dalsze referencje.fit$cluster
zwią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.fit$cluster
nie jest związany z PCA. Coclusplot()
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. Funkcjaclusplot()
jest przydatna do wizualizacji klastrowania.fit$cluster
:)