前言
- 建模的过程一向是枯燥乏味的,今天就让我们用R语言中丰富的可视化工具,自己搭建一个网站,实现聚类算法的可视化。源码已上传至我的资源空间,感兴趣的朋友可以在这里查看,一起学习、一起提高。网站效果如下:
上传数据
- 首先我们需要上传一份数据用于聚类分析,数据要求为csv格式,其中每一行代表一个样本;第一列为id列,标注每个样本的名称;其余列为样本在各维度下的观测值。
- 点击左侧导航栏中的
查找 按钮就可以选择上传的文件,上传成功后导航栏中会显示上传的文件名,切换到主数据页面就可以查看到我们上传的数据了。
- 这里我们上传了R语言的一份系统数据集
iris ,这是一份已知分类的关于鸢尾花花瓣与花萼长款的数据集,这里我们要求数据集的每一行为一个单独的样本,id 列的值不能重复,所以网站会自动把id 列中鸢尾花的类别修改为类别 + _No. + 数字标号 的形式。
使用k-means探索聚类分组数目
- 假设我们不知道鸢尾花的分类情况,我们需要探索将鸢尾花数据集分为几个类别最合适。这里我们就可以通过动态聚类法,快速查看该数据集被分为n类时的分类效果。
- 进入
k均值法 页面,我们可以通过调节右侧聚类控制 面板中的选项非常便捷的修改聚类参数。
- 在中间展示面板的
主图 子面板中,我们调用了R语言的扩展包展示出了当分组数目为2-10之间时的聚类效果。左边类似热力图的图表实际上是一张分类效果图,横轴为每个样本的编号,纵轴为分组数目,同种颜色为一个组别,主要展示了在分组数目确定的情况下哪些样本被分到了同一组。右边的点线图展示了Calinsky criterion (即方差比准则)随着分组数目的变化,由于方差比是组间距离与组内距离按照分组数目加权后的比值,所以理论上方差比越大分组效果越好,这幅图中呈现的是:为了达到最好的分组效果,我们应该将数据集分为两个组别,其次为三个组别。
使用层次聚类
- 已知分组效果最好时应该分两个组别,我们可以切换到
层次聚类 面板,选用合适的聚类算法与连接方法,设定分组数目为2,点击确定即可以完成层次聚类。
- 在中间展示面板的
主图 子面板中,悬浮在上面的是一幅聚类树状图,展示了每个样本如何被两两聚合直至同一类。绿色方框中是按照我们设定的分组数目截取的子分支。红色方框可以使树状图局部放大,通过控制子分支高度 与子分支组别 我们可以调节红框的大小以及所在的位置,红框内放大后的子分支会被展示在主图 面板的整副画布中,局部放大后树状图的标签即数据集的id列。
查看层次聚类效果
- 每次我们作完聚类模型,都可以在相应面板中的
误差图 子面板中查看聚类效果。误差图中,每条线代表一个样本,每种颜色代表一个组别,横轴为数据集用于聚类的每个维度(这里为鸢尾花的花瓣、花萼长宽),纵轴为每个样本在相应维度的取值。
- 在这幅误差图中,我们可以看出:红色与淡蓝色包含的样本数为1:2,且两者在花瓣长宽两个维度上泾渭分明,而在其它两个维度上,由于样本的取值比较分散、没有呈现出阶层性,所以不太容易作区分。这与我们所知的信息十分吻合:鸢尾花数据集中
setosa 亚种的鸢尾花与versicolor ,virginica 亚种的区分度最大,区分鸢尾花亚种的主要维度应该是花瓣长宽而非花萼长宽。
使用 k-centroid进行聚类
- 接下来我们想尝试将鸢尾花数据集分为三个组别时的效果,这里我们选用另一种动态聚类方法——
k-centroid 。切换到k中心法 面板,选择聚类数目为3。
- 我们可以看到在中间展示面板的
主图 子面板中,右边的silhouette plot 展示了数据集中每个样本与相应组别的相似度。其中纵轴中的每条柱子代表一个样本,横轴为每个样本silhouette width 的得分,体现了每个样本与同类的不相似度a,以及与其他类的不相似度b,的一个关系值(a−ba+b),取值在-1到1之间,越接近1代表样本归类越准确,小于0则代表样本有可能被错误归类。除此之外,该图还给出了每个组别的样本数目、平均silhouette width ,以及整个数据集的平均silhouette width 。总之silhouette width 值越大,分类效果越好。
- 左边的点图中,横纵轴分别是对聚类贡献最大的两个维度,图中每个点代表一个样本,点的形状代表点的组别,图中的大圆圈与连线则代表了组别的范围与组别间的距离。
- 从模型呈现给我们的图表中可以看出,分组数目为3时,大部分样本的
silhouette width 取值都在0.5左右,只有个别样本取值小于0。在花瓣长宽两个维度上,setosa 亚种很容易与versicolor ,virginica 亚种区分,而后两者组别则有一部分重合样本。
结语
- 我们通过聚类得出的分类结果,总是将10余个
versicolor 亚种的鸢尾花与virginica 亚种混淆,正确率虽然已经达到了90%以上,但依然有待提升。不过我们需要明白:作为一种无监督的机器学习模型,聚类真正的意义在于——在不知道组别的情况下进行分类探索。但从模型上来讲,鸢尾花分为两个亚种似乎更科学。
- 当然,除了进行聚类建模,我们搭建的网站做更多。比如在每个聚类面板中展示模型及聚类效果、在
算法公式 与趣知识 子面板中展示聚类算法与聚类原理、写出模型或聚类结果等。而搭建整个网站我们只用了300余行代码,可见用R语言搭建网站的高效率。
|
请发表评论