美文网首页生信笔记绘图收藏
K-means聚类分析案例(一)

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

作者: 11的雾 | 来源:发表于2019-11-16 08:23 被阅读0次

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

    案例一:K-means聚类,欧洲各国蛋白质消耗量

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

    准备工作

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

    第1步:收集和描述数据

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

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

    第2步:探索数据

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

    protein = read.csv("ClusteringAnalysis/Practical-Machine-Learning-Cookbook/Chapter03/Data/Europenaprotein.csv",header = T)
    

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

    head(protein)
    

    结果如下:

    image.png

    第3步:聚类

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

    set.seed(123456789)
    

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

    groupMeat <- kmeans(protein[,c("WhiteMeat","RedMeat")], centers = 3,nstart = 10)
    groupMeat
    

    结果如下:

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

    o = order(groupMeat$cluster)
    

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

    data.frame(protein$Country[o],groupMeat$cluster[o])
    

    结果如下:

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

    plot(protein$RedMeat,protein$WhiteMeat, type="n", xlim=c(3,19), xlab="Red Meat",ylab="White Meat")
    text(x=protein$RedMeat,y=protein$WhiteMeat, labels = protein$Country,col=groupMeat$cluster+1)
    

    结果如下:

    第4步:改进模型

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

    set.seed()函数产生随机数:
    set.seed(123456789)
    

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

    groupProtein <- kmeans(protein[,-1], centers = 7, nstart = 10)
    o=order(groupProtein$cluster)
    data.frame(protein$Country[o], groupProtein$cluster[o])
    

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

    结果如下:

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

    clusplot(protein[,-1], groupProtein$cluster, main='2D representation of the Cluster solution',
         color=TRUE, shade = TRUE, labels = 2, lines = 0)
    

    结果如下:

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

    foodagg= agnes(protein, diss=FALSE,metric="euclidean")
    foodagg
    

    结果如下:

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

    > plot(foodagg, main='Dendrogram')
    Hit <Return> to see next plot:
    Hit <Return> to see next plot:
    

    结果如下:

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

    groups <- cutree(foodagg, k=4)
    groups
    

    结果如下:

    > groups
    
    [1] 1 2 2 1 2 3 2 3 3 2 2 3 2 3 3 2 2 4 2 3 3 3 4 3 4
    
    rect.hclust(foodagg, k=4,border="red")
    

    结果如下:

    相关文章

      网友评论

        本文标题:K-means聚类分析案例(一)

        本文链接:https://www.haomeiwen.com/subject/leweictx.html