[R语言] 快速搭建网站——使用shiny实现聚类算法可视化

前言

  • 建模的过程一向是枯燥乏味的,今天就让我们用R语言中丰富的可视化工具,自己搭建一个网站,实现聚类算法的可视化,网站效果如下。

上传数据

  • 首先我们需要上传一份数据用于聚类分析,数据要求为csv格式,其中每一行代表一个样本;第一列为id列,标注每个样本的名称;其余列为样本在各维度下的观测值。
  • 点击左侧导航栏中的查找按钮就可以选择上传的文件,上传成功后导航栏中会显示上传的文件名,切换到主数据页面就可以查看到我们上传的数据了。
  • 这里我们上传了R语言的一份系统数据集 iris,这是一份已知分类的关于鸢尾花花瓣与花萼长款的数据集,这里我们要求数据集的每一行为一个单独的样本,id列的值不能重复,所以网站会自动把id列中鸢尾花的类别修改为类别 + _No. + 数字标号的形式。
    主数据

使用k-means探索聚类分组数目

  • 假设我们不知道鸢尾花的分类情况,我们需要探索将鸢尾花数据集分为几个类别最合适。这里我们就可以通过动态聚类法,快速查看该数据集被分为n类时的分类效果。
  • 进入k均值法页面,我们可以通过调节右侧聚类控制面板中的选项非常便捷的修改聚类参数。
  • 在中间展示面板的主图子面板中,我们调用了R语言的扩展包展示出了当分组数目为2-10之间时的聚类效果。左边类似热力图的图表实际上是一张分类效果图,横轴为每个样本的编号,纵轴为分组数目,同种颜色为一个组别,主要展示了在分组数目确定的情况下哪些样本被分到了同一组。右边的点线图展示了Calinsky criterion(即方差比准则)随着分组数目的变化,由于方差比是组间距离与组内距离按照分组数目加权后的比值,所以理论上方差比越大分组效果越好,这幅图中呈现的是:为了达到最好的分组效果,我们应该将数据集分为两个组别,其次为三个组别。
    k均值聚类

使用层次聚类

  • 已知分组效果最好时应该分两个组别,我们可以切换到层次聚类面板,选用合适的聚类算法与连接方法,设定分组数目为2,点击确定即可以完成层次聚类。
  • 在中间展示面板的主图子面板中,悬浮在上面的是一幅聚类树状图,展示了每个样本如何被两两聚合直至同一类。绿色方框中是按照我们设定的分组数目截取的子分支。红色方框可以使树状图局部放大,通过控制子分支高度子分支组别我们可以调节红框的大小以及所在的位置,红框内放大后的子分支会被展示在主图面板的整副画布中,局部放大后树状图的标签即数据集的id列。
    层次聚类

查看层次聚类效果

  • 每次我们作完聚类模型,都可以在相应面板中的误差图子面板中查看聚类效果。误差图中,每条线代表一个样本,每种颜色代表一个组别,横轴为数据集用于聚类的每个维度(这里为鸢尾花的花瓣、花萼长宽),纵轴为每个样本在相应维度的取值。
  • 在这幅误差图中,我们可以看出:红色与淡蓝色包含的样本数为1:2,且两者在花瓣长宽两个维度上泾渭分明,而在其它两个维度上,由于样本的取值比较分散、没有呈现出阶层性,所以不太容易作区分。这与我们所知的信息十分吻合:鸢尾花数据集中setosa亚种的鸢尾花与versicolor,virginica亚种的区分度最大,区分鸢尾花亚种的主要维度应该是花瓣长宽而非花萼长宽。
    层次聚类误差图

使用 k-centroid进行聚类

  • 接下来我们想尝试将鸢尾花数据集分为三个组别时的效果,这里我们选用另一种动态聚类方法——k-centroid。切换到k中心法面板,选择聚类数目为3。
  • 我们可以看到在中间展示面板的主图子面板中,右边的silhouette plot展示了数据集中每个样本与相应组别的相似度。其中纵轴中的每条柱子代表一个样本,横轴为每个样本silhouette width的得分(即 + ),体现了每个样本与同类的不相似度(样本到该类中心点的距离)以及与其他类的不相似度(样本到其它类中心点的距离)的一个关系值,取值在-1到1之间,越接近1代表样本归类越准确,小于0则代表样本有可能被错误归类。除此之外,该图还给出了每个组别的样本数目、平均silhouette width,以及整个数据集的平均silhouette width。总之silhouette width值越大,分类效果越好。
  • 左边的点图中,横纵轴分别是对聚类贡献最大的两个维度,图中每个点代表一个样本,点的形状代表点的组别,图中的大圆圈与连线则代表了组别的范围与组别间的距离。
  • 从模型呈现给我们的图表中可以看出,分组数目为3时,大部分样本的silhouette width取值都在0.5左右,只有个别样本取值小于0。在花瓣长宽两个维度上,setosa亚种很容易与versicolor,virginica亚种区分,而后两者组别则有一部分重合样本。
    k中心法

结语

  • 我们通过聚类得出的分类结果,总是将10余个versicolor亚种的鸢尾花与virginica亚种混淆,正确率虽然已经达到了90%以上,但依然有待提升。不过我们需要明白:作为一种无监督的机器学习模型,聚类真正的意义在于——在不知道组别的情况下进行分类探索。但从模型上来讲,鸢尾花分为两个亚种似乎更科学。
  • 当然,除了进行聚类建模,我们搭建的网站做更多。比如在每个聚类面板中展示模型及聚类效果、在算法公式趣知识子面板中展示聚类算法与聚类原理、写出模型或聚类结果等。而搭建整个网站我们只用了300余行代码,可见用R语言搭建网站的高效率。
    算法公式
    趣知识



猜你喜欢

转载自blog.csdn.net/weixin_38641983/article/details/81032547