K-means聚类分析案例(二)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了K-means聚类分析案例(二)相关的知识,希望对你有一定的参考价值。

参考技术A

之前的笔记:
聚类介绍: 点这里
层次聚类分析案例(一):世界银行样本数据集
层次聚类分析案例(二):亚马逊雨林烧毁情况
层次聚类分析案例(三):基因聚类
K-means聚类分析案例(一)

K-means聚类案例(二)食品

我们所吃的食物中的营养成分可以根据它们在构建身体构成的作用来分类。这些营养元素可分为宏量营养元素和微量元素。一些宏量营养元素包括碳水化合物、蛋白质、脂肪,一些微量元素的例子是维生素、矿物质和水。

准备工作

让我们从准备数据开始。

第1步:收集和描述数据

为了应用k均值聚类,我们使用采自不同食物种类的数据集进行实验,其中包含了每种食物各自的能量(Energy)、蛋白质(Protein)、脂肪(Fat)、钙(Calcium)、铁(Iron)等含量。 数据获取

其中数值型变量如下:
Energy
Protein
Fat
Calcium
Iron
非数值型变量如下:
Food

具体实施步骤
以下为实现细节。

第2步:探索数据

载入cluster()库。

探索数据并理解数据变量间的关系。从导入名为foodstuffs.txt的文本文件开始,将其保存在food.energycontent数据框中。

head()函数返回向量、矩阵、表、数据框或函数的首尾部分。将food.energycontent数据框传入head()函数:

结果如下:

str()函数返回food.energycontent数据框的结构信息。结果简洁地显示了其内部结构。

str(food.energycontent)

结果如下:

第3步:转换数据

apply()函数执行了数据框和矩阵中逐个元素的数据变换。它返回一个向量、数组、链表,其中的值是通过应用一个函数到一个数组或矩阵的边缘。其中2代表了函数要应用的列下标。sd是标准差函数,用于这个数据框。

结果如下:

sweep()函数返回一个数组,从一个输入数组中清除一些统计信息。food.energycontent[,-1]作为一个数组传入。其中2代表了函数要应用的列下标。standard.deviation是需要被清除的统计信息。

结果如下:

第4步:聚类

kmeans()函数施行k均值聚类到数据矩阵上。数据矩阵foodergycnt.stddev被当作一个对象传入,该对象是一个数值型矩阵。centers=5代表初始的簇中心数量。iter.max=100代表最大的迭代轮数。因为簇数量由一个数字指定,nstart=25定义了随机被指定的组数量。

结果如下:

指定4个中心簇:

结果如下:

输出4个簇的聚类向量,结果如下:

接下来,输出4个聚类方案的聚类以及食品标签。

lapply()函数返回一个与X同样长度的链表:

结果如下:

第5步:可视化聚类结果

使用pair()函数生成一个散点图矩阵。

food.energycontent[,-1]通过给定一个矩阵或数据框的数值来提供点的坐标。

结果如下:

princomp()函数在给定数值型数据矩阵上进行主成分分析。该函数产生了非旋转的主成分分析结果。cor=T代表一个逻辑值,指明了计算需要使用相关矩阵。

par()函数整合多个绘图结果到一个统一的图中。s产生一个正方形绘图区域。

par(pty="s")

绘制这个聚类:

结果如下:

K-means聚类分析案例(一)

参考技术A

之前的笔记:
聚类介绍: 点这里
层次聚类分析案例(一):世界银行样本数据集
层次聚类分析案例(二):亚马逊雨林烧毁情况
层次聚类分析案例(三):基因聚类

食品消费模式是医学和营养学领域关注的一大热点。食物消费与个人的整体健康、食物的营养价值、购买食品的经济性和消费环境有关。这项分析涉及25个欧洲国家肉类和其他食品之间的关系。观察肉类和其他食品的相关性是很有意思的。这些数据包括:红肉、白肉、蛋类、牛奶、鱼类、谷类、淀粉类食品、坚果(包括豆类和油籽)、水果和蔬菜。

准备工作

为了应用k均值聚类,我们使用欧洲25个国家的蛋白质消费量数据集。

第1步:收集和描述数据

该任务使用名为protein的数据集,该数据集以标准格式存储在CSV格式的文件中,其中包含25行数据和10个变量。 数据获取路径

数值型变量如下:
RedMeat
WhiteMeat
Eggs
Milk
Fish
Cereals
Starch
Nuts
Fr&Veg
非数值型变量如下:
Country
具体实施步骤
以下为实现细节。

第2步:探索数据

让我们探索数据并理解变量间的关系。从导入名为Europenaprotein.csv的CSV文件开始,将该数据保存到protein数据框:

head()函数返回了一个向量、矩阵、表、数据框或函数首或尾的部分。将protein数据框传入head()函数。

结果如下:

第3步:聚类

开始在三个簇的基础上进行聚类。为了在初始阶段产生随机的簇数量,调用set.seed()函数。set.seed()函数能够产生随机数。

kmeans()函数能够在数据矩阵上执行k均值聚类。protein数据矩阵被当作一个对象传入该函数,该对象必须是数值型矩阵。centers=3代表初始化簇中心数量。因为簇的数量由一个数字指定,nstart=10定义了随机被选择的中心数。

结果如下:

接下来,生成簇指派列表。order()函数返回一个序列,以升序或者降序重新生成它的第一个参数。groupMeat数据框被当作一个数据框对象传入:

调用data.frame()函数,显示了国家和这些国家所处的簇:

结果如下:

plot()函数是一个绘制R对象的通用函数。参数类型指明了要被显示的图的种类。xlim参数的意思是参数应该被给定范围的边界,而不是一个范围。xlab和ylab提供了x轴和y轴各自的标题:

结果如下:

第4步:改进模型

接下来,在所有9个蛋白质组上进行聚类,并且7个簇已经被创建了。在散点图上不同颜色的点代表了吃白肉和红肉的国家。地理上临近的国家倾向于分到同一组。

center=7代表初始的聚类中心数量:

7个不同的聚类形成了。25个国家都一一被分配到了某一个簇中。

结果如下:

clustplot()函数创造了一个二变量的图,其中可以看到数据的可视化划分。所有观测值使用主成分以点的方式表示。在每个簇周围绘制椭圆形。protein数据框被当作对象传入:

结果如下:

另一个层次化形式展现的方法如下。这里使用agnes()函数。通过设置diss=FALSE,不相似度矩阵被用来计算原始数据。metric="euclidean"表明使用欧氏距离进行计算:

结果如下:

plot()画出图形:按回车可查看下一章图,共两张图。

结果如下:

cutree()函数切割树到几个组中,通过设定期望的组数量或者切割的高度来进行划分:

结果如下:

结果如下:

以上是关于K-means聚类分析案例(二)的主要内容,如果未能解决你的问题,请参考以下文章

K-means聚类分析案例---电信客户细分

聚类算法(算法小结与案例分析)

机器学习k-means——航空用户聚类分析案例

k-means和iosdata聚类算法在生活案例中的运用

基于K-means聚类算法进行客户人群分析

k-means聚类分析 python 代码实现(不使用现成聚类库)