聚类评估

一、 聚类的趋势

使用霍普金斯统计量(Hopkins Statistics)来量化评估。
  ① 从所有的样本向量中随机找n个向量,把它们称为p向量,每一个向量分别是p1、p2、……、pn。对每一个向量都在样本空间里找一个离其最近的向量,然后求距离(用欧氏距离即可),然后用x1、x2、……、xn来表示这个距离。
  ② 在所有样本向量中随机找n个向量,把它们称为q向量,每一个向量分别是q1、q2、……、qn。对每一个向量都在样本空间里找一个离其最近的向量,然后求距离(用欧氏距离即可),然后用y1、y2、……、yn来表示这个距离。
  ③ 求出霍普金斯统计量H:
                 聚类评估_第1张图片
H = ∑ i = 1 n y i ∑ i = 1 n x i + ∑ i = 1 n y i H=\frac{\sum^{n}_{i=1}{y_i}}{{\sum^{n}_{i=1}{x_i}}+ {\sum^{n}_{i=1}{y_i}}} =i=1nxi+i=1nyii=1nyi
  如果整个样本空间是一个均匀的,没有聚类趋势(聚簇不明显)的空间,那么H应该为0.5左右。反之,如果是有聚类趋势(聚簇明显)的空间,那么H应该接近于1。

pn = X[np.random.choice(X.shape[0], 3, replace=False), :]   # 随机选出3个样本数据
xn = []
# 计算每个pn到其他样本数据的距离
for i in pn:
    distance_min = 1000000
    for j in X:
        if np.array_equal(j, i):
            continue
        distance = np.linalg.norm(j - i)  # 范数 默认2-范
        if distance_min > distance:
            distance_min = distance
    xn.append(distance_min)
qn = X[np.random.choice(X.shape[0], 3, replace=False), :]
yn = []
for i in pn:
    distance_min = 1000000
    for j in X:
        if np.array_equal(j, i):
            continue
        distance = np.linalg.norm(j - i)
        if distance_min > distance:
            distance_min = distance
    yn.append(distance_min)
H = float(np.sum(yn)) / (np.sum(xn) + np.sum(yn))
print(H)

二、簇数的确定

①有一种简单的经验法就是对于n个样本的空间,设置簇数p为 n 2 \sqrt[2]{n} 2n ,在期望状态下每个簇大约有 2 n \sqrt{2n} 2n 个点。但是这种说法没有找到太多的依据,只能作为参考。
还有一种方法叫“肘方法”(The Elbow Method),被认为是一种更为科学的方式。思路如下:
  ②尝试把样本空间划分1个类、2个类、3个类、……、n个类,要确定哪种分法最为科学,在分成m个类簇的时候会有一个划分方法,在这种划分的方法下,每个类簇的内部都有若干个向量,计算这些向量的空间中心点,即计算这m个类簇各自的空间重心在哪里。再计算每个类簇中每个向量和该类簇重心的距离(大于等于0)的和。最后把m个类簇各自的距离和相加得到一个函数var(n),n就是类簇数。
       聚类评估_第2张图片
   m从1次、2次、3次……逐步往上增加的过程中,整个曲线的斜率会逐步降低,而且一开始是快速下降的。下降过程中有一个拐点,这一个点会让人感觉曲线从立陡变成平滑,那么这个点就是要找的点。

三、聚类的质量

测定聚类质量的方法很多,一般分为“外在方法”和“内在方法”两种。
  所谓外在方法是一种依靠类别基准的方法,即已经有比较严格的类别定义时再讨论聚类是不是足够准确。这里通常使用“BCubed精度”和“BCubed召回率”来进行衡量。但是外在方法适用于有明确的外在类别基准的情况,而聚类是一种无监督的学习,更多是在不知道基准的状况下进行的,所以我们更倾向于使用“内在方法”。
  对有n个样本的空间,假设它被划分成k个类簇,即C1、C2、……、Ck。对于任何一个样本空间中的向量v来说,可以求一个v到本类簇中其他各点的距离的平均值a(v),还可以求一个v到其他所有各类簇的最小平均距离(即从每个类簇里挑选一个离v最近的向量,然后计算距离),求这些距离的平均值,得到b(v),轮廓系数定义为
      聚类评估_第3张图片
  一般来说,这个函数的结果在-1和1之间。a(v)表示的是类簇内部的紧凑型,越小越紧凑,而b(v)表示该类簇和其他类簇之间的分离程度。如果函数值接近1,即a(v)比较小而b(v)比较大时,说明包含v的类簇非常紧凑,而且远离其他的类簇。相反,如果函数值为负数,则说明a(v)>b(v),v距离其他的类簇比距离自己所在类簇的其他对象更近,那么这种情况质量就不太好,应该尽可能避免。
  为了让聚类中的类簇划分更为合理,可以计算簇中所有对象的轮廓系数的平均值(但是这个计算量有可能会相当大,请谨慎使用),然后求平均值。在一种方案里,如果轮廓系数是负数那么可以直接淘汰,如果是正数则可以在多个方案里进行比较,选择一种轮廓系数接近1的方案。但是计算时占用较多内存,尤其是在数据量巨大时,在使用时请谨慎,或者使用抽样后的数据进行计算。

你可能感兴趣的:(聚类)