基于R包clv进行聚类效果评估

in 机器学习 Views: 5,866 s with 1 comment

验证结果

当聚类到了最后一步,就应该对聚类效果进行评估了。
这一步实际上相当于在问“这种划分并不是因为数据集或聚类方法的某种特性,而是确实给出了一个某种程度上有实际意义的结果吗?”
希望结果:簇内相似度高,簇间相似度低。

性能度量方式

外部指标(external index)
将聚类结果与某个参考模型进行比较(有点像有监督,即你用来聚类的样本实际上是有标签的。)

常用度量指标:

内部指标(internal index)
直接考察聚类结果而不利用任何参考模型。实际环境下,我们更常面对的是这样的场景。
常用度量指标:

fpc, clv, clValid包里包含了评估聚类解的稳定性的函数。

clv包

# load and prepare data
library(clv)
data(iris) #引入鸢尾花数据集
iris.data <- iris[,1:4] # 第5列为样本标签,这里我们忽略这个标签,将数据集变为无标签数据集

查看一下iris和iris.data的状况——

> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
> head(iris.data)
  Sepal.Length Sepal.Width Petal.Length Petal.Width
1          5.1         3.5          1.4         0.2
2          4.9         3.0          1.4         0.2
3          4.7         3.2          1.3         0.2
4          4.6         3.1          1.5         0.2
5          5.0         3.6          1.4         0.2
6          5.4         3.9          1.7         0.4
> table(iris$Species)
    setosa versicolor  virginica 
        50         50         50 

使用pam进行聚类,注意,实际上iris数据集被分为3类,但这里我们尝试将其聚为5类。

pam.mod <- pam(iris.data,5) # create five clusters
v.pred <- as.integer(pam.mod$clustering) # get cluster ids associated to given data objects

运用clv包中的cls.scatt.data函数计算簇内距离和簇间距离。
距离可以选择euclidean, manhattan, correlation三种。默认是euclidean

cls.scatt <- cls.scatt.data(iris.data, v.pred, dist="euclidean")

结果:

> cls.scatt
# 簇内距离
$intracls.complete # 完整直径:属于相同簇的两个相距最远的对象之间的距离
        c1    c2    c3    c4    c5
[1,] 2.429 1.661 1.628 1.375 1.389

$intracls.average # 平均直径:属于相同簇的所有样本之间的平均距离
         c1     c2     c3    c4     c5
[1,] 0.6968 0.7964 0.7397 0.686 0.8533

$intracls.centroid # 质心直径距离:在所有样本和簇中心点之间的双倍平均距离
         c1     c2     c3     c4     c5
[1,] 0.4817 0.5629 0.5116 0.4793 0.5744

# 簇间距离
$intercls.single # 单联动距离:一个类中的点和另一个类中的点的最小距离
      c1     c2    c3     c4     c5
c1 0.000 2.7893 1.640 3.8066 5.0804
c2 2.789 0.0000 0.300 0.3162 1.3928
c3 1.640 0.3000 0.000 1.2490 2.5417
c4 3.807 0.3162 1.249 0.0000 0.4359
c5 5.080 1.3928 2.542 0.4359 0.0000

$intercls.complete # 全联动距离:一个类中的点和另一个类中的点的最大距离
      c1    c2    c3    c4    c5
c1 0.000 5.084 4.025 5.946 7.085
c2 5.084 0.000 2.804 2.371 3.442
c3 4.025 2.804 0.000 3.793 4.839
c4 5.946 2.371 3.793 0.000 2.267
c5 7.085 3.442 4.839 2.267 0.000

$intercls.average # 平均联动距离:一个类中的点和另一个类中的点的平均距离(也称作UPGMA, 即非加权对组平均)    
      c1    c2    c3    c4    c5
c1 0.000 3.838 2.864 4.831 5.953
c2 3.838 0.000 1.351 1.287 2.403
c3 2.864 1.351 0.000 2.325 3.515
c4 4.831 1.287 2.325 0.000 1.460
c5 5.953 2.403 3.515 1.460 0.000

$intercls.centroid # 质心联动距离:两类中质心(变量均值向量)之间的距离。对单个的观测值来说,质心就是变量的值。    
      c1    c2    c3    c4    c5
c1 0.000 3.770 2.780 4.787 5.910
c2 3.770 0.000 1.178 1.088 2.288
c3 2.780 1.178 0.000 2.255 3.457
c4 4.787 1.088 2.255 0.000 1.297
c5 5.910 2.288 3.457 1.297 0.000

$intercls.ave_to_cent #平均质心联动:两类中簇中心点的距离
      c1    c2    c3    c4    c5
c1 0.000 3.804 2.824 4.810 5.931
c2 3.804 0.000 1.269 1.194 2.347
c3 2.824 1.269 0.000 2.290 3.482
c4 4.810 1.194 2.290 0.000 1.369
c5 5.931 2.347 3.482 1.369 0.000

$intercls.hausdorff # A簇内的样本离最近的非本簇样本距离的最大值
      c1    c2    c3    c4    c5
c1 0.000 3.759 2.606 4.851 6.155
c2 4.139 0.000 1.356 1.364 2.600
c3 3.135 1.578 0.000 2.678 3.953
c4 4.846 1.288 2.371 0.000 1.378
c5 6.040 2.249 3.466 1.249 0.000

$cluster.center
    [,1]  [,2]  [,3]  [,4]
c1 5.006 3.428 1.462 0.246
c2 6.165 2.852 4.743 1.580
c3 5.512 2.583 3.883 1.192
c4 6.633 3.067 5.548 2.100
c5 7.578 3.144 6.433 2.122

$cluster.size
[1] 50 40 24 27  9

attr(,"class")
[1] "cls.list"

对数据集$D={x_1,x_2,...,x_m}$,假定通过聚类给出的簇划分为$C = \{C_1,C_2,...,C_k\}$,$dist(·,·)$用于计算两个样本之间的距离;$\mu$代表簇C的中心点$\mu = \frac{1}{|C|} \sum_{1 \leq i \leq |C|} x_i$
定义

Dunn指数(Dunn Index,简称DI)

$$DI = min_{1 \leq i \leq k} ( min_{j \not= i}(\frac{d_{min}(C_i,C_j)}{max_{1 \leq l \leq k}diam(C_l)}) ) $$

R代码

> intraclust = c("complete","average","centroid") # 簇内
> interclust = c("single", "complete", "average","centroid", "aveToCent", "hausdorff") #簇间
> dunn <- clv.Dunn(cls.scatt, intraclust, interclust)
> dunn
        comp    ave   cent
sin   0.1235 0.3516 0.5223
comp  0.9334 2.6570 3.9470
ave   0.5298 1.5082 2.2405
cent  0.4481 1.2756 1.8949
aveto 0.4915 1.3991 2.0784
haus  0.5142 1.4638 2.1744

DB指数(Davies-Bouldin Index,简称DBI)

$$DBI = \frac{1}{k} \sum_{i=1}^k max_{j \not= i} (\frac{avg(C_i) + avg(C_j)}{d_{cen}(\mu_i, \mu_j)})$$

> davies <- clv.Davies.Bouldin(cls.scatt, intraclust, interclust)
> davies
       comp    ave   cent
sin   8.069 3.8671 2.6964
comp  1.192 0.5776 0.3998
ave   2.107 0.9993 0.6967
cent  2.393 1.1464 0.7994
aveto 2.237 1.0655 0.7429
haus  2.061 1.0094 0.6988

返回矩阵维度取决于dim(D)=c(length(intercls),length(intracls))。每一对: (inter-cluster dist, intra-cluster diam) 都在结果矩阵中有自己的位置。
其中DBI的值越小越好,DI越大越好

「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」

薇拉航线

(๑>ڡ<)☆谢谢老板~

使用微信扫描二维码完成支付

Comments are closed.
  1. 热心市民德里克先生

    您好,我想请问一下最后返回的davies矩阵是不是就是每个comp、ave、cent分别除以sin、comp、ave、cent、aveto、haus的结果的,我不是很了解这个矩阵每个数字代表的意义
    另外请问DBI指数小到什么程度可以认为聚类结果是比较良好的?

    回复