大数据分析 - K-Means聚类

k-means聚类旨在将n个观测值划分为k个聚类,其中每个观测值属于具有最近均值的聚类,作为聚类的原型.这导致数据空间划分为Voronoi单元格.

给定一组观察(x 1 ,x 2 ,...,x n ),其中每个观测值是d维实数向量,k均值聚类旨在将n个观测值划分为k个群组 G = { G 1 ,G 2 ,...,G k } 以便最小化聚类内的平方和(WCSS)定义如下 :

$$ argmin \:\ _sum_ {i = 1} ^ {k} \sum_ {x \in S_ {i}} \ parallel x  -  \mu_ {i} \ parallel ^ 2 $$

后面的公式显示了最小化的目标函数,以便在k-means聚类中找到最优原型.公式的直觉是我们希望找到彼此不同的组,每个组的每个成员应该与每个集群的其他成员相似.

以下示例演示如何在R中运行k-means聚类算法.

library(ggplot2)
# Prepare Data 
data = mtcars  

# We need to scale the data to have zero mean and unit variance 
data <- scale(data)  

# Determine number of clusters 
wss <- (nrow(data)-1)*sum(apply(data,2,var)) 
for (i in 2:dim(data)[2]) { 
   wss[i] <- sum(kmeans(data, centers = i)$withinss) 
}  

# Plot the clusters 
plot(1:dim(data)[2], wss, type = "b", xlab = "Number of Clusters", 
   ylab = "Within groups sum of squares")

为了找到K的良好值,我们可以绘制不同K值的正方形组的平方和.该度量n随着更多组的加入,我们想要找到一个点,其中组内平方和的减少开始缓慢减少.在图中,该值最好由K = 6表示.

Number Cluster

现在已经定义了K的值,需要运行具有该值的算法.

# K-Means Cluster Analysis
fit <- kmeans(data, 5) # 5 cluster solution 

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

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