手把手教你R语言做k均值聚类分析

今天聊聊k均值聚类分析,我们先要知道什么是类,在大数据时代,我们每个人都被打上很多个性标签,比如:宅男,月光族,手机控,非主流等等,每个标签都可以算是一个类,因此,可以不严谨的说:类是一些有特殊属性个体的集合。而聚类分析的目的,就是要把这些个人找出来并区别出来,聚类分析属于无监督机器学习的一个重要内容,今天我们来聊聊K均值聚类分析,那么k均值聚类分析和之前的层级聚类分析有什么不同呢?
K-Means算法是发展最成熟且原理简单、算法流程清晰,经典算法的步骤描述,分为如下5步完成。
①随机选取K个样本作为n个样本点类中心center_K;
②计算各样本点plot (x[i], y[i])与各类中心cen⁃ter_K的距离;
③将各样本归于最近的类中心点;
④求各类的样本的均值,作为新的类的中心center_K_new;
⑤判定:若类中心不再发生变动或达到迭代次数,算法结束,否则回到第②步。

如图下图所示: 在图中一共有a至e这5个数据以及2个随机的质心点(灰色点)。图
3(a)为算法经过初始化后的状态, 图3(b)和图3(d)是两个更新过程, 图3©和图3(e)是两个更新后的状态。经过2轮更新该算法达到稳定如图3(e)所示。
在这里插入图片描述
我们继续使用之前的肉类数据(关注公众号回复:肉类数据可以获得该数据)来进行k均值聚类分析,需要factoextra,dplyr,pacman,cluster包,需要事先下载好,我们先导入数据和包

library(factoextra)
library(dplyr)
library(pacman)
library(cluster)
bc<-read.csv("E:/r/test/roulei.csv",sep=',',header=TRUE)
names(bc)

在这里插入图片描述
数据有5个参数,energy代表食物能量(卡路里),protein蛋白质,fat脂肪,calcium钙含量,iron铁含量,竖排是各种肉的名字,我就不一一解释了。
在这里插入图片描述
数据的变量差别很大,我们首先要把数据标准化,然后计算欧式距离

bc.scaled<-scale(bc[2:6])##标准化数据
d<-dist(bc.scaled)###计算欧氏距离

在这里插入图片描述
在K均值聚类分析中, K的个数(即分成几类)这个参数非常重要,我们先用NbClust的投票功能来看看
在这里插入图片描述
这里显示2,3类都有4次投票,即分层2类和3类都是可以的。
我们还可以使用cluster函数做增强k均值聚类分析,可以自己聚类,自动分类,在这里函数倾向于分成2类

km <- eclust(bc[2:6], "kmeans", nstart = 25) #聚类的散点图

在这里插入图片描述
也可以通过fviz_gap_stat函数来投票

fviz_gap_stat(km$gap_stat) # 不同K值下Gap 统计图,指导选择最佳K值
fviz_silhouette(km) # 轮廓图,每种聚类下面的分布情况

在这里插入图片描述
函数fviz_gap_stat也倾向分成2类
在这里插入图片描述
在这里插入图片描述
那么问题来了,我们到底应该分成2类还是3类呢,我们可以根据我们的临床需要进行判断,我们可以先把图都做出来比较一下
2类的

set.seed(666)
kmeans1<-kmeans(bc.scaled,centers=2,nstart = 25)
fviz_cluster(object=kmeans1,data=bc[2:6],
             ellipse.type = "euclid",star.plot=T,repel=T,
             geom = ("point"),palette='jco',main="",
             ggtheme=theme_minimal())+
  theme(axis.title = element_blank())

在这里插入图片描述
3类的

kmeans1<-kmeans(bc.scaled,centers=3,nstart = 25)
fviz_cluster(object=kmeans1,data=bc[2:6],
             ellipse.type = "euclid",star.plot=T,repel=T,
             geom = ("point"),palette='jco',main="",
             ggtheme=theme_minimal())+
  theme(axis.title = element_blank())

在这里插入图片描述

我们可以见到,分成3类后的第1类(红色箭头部分)虽然数据很少,但是离第3类还是很远的,我个人觉得不应该被归入第一类(个人看法),我们就先按3类来分看看。

summary(kmeans1)
kmeans1$cluster
kmeans1$size

在这里插入图片描述
上图可以看到,各种肉类被分进了组,第一组2种,第二组9种,第三组16种
我们把数据集整理一下,如下图,数据被我们分类整理了

aaa <- data.frame(bc[2:6], kmeans1$cluster)
aaa<-arrange(aaa,kmeans1.cluster)

在这里插入图片描述
我们对每组的数据进行平均值统计

by_fenzu<-group_by(aaa,kmeans1.cluster)
summarize(by_fenzu,energy=mean(energy),protein=mean(protein),
          fat=mean(fat),calcium=mean(calcium),iron=mean(iron))

在这里插入图片描述
由上图我们可以得出每组数据的各类指标平均数,因此我们可知,第一种肉类含能量少,蛋白质少,脂肪少,属于没有什么营养的肉类。第二种肉类:能量很多,脂肪也很多,可以参考为油炸的高脂肪垃圾食品。第三种为:低热量,高蛋白质,低脂肪,并且富含钙的肉类,比较适合我们中国人的饮食理念和习惯。这样得出的结论可以在饮食上给出建议。
我们还可以得出每组指标的密度分布情况:
先对数据分组

Data1 <- aaa[which(aaa$kmeans1.cluster == 1), ]
Data2 <- aaa[which(aaa$kmeans1.cluster == 2), ]
Data3 <- aaa[which(aaa$kmeans1.cluster == 3), ]

做能量的分布曲线

par(mfrow = c(1,3))
plot(density(Data1[, 1]), col = "red", main = "1.energy")
plot(density(Data2[, 1]), col = "red", main = "2.energy")
plot(density(Data3[, 1]), col = "red", main = "3.energy")

在这里插入图片描述
脂肪的分布曲线

par(mfrow = c(1,3))
plot(density(Data1[, 3]), col = "red", main = "1.fat")
plot(density(Data2[, 3]), col = "red", main = "2.fat")
plot(density(Data3[, 3]), col = "red", main = "3.fat")

在这里插入图片描述
其他的指标也可以同理做出来,这里就不一一演示了
我们还可以通过散点图矩阵,将每组的数据关系表示出来,并且以不同颜色区分

pairs(energy~protein+fat+calcium,data = aaa,pch = 21,
      bg = c("red", "green3", "blue")[unclass(aaa$kmeans1.cluster)])

在这里插入图片描述
.更多精彩文章请关注公众号:零基础说科研
在这里插入图片描述

  • 31
    点赞
  • 199
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
R语言中,kmeans聚类分析是一种常用的聚类算法。该算法的步骤大致分为以下几个步骤: 1. 随机选取K个样本作为初始的聚类中心。 2. 计算每个样本点与聚类中心的距离,并将样本点归类到距离最近的聚类中心。 3. 根据每个聚类的样本点,计算新的聚类中心。 4. 重复第二步和第三步,直到聚类中心不再变化或达到设定的迭代次数。 这样,通过kmeans聚类算法,可以将数据集划分为K个不同的聚类,并且每个聚类中的样本点在特征空间上相似度较高,而不同聚类之间的样本点相似度较低。 在R语言中,可以使用kmeans函数来进行kmeans聚类分析。具体的步骤包括: 1. 选择需要进行聚类分析的数据集。 2. 使用kmeans函数,并设置参数K的值,即要分成的聚类数目。 3. 获取聚类结果,包括每个样本点的类别以及每个聚类的聚类中心。 通过这样的分析,可以得到每个样本点所属的聚类类别,并且可以进一步分析不同聚类之间的关系和特征。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [7.3kmeans聚类分析07.mp4](https://download.csdn.net/download/yanyipqng1970/12662362)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [手把手R语言k均值聚类分析](https://blog.csdn.net/dege857/article/details/117549716)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天桥下的卖艺者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值