今天给大家分享一个聚类分析的实际操作,所用的数据集也是非常有名和常见的鸢尾花数据集。
第一步:导入数据
这个数据本来就是R base自带的,所以可以直接用,我们直接可以str(iris)查看数据结构:
可以看到,数据有5个变量,150个观测。为了分析方便我们将数据集重命名为iris_df:iris_df <- iris,当然这一步你可以省略。
删除数据集的类别变量
为什么要删掉呢?因为我要做的是聚类,一种非监督的学习方法,目的就是让数据集根据内部特征相似性自成3类,所以就应该将原先数据集的标签删掉。
当然了,从数据集中删掉后,我会把它存为一个另外的向量,好评价聚类的好坏。
species <- as.list(iris_df$Species)
species <- unlist(species)
iris_df <- iris_df[,1:4]
iris_df
大家可以看到,通过运行上面的代码,我们得到的新的数据集就只剩下4个变量了。
运行K-means聚类
此时我就开始对数据集运行聚类分析,我会将类设置为3,应为原来的数据集就是3类。
irisCluster <- kmeans(iris_df,3,nstart = 20)
irisCluster
运行后聚类分析结果如下:
我们可以从结果中看到,聚类结果3类的样本量分类是:38,62,50。我么知道本来鸢尾花数据集应该是50,50,50三类的。聚类结果和原先真实结果是有差异的,这也不奇怪。
另外我们用
table(irisCluster$cluster)
irisCluster$centers
可以分别得到,聚类的类别大小和每一类的变量中心。
作图
聚类好后,我们可以直观的展示类别。首先得将聚类结果中的类别转化为因子,然后作图时将col参数值设置为该因子即可:
irisCluster$cluster <- as.factor(irisCluster$cluster)
plot(iris_df[,3:4],col=irisCluster$cluster)
将聚类结果和原始类别进行比较
要比较我们的聚类的结果和原始的结果,也很简单,直接做一个交叉表格就好:
table(irisCluster$cluster, iris$Species)
从上面这个交叉表格可以看出来,我们聚类的3类代表setosa这个花,2类代表versicolor这个花,1类代表virginica这个花。
将聚类结果添加到原始数据集中
我们可以通过图或者交叉表格对我们的聚类结果进行评价,如果你觉得聚类的结果还不错,这个时候你就可以给每一个观测打上一个类别标签了。
iris.cluster = cbind(iris_df, irisCluster[1])
iris.cluster
因为我们的聚类结果irisCluster中的第一个结果就是观测的类别所以上面的代码写成了iris.cluster = cbind(iris_df, irisCluster[1])
当然你也可以写成iris.cluster = cbind(iris_df, irisCluster$cluster),一样得出同样的结果。
此时,我们就做完了整个的聚类过程,当然你可以举一反三,像对于没有标签的数据我们都可以先使用非监督的方式进行聚类,然后根据聚类结果给原始数据集打上标签,这个时候我们就可以利用数据训练分类模型了。
小结
今天给大家写了一个聚类的例子,重要的是希望大家掌握对非标签数据建立分类模型的思想。感谢大家耐心看完。发表这些东西的主要目的就是督促自己,希望大家关注评论指出不足,一起进步。内容我都会写的很细,用到的数据集也会在原文中给出链接,你只要按照文章中的代码自己也可以做出一样的结果,一个目的就是零基础也能懂,因为自己就是什么基础没有从零学Python和R的,加油。
(站外链接发不了,请关注后私信回复“数据链接”获取本头条号所有使用数据)
往期内容: