龙空技术网

R语言数据挖掘实践——密度聚类

懂码杂记 372

前言:

如今各位老铁们对“r语言 聚类”大体比较讲究,看官们都想要剖析一些“r语言 聚类”的相关文章。那么小编也在网上汇集了一些关于“r语言 聚类””的相关内容,希望姐妹们能喜欢,我们一起来学习一下吧!

fpc包中的DBSCAN算法为数值型数据提供了密度聚类。密度聚类的基本思想是将密度相连的对象划分到同一个簇中。DBSCAN算法有两个关键的参数:

eps:可达距离,用于定义邻域的大小;

MinPts:最小数目的对象点。

如果点a邻域内包含的点数目不少于MinPts,则a为密集点,而a邻域内所有点从a出发都是密度可达的,将这些点与a划分到同一个簇中。

密度聚类的优势在于可以发现任意形状的簇,并且对噪声数据不敏感。相比之下,k均值算法更倾向于发现球状的且大小相近的簇。

下面使用代码在iris数据集上进行密度聚类。

> library(fpc)

> iris2 <- iris[-5]

> ds <- dbscan(iris2, eps = 0.42, MinPts = 5)

> table(ds$cluster,iris$Species)

setosa versicolor virginica

0 2 10 17

1 48 0 0

2 0 37 0

3 0 3 33

> plot(ds,iris2)

上面的数据表中,第一列从“1”到“3”为识别出来的3个聚类簇,“0”表示噪声数据或离群点,即不属于任何簇的对象。图中的噪声点用黑色小圆圈表示。

我们还可以专门展示列与列之间的聚类结果,例如我们需要显示第一列和第四列的聚类结果。

> plot(ds, iris2[c(1,4)])

fpc包还提供了另一个展示聚类结果的函数plotcluster()。需要注意的是,数据将被投影到不同的簇中。

> plotcluster(iris2,ds$cluster)

根据新数据与各个簇之间的相似度,聚类模型可以对新数据打上类标号。下面的例子从iris数据集中抽取了一个包含10个对象的样本,并向样本中加入了少量噪声数据用于标记新数据集。噪声数据可以使用runif()函数基于均匀分布随机生成。

> set.seed(435)

> idx <- sample(1:nrow(iris),10)

> newData <- iris[idx,-5]

> newData <- newData + matrix(runif(10*4,min = 0,max = 0.2),nrow = 10,ncol = 4)

> myPred <- predict(ds,iris2,newData)

> plot(iris2[c(1,4)],col=1+ds$cluster)

> points(newData[c(1,4)],pch="*",col=1+myPred,cex=3)

> table(myPred,iris$Species[idx])

myPred setosa versicolor virginica

0 0 0 1

1 3 0 0

2 0 3 0

3 0 1 2

从上面的预测结果可以看出,超过10个对象被标记,正确标记的对象有8个,新数据用“*”号表示,颜色表示类标号。

标签: #r语言 聚类 #密度聚类的优点