之前的笔记:
聚类介绍: 点这里
层次聚类分析案例(一):世界银行样本数据集
层次聚类分析案例(二):亚马逊雨林烧毁情况
层次聚类分析案例(三):基因聚类
K-means聚类分析案例(一)
K-means聚类案例(二)食品
我们所吃的食物中的营养成分可以根据它们在构建身体构成的作用来分类。这些营养元素可分为宏量营养元素和微量元素。一些宏量营养元素包括碳水化合物、蛋白质、脂肪,一些微量元素的例子是维生素、矿物质和水。
准备工作
让我们从准备数据开始。
第1步:收集和描述数据
为了应用k均值聚类,我们使用采自不同食物种类的数据集进行实验,其中包含了每种食物各自的能量(Energy)、蛋白质(Protein)、脂肪(Fat)、钙(Calcium)、铁(Iron)等含量。 数据获取
其中数值型变量如下:
Energy
Protein
Fat
Calcium
Iron
非数值型变量如下:
Food
具体实施步骤
以下为实现细节。
第2步:探索数据
载入cluster()库。
探索数据并理解数据变量间的关系。从导入名为foodstuffstxt的文本文件开始,将其保存在foodenergycontent数据框中。
head()函数返回向量、矩阵、表、数据框或函数的首尾部分。将foodenergycontent数据框传入head()函数:
结果如下:
str()函数返回foodenergycontent数据框的结构信息。结果简洁地显示了其内部结构。
str(foodenergycontent)
结果如下:
第3步:转换数据
apply()函数执行了数据框和矩阵中逐个元素的数据变换。它返回一个向量、数组、链表,其中的值是通过应用一个函数到一个数组或矩阵的边缘。其中2代表了函数要应用的列下标。sd是标准差函数,用于这个数据框。
结果如下:
sweep()函数返回一个数组,从一个输入数组中清除一些统计信息。foodenergycontent[,-1]作为一个数组传入。其中2代表了函数要应用的列下标。standarddeviation是需要被清除的统计信息。
结果如下:
第4步:聚类
kmeans()函数施行k均值聚类到数据矩阵上。数据矩阵foodergycntstddev被当作一个对象传入,该对象是一个数值型矩阵。centers=5代表初始的簇中心数量。itermax=100代表最大的迭代轮数。因为簇数量由一个数字指定,nstart=25定义了随机被指定的组数量。
结果如下:
指定4个中心簇:
结果如下:
输出4个簇的聚类向量,结果如下:
接下来,输出4个聚类方案的聚类以及食品标签。
lapply()函数返回一个与X同样长度的链表:
结果如下:
第5步:可视化聚类结果
使用pair()函数生成一个散点图矩阵。
foodenergycontent[,-1]通过给定一个矩阵或数据框的数值来提供点的坐标。
结果如下:
princomp()函数在给定数值型数据矩阵上进行主成分分析。该函数产生了非旋转的主成分分析结果。cor=T代表一个逻辑值,指明了计算需要使用相关矩阵。
par()函数整合多个绘图结果到一个统一的图中。s产生一个正方形绘图区域。
par(pty="s")
绘制这个聚类:
结果如下:
将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类。由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异。分类:指从数据中归纳出一种做判断的模型,对于新的数据,通过这个模型,可以给出对应的标签。(如垃圾邮件过滤,带“推销房子”词语的标注为垃圾邮件,通过训练,再有带“推销房子”词语的邮件,就判断为垃圾邮件)
聚类:将数据划分成不同区间,但是具体怎么划分的事先并不清楚,只知道每个区间内的数据具有一定的相似度,在最终结论出来之前不知道哪一类有什么特点,新数据出现时候判断与哪一类数据相似度最高,就把它归到哪一类。简单说就是把相似的东西聚在一起,而不关心这一类是什么。
K-均值算法是一种聚类算法,将对象集划分为K个簇,把数据点到原型的某种距离作为优化的目标函数(原型可以理解为簇中心,最能代表簇特征的点)
不同中心点会得到不同的聚类结果,有时会出现局部最优的情况
显而易见,通常我们不希望出现局部最优的情况,解决该问题的关键在于中心点初始化。
这里的损失函数是所有数据点到所属簇中心点的距离的平方和
吴恩达机器学习课程里还提到另外一种中心点选择方法——在数据集中随机找K个数据点作为初始中心点
随机生成N个点
用echart显示点
距离度量(二维点的欧式距离)
k-means算法简单易于实现,但当数据点数量级较大时候,效率比较低。
二维坐标点的横纵坐标代表对象的两个特征,当对象多个特征使用K-means算法,距离度量公式应该不一样??
用r语言实现对6个样品19,21,25,8,11,13的k均值法聚类用kmeans函数即可:
a=c(19,21,25,8,11,13);kmeans(a,2)
k=2的分类效果
其中输出结果为,19,21,25为类别1,均值为2166667;8,11,13则为类别2均值为1066667;
因为数据只有一维,再加点可视化:
红点类均值,黑点样本值,横坐标类别
a=c(19,21,25,8,11,13);
km=kmeans(a,2);
plot(km$cluster,a);
lines(km$cluster,km$centers[km$cluster],col='red',type='p');
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)