在R中使用stats包进行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/

没关系,这不是TCS.SE(-;

#确定簇数您能解释为什么我们使用这个公式(mydata,2,var)以及为什么2:15吗?

Answers:


8

我没有完全理解问题1,但是我将尝试回答。Q1的图显示了群集数的平方内平方和(wss)如何变化。在这种图中,您必须寻找图中的扭结,扭结点为5表示使用5个聚类是个好主意。

WSS在以下意义上与您的变量有关系,WSS的公式为

ĴX一世CĴ||X一世-μĴ||2

其中是聚类的均值,是第个观测值。我们将群集j表示为。WSS有时被解释为“每个聚类中的点有多相似”。这种相似性是指变量。 Ĵ X Ç ĴμĴĴX一世一世CĴ

问题2的答案是这样。您实际观察到的 clusplot()是您在主平面上观察到的图。该功能正在执行的是计算每个观察值的主成分分数,绘制这些分数并按聚类着色。

主成分分析(PCA)是一种降维技术。它将所有变量的信息“汇总”为几个称为组件的“新”变量。每个组件负责解释总可变性的一定百分比。在示例中,您阅读了“这两个成分说明了总变异性的73.95%”。

该功能clusplot()用于识别聚类的有效性。如果成功建立了集群,您将看到集群在主平面中明显分开。另一方面,当群集不成功时,您将看到群集在主平面中合并。

有关主成分分析的更多参考,您可以阅读Wiki。如果您想要一本书,我建议Izenmann撰写的Modern Multivariate Techniques,在那里您会找到PCA和k-means。

希望这可以帮助 :)


1
谢谢您的回答。我对该clusplot()功能还有另一个问题。PCA值和聚类组之间是什么关系?我在其他地方已经读过kmeans和PCA之间的联系,但是我仍然不明白如何将它们显示在同一双变量图上。(也许这本身应该是一个新问题)。
celenius

2
实际上,PCA值和聚类组是独立的。PCA为中的每个观测创建“新”坐标mydata,这就是您在图上实际看到的坐标。使用fit$cluster的第二个参数绘制点的形状clusplot()。也许您应该更深入地了解PCA。让我知道这是否对您有帮助,或者您是否提供其他参考。
deps_stats 2011年

1
它会有所帮助(就我而言,我正在研究自己的问题!)。如何fit$cluster与PCA“坐标”?我想我了解PCA的工作原理,但是据我了解,不能使用原始数据中的变量来解释每个组件(而是它是原始数据的线性组合),这就是为什么我不理解它的原因与集群有关。
celenius

2
您几乎明白了:) fit$cluster与PCA无关。要做的clusplot()是使用“新”坐标绘制点并使用标记它们fit$cluster。对于群集3,我得到了“ +”,对于群集1,我得到了“ o”,对于群集2,我得到了一个三角形。此函数clusplot()对于可视化群集很有用。
deps_stats 2011年

1
“新”坐标是指PCA1和PCA2。没错,它们与以下内容完全无关fit$cluster:)
deps_stats 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.