之前的笔记:
聚类介绍:点这里
层次聚类分析案例(一):世界银行样本数据集
层次聚类分析案例(二):亚马逊雨林烧毁情况
层次聚类分析案例(三):基因聚类
K-means聚类分析案例(一)
K-means聚类案例(二)食品
我们所吃的食物中的营养成分可以根据它们在构建身体构成的作用来分类。这些营养元素可分为宏量营养元素和微量元素。一些宏量营养元素包括碳水化合物、蛋白质、脂肪,一些微量元素的例子是维生素、矿物质和水。
准备工作
让我们从准备数据开始。
第1步:收集和描述数据
为了应用k均值聚类,我们使用采自不同食物种类的数据集进行实验,其中包含了每种食物各自的能量(Energy)、蛋白质(Protein)、脂肪(Fat)、钙(Calcium)、铁(Iron)等含量。数据获取
其中数值型变量如下:
Energy
Protein
Fat
Calcium
Iron
非数值型变量如下:
Food
具体实施步骤
以下为实现细节。
第2步:探索数据
载入cluster()库。
library(cluster)
探索数据并理解数据变量间的关系。从导入名为foodstuffs.txt的文本文件开始,将其保存在food.energycontent数据框中。
food.energycontent <- read.table("ClusteringAnalysis/Practical-Machine-Learning-Cookbook/Chapter03/Data/foodstuffs.txt",header = T)
head()函数返回向量、矩阵、表、数据框或函数的首尾部分。将food.energycontent数据框传入head()函数:
head(food.energycontent)
结果如下:
str()函数返回food.energycontent数据框的结构信息。结果简洁地显示了其内部结构。
str(food.energycontent)
结果如下:
第3步:转换数据
apply()函数执行了数据框和矩阵中逐个元素的数据变换。它返回一个向量、数组、链表,其中的值是通过应用一个函数到一个数组或矩阵的边缘。其中2代表了函数要应用的列下标。sd是标准差函数,用于这个数据框。
standard.deviation <- apply(food.energycontent[,-1], 2, sd)
standard.deviation
结果如下:
sweep()函数返回一个数组,从一个输入数组中清除一些统计信息。food.energycontent[,-1]作为一个数组传入。其中2代表了函数要应用的列下标。standard.deviation是需要被清除的统计信息。
foodergycnt.stddev <- sweep(food.energycontent[,-1], 2, standard.deviation, FUN = "/")
foodergycnt.stddev
结果如下:
第4步:聚类
kmeans()函数施行k均值聚类到数据矩阵上。数据矩阵foodergycnt.stddev被当作一个对象传入,该对象是一个数值型矩阵。centers=5代表初始的簇中心数量。iter.max=100代表最大的迭代轮数。因为簇数量由一个数字指定,nstart=25定义了随机被指定的组数量。
food.5cluster <- kmeans(foodergycnt.stddev, centers = 5, iter.max = 100, nstart = 25)
food.5cluster
结果如下:
指定4个中心簇:
food.4cluster <- kmeans(foodergycnt.stddev, centers = 4, iter.max = 100, nstart = 25)
food.4cluster
结果如下:
输出4个簇的聚类向量,结果如下:
> food.4cluster$cluster
[1] 4 1 4 4 1 1 1 1 4 4 4 4 4 1 1 1 2 2 1 1 1 3 1 3 3 1 1
接下来,输出4个聚类方案的聚类以及食品标签。
lapply()函数返回一个与X同样长度的链表:
food.4cluster.clust <- lapply(1:4, function(nc) food.energycontent$Food[food.4cluster$cluster==nc])
food.4cluster.clust
结果如下:
第5步:可视化聚类结果
使用pair()函数生成一个散点图矩阵。
food.energycontent[,-1]通过给定一个矩阵或数据框的数值来提供点的坐标。
pairs(food.energycontent[,-1], panel=function(x,y) text(x,y,food.4cluster$cluster))
结果如下:
princomp()函数在给定数值型数据矩阵上进行主成分分析。该函数产生了非旋转的主成分分析结果。cor=T代表一个逻辑值,指明了计算需要使用相关矩阵。
food.pc <- princomp(food.energycontent[,-1], cor = T)
my.color.vector <- rep("green", times=nrow(food.energycontent))
my.color.vector[food.4cluster$cluster==2] <- "blue"
my.color.vector[food.4cluster$cluster==3] <- "red"
my.color.vector[food.4cluster$cluster==4] <- "orange"
par()函数整合多个绘图结果到一个统一的图中。s产生一个正方形绘图区域。
par(pty="s")
绘制这个聚类:
plot(food.pc$scores[,1], food.pc$scores[,2],
ylim=range(food.pc$scores[,1]),
xlab="PC 1", ylab="PC 2", type = "n", lwd=2)
text(food.pc$scores[,1], food.pc$scores[,2], labels =food.energycontent$Food,cex=0.7, lwd=2, col = my.color.vector)
结果如下: