Використання пакету статистики в R для кластеризації kmeans


10

Мені важко зрозуміти один або два аспекти пакета кластерів. Я уважно слідкую за прикладом Quick-R , але не розумію одного чи двох аспектів аналізу. Я включив код, який я використовую для цього конкретного прикладу.

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

Потім я стандартизую змінні:

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

Моє запитання полягає в тому, як графік, який показує кількість кластерів (позначений Q1у моєму коді), може бути пов'язаний з фактичними значеннями (номер кластера та назва змінної)?

Оновлення: Тепер я розумію, що clusplot()функція - це двовимірний графік, з PCA1 та PCA2. Однак я не розумію зв'язку між компонентами PCA та групами кластерів. Який взаємозв'язок між значеннями PCA та групами кластеризації? Я читав деінде про зв’язок між kmeans і PCA, але все ще не розумію, як вони можуть відображатися на тому ж двовимірному графіку.


вибачте, якщо я задав занадто багато питань щодо кластеризації за останні кілька днів. Я намагаюся швидше ознайомитися з цим полем (також я опублікував це питання на SO, stackoverflow.com/questions/4997870/…, але було запропоновано перенести його сюди)
celenius

Це нормально, це не TCS.SE (-;

# Визначте кількість кластерів. Чи можете ви пояснити, чому ми використовуємо цю формулу (mydata, 2, var) та чому 2:15?

Відповіді:


8

Я не зрозумів питання 1 повністю, але спробую відповісти. Графік Q1 показує, як змінюється внутрішня сума квадратів (wss) у міру зміни числа кластера. У такому вигляді сюжетів ви повинні шукати перегини у графіку, перегин у 5 вказує на те, що добре використовувати 5 кластерів.

WSS має зв'язок з вашими змінними в наступному сенсі, формула для WSS є

jxiCj||xiμj||2

де - середня точка для кластера а - -е спостереження. Позначимо кластер j як . Іноді WSS інтерпретується як "наскільки схожі точки всередині кожного кластеру". Ця схожість відноситься до змінних.μjjхiiСj

Відповідь на питання 2 така. Те, що ви насправді спостерігаєте, clusplot()- це сюжет ваших спостережень у головній площині. Ця функція виконує підрахунок балу основного компонента для кожного з ваших спостережень, складання цих балів та розфарбовування за кластером.

Аналіз основних компонентів (PCA) - це техніка зменшення розмірів; він "узагальнює" інформацію всіх змінних у пару "нових" змінних, що називаються компонентами. Кожен компонент відповідає за пояснення певного відсотка від загальної мінливості. У прикладі, який ви читаєте, "Ці два компоненти пояснюють 73,95% від загальної мінливості".

Функція clusplot()використовується для виявлення ефективності кластеризації. У разі успішного кластеризації ви побачите, що кластери чітко відокремлені в головній площині. З іншого боку, ви побачите кластери, злиті в основній площині, коли кластеринг не вдається.

Для подальшого посилання на аналіз основних компонентів ви можете прочитати вікі. якщо ви хочете книжку, я пропоную сучасні багатоваріантні методики Ізенмана, там ви знайдете PCA та k-засоби.

Сподіваюся, це допомагає :)


1
Спасибі за вашу відповідь. У мене було ще одне питання щодо clusplot()функції. Який взаємозв'язок між значеннями PCA та групами кластеризації? Я читав деінде про зв’язок між kmeans і PCA, але все ще не розумію, як вони можуть відображатися на тому ж двовимірному графіку. (Можливо, це саме по собі має бути новим питанням).
знаменитий

2
Насправді значення PCA та групи кластеризації є незалежними. PCA створює "нові" координати для кожного спостереження mydata, тобто те, що ви насправді бачите на графіку. Форма точок побудована за fit$clusterдопомогою другого параметра clusplot(). Можливо, вам слід глибше заглянути в PCA. Повідомте мене, чи допомогло це вам, чи ви надалі посилаєтесь.
deps_stats

1
Це допомагає (у тому сенсі, що я налагоджую свою проблему!). Як fit$clusterпов’язані "координати" PCA? Я думаю, я розумію, як працює PCA, але, як я розумію, кожен компонент не може бути пояснений за допомогою змінних вихідних даних (скоріше це лінійна комбінація вихідних даних), тому я не розумію, як це може бути пов'язані з кластерами.
селеній

2
Ви майже отримали це :) fit$clusterне має відношення до PCA. Що clusplot()робити - це побудувати точки за допомогою "нових" координат та позначити їх за допомогою fit$cluster. Я отримав "+" для кластера 3, "o" для кластера 1 і трикутник для кластера 2. Функція clusplot()корисна для візуалізації кластеризації.
deps_stats

1
Під "новими" координатами я маю на увазі PCA1 і PCA2. Ви маєте рацію, вони абсолютно не пов'язані з fit$cluster:)
deps_stats
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.