基于R的聚类分析(DBSCAN,基于密度的聚类分析)

DBSCAN聚类分析(基于R语言)
在上一讲中,主要是给大家介绍了,K-means聚类,层次聚类这两种聚类方法是最为典型的两种聚类方法。K-means聚类基本原理是这样的,在n个样本点中,首先提前设定要聚类几类,比如说要聚成三类,那么在n个样本点中先随机选择三个点,最为初始点,将剩下的n-3个点按照距离的原则(所谓聚类原则就是哪个点距离它近,就将这个点分配给它),分别分配到这三个点。这样的话,就初步形成三大类点了。每一大类的中心值作为新的中心点,再重新安装距离的原则进行重新分配,不断重复,直至聚类中心稳定。而层次聚类呢,首先是求得所有样本点的两两相似性。在此基础上就可以形成层次关系,最终是由我们自己确定聚为几类,比如说,我们要聚成三类,那么就沿着层次结构图横着画一条线,线下刚好三类。
在这一讲当中,我们介绍一种新的聚类方法,叫DBSCAN(Density-Based Spatial Clustering of Applications with Noise)聚类法,也是非常经典的一个算法了。是基于密度的聚类算法,首先说为什么会有这种聚类算法,而且为什么是基于密度的。基于密度有啥好处。我们首先说,为什么需要这种聚类算法。我们通过代码来说明。首先我们先产生一个待聚类的样本点,并且利用R将其画出来,如下

#载入包
library(factoextra)
librar(ggplot2)
data("multishapes")
df <- multishapes[, 1:2]
df0<-multishapes
df0$shape<-as.factor(df0$shape)
ggplot(df0,aes(x=x,y=y,colour=shape))+geom_point()

样本点是这个样子的
基于R的聚类分析(DBSCAN,基于密度的聚类分析)_第1张图片
大家看这个样本点,每一种颜色代表一类,大体上看,是五类,两个圈代表两类,两条线代表两类,另个的一堆点代表一类。大家说,我们要是拿k-means聚类算法进行聚类,能不能准确地分出来这五类呢。那么我们就试试,并且画出聚类效果图,代码如下:

set.seed(123)
km_result <- kmeans(df, 5, nstart = 25)
fviz_cluster(km_result , df, geom = "point",
             ellipse= FALSE, show.clust.cent = FALSE,
             palette = "jco", ggtheme = theme_classic())

根据k-means对上述数据聚类结果如下:
基于R的聚类分析(DBSCAN,基于密度的聚类分析)_第2张图片
oh,my god,这么成这个样子了。完全不是我们想要的结果。这样我们就回答了第一个问题,为什么需要基于密度的聚类算法,因为像这种奇奇怪怪形状的样本点,我们利用k-means算法根本无法将其进行聚类。那么基于密度的聚类算法为啥可以解决。大家看看这个图,每一类就是一些点密集地连接在一起。密集地也就是代表了密度的不同,所以这里大家就知道了,这个密度不是我们平时说的概率密度分布。实际上是一种样本密度的代表。那么我们再看看DBCSAN算法,在这种样本下表现如下,代码如下:

#载入相关包
library("fpc")
#设置随机数种子
set.seed(123)
db <- fpc::dbscan(df, eps = 0.15, MinPts = 5)
fviz_cluster(db, data = df, stand = FALSE,
             ellipse = FALSE, show.clust.cent = FALSE,
             geom = "point",palette = "jco", ggtheme = theme_classic())

是这个样子的基于R的聚类分析(DBSCAN,基于密度的聚类分析)_第3张图片
哈哈,效果非常好,大家看到了吧,所以说基于密度的聚类算法就适用这种奇奇怪怪的样本点。可能大家想知道为什么DBSCAN可以做到,数学推导方面,我后面会给大家介绍。

你可能感兴趣的:(R,r语言,clustering)