基于R的聚类模型(混合模型-基于概率密度分布的聚类方法)

来源:互联网 发布:javascript教学视频 编辑:程序博客网 时间:2024/06/06 09:42

混合模型
在上一讲当中,我们给大家介绍了一种比较特殊的聚类算法,DBSCAN。这种算法主要针对一些样本点分布比较特殊的情形,并且我们通过例子发现,传统K-means算法对这种数据无效。在这一讲当中,我们再次看一种比较比较常见,适用情形非常固定的聚类算法,叫做混合模型,这种聚类算法是假设样本分布来自一个潜在的概率分布。或者若干个概率分布的混合。那么样本点的出现也就可以理解为从这个混合分布中抽取的。这样的话有两个好处,第一个好处是,既然每个样本点是来自若干个概率分布的混合,那么每个点相对每个概率分布就会有个权重,这个权重是我们聚类的关键。光是这么说估计大家感到抽象,我们拿例子说明,我们先画一个散点图。代码与图片如下:

# 载入包library("MASS")# 载入画图的包library("ggpubr")library(ggplot2)#引入到R空间数据data("geyser")#画个散点图ggplot(geyser,aes(x=duration,y=waiting))+geom_point()

图是这个样子的:
散点图
这样的话,我们其实看不出什么,只是大体感觉可以聚为三类。但是如果我认为这些样本点是从一个潜在的概率分布中抽取的,情况就不一样了,下面给大家画个图,情形就清楚很多了。

#二维概率密度图ggscatter(geyser, x = "duration", y = "waiting")+  geom_density2d() 

图形如下:
样本点的概率密度曲线
那么这样的话,我们就大体知道了,貌似数据是来自三个二维正态分布的。将三个二维正态分布看成一个整体,就形成了一个混合模型,这个模型是由三个正态模型加起来的,并且三个正态分布在这个混合模型中所占的权重也是不一样的。这是一个角度,从另外一个角度呢,每个样本点与每个混合模型当中的每个成分关系也是不一样的。这个关系决定了我们的聚类。比如在上图中,最左边的那个点,它肯定是属于最左边的那个正态分布的概率大一些。有些同学肯定会说了,什么叫属于最左边的那个正态分布的概率大一些,明明就是属于它的。其实这样是不对的,我们再强调一些,我们图中的样本点是从一个混合分布中抽取的,不是从图中某一个正态分布抽取的,所以每个点对于每个成分的关系是一个概率。并且这个概率是按照贝叶斯公式计算出来的。下面呢,我们就再次给大家拿代码验证一下。

#导入混合模型的包library(mclust)library(factoextra)#设定数据集df<-geyser#设置随机数种子set.seed(123)#先做k-means聚类km_result <- kmeans(df, 3, nstart = 24)#画图看效果fviz_cluster(km_result , df, geom = "point",             ellipse= FALSE, show.clust.cent = FALSE,             palette = "jco", ggtheme = theme_classic())#混合模型聚类mc <- Mclust(df) ggplot(df,aes(x=waiting,y=duration,colour=class))+geom_point()

我们和之前一样,先做一个k-means聚类,之后在进行对比。结果如下:
基于K-means的结果
可以看到,k-means聚成三类效果不好,第一类还比较完整,第二类和第三类和原始类别明显不同。
下面是基于混合模型的聚类
基于混合模型的聚类
可以看到基于混合模型的聚为四类,效果还是很好的,从概率密度分布的角度看。
结论
本节我们看了基于混合模型的聚类,实际上,具体选择哪一种聚类方式,还是首先对数据进行一些简单的可视化处理,通过可视化,我们大体就能确定使用何种聚类方法。

原创粉丝点击