聚类 -距离度量方法与模型评估方法(一)


  聚类(Clustering):按照某个特定标准(如:距离)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,不在同一个簇中的数据对象的差异性也尽可能地大;聚类后同一类的数据尽可能聚集到一起,不同类数据尽量分离。


1 聚类的基本数据结构

  假设要聚类的数据集合包含 n n n 个数据对象,这些数据对象可能表示人,房子,文档,国家等。许多基于内存的聚类算法选择如下两种有代表性的数据结构:数据矩阵和相异度矩阵。

1.1 数据矩阵(Data matrix,或称对象-属性结构)

  用 p p p 个变量(也称为属性)来表现 n n n 个对象,例如用年龄,身高,性别,种族等属性来表现对象“人”。这种数据结构是关系表的形式,或者看为 n p np np 维( n n n 个对象 p p p 个属性)的矩阵。
[ x 11 ⋯ x 1 f ⋯ x 1 p ⋯ ⋯ ⋯ ⋯ ⋯ x i 1 ⋯ x i f ⋯ x i p ⋯ ⋯ ⋯ ⋯ ⋯ x n 1 ⋯ x n f ⋯ x n p ] \begin{bmatrix} x_{11} & \cdots & x_{1f} & \cdots & x_{1p} \\ \cdots & \cdots & \cdots & \cdots & \cdots & \\ x_{i1} & \cdots & x_{if} & \cdots & x_{ip} \\ \cdots & \cdots & \cdots & \cdots & \cdots & \\ x_{n1} & \cdots & x_{nf} & \cdots & x_{np} \\ \end{bmatrix} x11xi1xn1x1fxifxnfx1pxipxnp


1.2 相异度矩阵(dissimilarity matrix 或称对象-对象结构)

  存储 n n n 个对象两两之间的近似性,表现形式是一个 n × n n \times n n×n 维的矩阵。在这里 d ( i , j ) d(i,j) d(i,j) 是对象 i i i 和对象 j j j 之间相异性的量化表示,通常它是一个非负的数值,当对象 i i i j j j 越相似,其值越接近 0;两个对象越不同,其值越大。既然 d ( i , j ) = d ( j , i ) d(i,j) = d(j,i) d(i,j)=d(j,i),而且 d ( i , i ) = 0 d(i,i)=0 d(i,i)=0,我们可以得到如下的矩阵。

[ 0 d ( 2 , 1 ) 0 d ( 3 , 1 ) d ( 3 , 2 ) 0 ⋮ ⋮ ⋮ ⋯ d ( n , 1 ) d ( n , 2 ) ⋯ ⋯ 0 ] \begin{bmatrix} 0 & & & & \\ d(2,1) & 0 & & & & \\ d(3,1) & d(3,2) & 0 & & \\ \vdots & \vdots & \vdots & \cdots & & \\ d(n,1) & d(n,2) & \cdots & \cdots & 0 \\ \end{bmatrix} 0d(2,1)d(3,1)d(n,1)0d(3,2)d(n,2)00

  数据矩阵经常被称为二模( two-mode)矩阵,而相异度矩阵被称为单模( one-mode)矩阵。这是因为前者的行和列代表不同的实体,而后者的行和列代表相同的实体。

  许多聚类算法以相异度矩阵为基础如果数据是用数据矩阵的形式表现的,在使用该类算法之前要将其转化为相异度矩阵


2 不同数据类型的相异度计算方法

  在聚类分析过程中,需要把数据对象区分为不同的类,那么对象是如何划分到不同的类别当中的呢?判断不同对象是否归于一类依据的是对象之间的相似性。对象相似性的度量标准一般有两种:距离和相似性系数

  • 距离:一般用来度量观测之间的相似性,
  • 相似性系数:一般用来度量变量之间的相似性。

  距离是指:把一个观测看做M维空间中的一个点,并在空间中定义距离。基于距离的聚类算法是把距离较近的点可以归入同一类,距离远的点归入不同的类。聚类分析中的距离一般用来测验样本之间的相似性,是进行聚类分析的关键步骤。在聚类分析中,经常使用欧几里得方法来计算数值属性的相异性,欧几里得是刻画数据对象的相异性的距离度量,除了欧几里得之外,还有切曼哈顿、兰氏距离等方法。

  下面列出6个常用的距离度量,除了马氏距离之外,其他5个距离度量都需要做无量纲化处理。

  聚类算法的基本出发点在于根据对象间相似度将对象划分为不同的类。对于 n n n 个数据对象,其可能具有 m m m 个属性变量,其中,属性变量可能是区间标度变量、二元变量、 标称变量、序数型变量、比例标度变量等等,对于不同类型的属性变量以及由各种类型变量组成的混合类型变量的相似度计算,需要采用特定的方法。

在这里插入图片描述


2.1 区间标度变量

  基本呈直线比例的连续变量。典型的例子包括重量和高度、大气温度等。对于这类变量。通常度量标准有两种:距离和相似性系数


数值型数据相似度度量
相似度度量准则相似度度量函数
Euclidean 距离(欧几里得度量) d ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 d(x,y)=\sqrt{\sum_{i=1}^{n}(x_i-y_i)^2} d(x,y)=i=1n(xiyi)2
Standard Euclidean distance(标准的欧几里得距离) d ( x , y ) = ∑ i = 1 n ( x i − y i s i ) 2 d(x,y)=\sqrt{\sum_{i=1}^{n} ( \frac{x_{i}-y_{i}}{s_i})^2} d(x,y)=i=1n(sixiyi)2
Chebyshev 距离(切比雪夫距离) d ( x , y ) = m a x i ( ∣ x i − y i ∣ ) d(x,y)=\underset{i}{max}(|x_{i}-y_{i}|) d(x,y)=imax(xiyi)
Manhattan 距离(曼哈顿距离) d ( x , y ) = ∑ i = 1 n ∣ x i − y i ∣ d(x,y)=\sum_{i=1}^{n}\left | x_i-y_i \right | d(x,y)=i=1nxiyi
Lambert distance(兰氏距离) d i j = ∑ k = 1 n ∣ x i k − x j k ∣ x i k + x j k d_{ij}=\sum_{k=1}^{n}\frac{|x_{ik}-x_{jk}|}{x_{ik}+x_{jk}} dij=k=1nxik+xjkxikxjk
Minkowsi 距离(闵可夫斯基距离) d ( x , y ) = [ ∑ i = 1 n ( x i − y i ) p ] 1 p d(x,y)=[\sum_{i=1}^{n}( x_i-y_i )^p]^{\frac{1}{p}} d(x,y)=[i=1n(xiyi)p]p1
Mahalanobis distance(马氏距离) d ( X i , X j ) = ( X i − X j ) T S − 1 ( X i − X j ) d(X_i,X_j)=\sqrt{(X_i-X_j)^TS^{-1}(X_i-X_j)} d(XiXj=(XiXj)TS1(XiXj)

2.1.1 距离法

  距离是指:把一个观测看做 M M M 维空间中的一个点,并在空间中定义距离。基于距离的聚类算法是把距离较近的点可以归入同一类,距离远的点归入不同的类。常见的距离度量方法有欧几里得距离切比雪夫距离曼哈顿距离兰氏距离等方法。


2.1.1.1 欧几里得距离

  欧几里得距离也称欧式距离,表示空间中两点之间的直线距离。是最常见的距离度量,衡量的是多维空间中两个点之间的绝对距离。也可以理解为: m m m 维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离。

在这里插入图片描述

  其意义就是两个元素在欧氏空间中的集合距离,因为其直观易懂且可解释性强,被广泛用于标识两个标量元素的相异度。

  由于特征向量的各分量的量纲不一致,通常需要先对各分量进行标准化,使其与单位无关,比如,对身高(cm)和体重(kg)两个单位不同的指标使用欧式距离可能使结果失效。

  • 二维平面上点 a ( x 1 , y 1 ) a(x_1,y_1) a(x1,y1) b ( x 2 , y 2 ) b(x_2,y_2) b(x2,y2)间的欧氏距离:
    d 12 = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 d_{12}=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2} d12=(x1x2)2+(y1y2)2

  • 三维平面上点 a ( x 1 , y 1 , z 1 ) a(x_1,y_1,z_1) a(x1,y1,z1) b ( x 2 , y 2 , z 2 ) b(x_2,y_2,z_2) b(x2,y2,z2)间的欧氏距离:
    d 12 = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 + ( z 1 − z 2 ) 2 d_{12}=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2+(z_1-z_2)^2} d12=(x1x2)2+(y1y2)2+(z1z2)2

  • n n n 维平面上点 a ( x 11 , x 12 , ⋯   , x 1 n ) a(x_{11},x_{12},\cdots,x_{1n}) a(x11,x12,,x1n) b ( x 21 , x 22 , ⋯   , x 2 n ) b(x_{21},x_{22},\cdots,x_{2n}) b(x21,x22,,x2n) 间的欧氏距离(两个 n n n 维向量):
    d 12 = ∑ k = 1 n ( x 1 k − x 2 k ) 2 d_{12}=\sqrt{\sum_{k=1}^{n}(x_{1k}-x_{2k})^2} d12=k=1n(x1kx2k)2

优点

  • 使用起来非常直观,实现起来也很简单,并且在许多用例中都显示出了很好的效果。虽然已经开发了许多其他的测量方法来解释欧氏距离的缺点,但它仍然是最常用的距离测量方法之一,这是有充分理由的。
  • 当你有低维数据,并且向量的大小很重要,需要测量时,欧氏距离的效果非常好。如果在低维数据上使用欧氏距离,kNN和HDBSCAN等方法就会显示出很好的效果。

缺点:没有考虑分量之间的相关性,体现单一特征的多个分量会干扰结果。

  • 虽然这是一种常见的距离测量方法,但欧几里得距离并不是尺度不变的,这意味着计算出的距离可能会根据特征的单位而有所偏斜。
  • 通常情况下,在使用这种距离测量之前,需要对数据进行归一化
  • 此外,随着数据维度的增加,欧几里得距离的作用就越小。这与维度的诅咒有关,它涉及到高维空间的概念,并不像我们直观地期望的那样,从二维或三维空间中发挥作用。

Python实现:

def EuclideanDistance(x, y):
    import numpy as np
    x = np.array(x)
    y = np.array(y)
    return np.sqrt(np.sum(np.square(x-y)))

2.1.1.2 标准化的欧几里得距离

  标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案。标准欧氏距离的思路:既然数据各维分量的分布不一样,好吧!那我先将各个分量都“标准化”到均值、方差相等吧

  举一个例子,我们想要对几位模特进行聚类,每个模特有两个属性:重量和高度。但是,重量的计量单位是毫克,而高度的计量单位是米。假如有三个模特,他们各自的属性数据如下:
A:65000000毫克(即130斤),1.74米
B:60000000毫克(即120斤),1.70米
C:65000000毫克(即130斤),1.40米

按照我们日常生活常识,我们本来应该把A和B放到一类里,而把C放到另外一类里。但是当我们计算三者的欧式距离时,得到的输出结果是这样的:

模特A和B的差异为:5000000.0 模特A和C的差异为:0.3400000000000001

  这与我们的认知正好相反,原因是啥——属性计量单位不同导致数值差异过大。如果我们把重量的计量单位改成千克而把高度计量单位改成厘米:
A:65千克(即130斤),174厘米
B:60千克(即120斤),170厘米
C:65千克(即130斤),140厘米
得到的输出结果是这样的:

模特A和B的差异为:6.4031242374328485 模特A和C的差异为:34.0

这就与我们的预期是一致的了。
那么有没有一种方法能够自动消除这种计量单位的影响呢?有 —— 标准化欧氏距离方法。

手工计算验证:还是以模特属性为例,A模特的属性是:【65, 174】,B模特的属性是:【60, 170】。二者的方差为:

重量属性:
( 65 − 62.5 ) 2 + ( 60 − 62.5 ) 2 2 − 1 = 12.5 \frac{(65-62.5)^2+(60-62.5)^2}{2-1}=12.5 21(6562.5)2+(6062.5)2=12.5

身高属性:
( 174 − 172 ) 2 + ( 170 − 172 ) 2 2 − 1 = 8 \frac{(174-172)^2+(170-172)^2}{2-1}=8 21(174172)2+(170172)2=8

获得方差之后,计算标准欧式距离:
d i s t a n c e = ( 65 − 60 ) 2 12.5 + ( 174 − 170 ) 2 8 = 2 distance=\sqrt{\frac{(65-60)^2}{12.5}+\frac{(174-170)^2}{8}}=2 distance=12.5(6560)2+8(174170)2 =2

  因此需要对所有维度分别进行处理,而标准化欧式距离即是将集合 X = x i X={x_i} X=xi 先进行归一化,映射到正态分布 N ( 0 , 1 ) N(0,1) N(0,1)的区间。两个 n n n 维向量 a ( x 11 , x 12 , … , x 1 n ) a(x_{11},x_{12},…,x_{1n}) a(x11,x12,,x1n) b ( x 21 , x 22 , … , x 2 n ) b(x_{21},x_{22},…,x_{2n}) b(x21,x22,,x2n)间的标准化欧氏距离的公式为:
d 12 = ∑ k = 1 n ( x 1 k − x 2 k s k ) 2 d_{12}=\sqrt{\sum_{k=1}^{n} ( \frac{x_{1k}-x_{2k}}{s_k})^2} d12=k=1n(skx1kx2k)2

其中 s k s_k sk是分量的标准差。


Python实现:

def StandardizedEuclideanDistance(x, y):
    import numpy as np
    x = np.array(x)
    y = np.array(y)
    
    X = np.vstack([x,y])
    sigma = np.var(X, axis=0, ddof=1)
    return np.sqrt(((x - y) ** 2 /sigma).sum())
    
#上述代码中需要避免某个分量取值一致,即该分量sigma=0。

2.1.1.3 切比雪夫距离

  国际象棋中,国王可以直行、横行、斜行,所以国王走一步可以移动到相邻8个方格中的任意一个。国王从格子 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) 走到格子 ( x 2 , y 2 ) (x_2,y_2) (x2,y2) 最少需要多少步?这个距离就叫切比雪夫距离。

  国际象棋棋盘上二个位置间的切比雪夫距离是指王要从一个位子移至另一个位子需要走的步数。由于王可以往斜前或斜后方向移动一格,因此可以较有效率的到达目的的格子。下图是棋盘上所有位置距王位置的切比雪夫距离。

在这里插入图片描述


  切比雪夫距离(Chebyshev Distance)是两点投影到各轴上距离的最大值。是向量空间中的一种度量,二个点之间的距离定义是其各坐标数值差绝对值的最大值。以数学的观点来看,切比雪夫距离是由一致范数(或称为上确界范数)所衍生的度量,也是超凸度量的一种:
d ( x , y ) = m a x ( ∣ x i − y i ∣ ) d(x,y)=max(|x_i-y_i|) d(x,y)=max(xiyi)

  • 二维平面两点 a ( x 1 , y 1 ) a(x_1,y_1) a(x1,y1) b ( x 2 , y 2 ) b(x_2,y_2) b(x2,y2) 间的切比雪夫距离:
    d 12 = m a x ( ∣ x 1 − x 2 ∣ , ∣ y 1 − y 2 ∣ ) d_{12}=max(|x_1-x_2|,|y_1-y_2|) d12=max(x1x2y1y2)

  • n n n 维空间点 a ( x 11 , x 12 , … , x 1 n ) a(x_{11},x_{12},…,x_{1n}) a(x11,x12,,x1n) b ( x 21 , x 22 , … , x 2 n ) b(x_{21},x_{22},…,x_{2n}) b(x21,x22,,x2n) 的切比雪夫距离:
    d 12 = m a x i ( ∣ x 1 i − x 2 i ∣ ) d_{12}=\underset{i}{max}(|x_{1i}-x_{2i}|) d12=imax(x1ix2i)

使用切比雪夫距离的注意事项:

  • 1、切比雪夫距离只适用于数值型数据,不适用于分类变量和序数变量。
  • 2、当数据的维度很高时,切比雪夫距离可能会被高维空间的“诅咒”所影响,导致距离计算不准确。
  • 3、切比雪夫距离对异常值比较敏感,因为它是取各个坐标数值差的绝对值的最大值,如果某个坐标上的数值特别大或特别小,会对距离计算产生较大影响。
  • 4、在一些聚类算法中,切比雪夫距离可能会导致聚类结果不稳定,因为它只考虑了各个坐标数值的最大差异,而忽略了不同维度之间的相关性。

缺点
切比雪夫通常用于非常特殊的使用情况,这使得它很难像欧几里得距离或余弦相似性那样作为一个通用的距离度量。出于这个原因,我们建议只有当你绝对确定它适合你的使用情况时才使用它。


用例

  • 如前所述,切比雪夫距离可以用来提取从一个方格到另一个方格所需的最少步数。此外,在允许无限制的8向移动的棋局中,它也是一个有用的测量方法。
  • 在实践中,切比雪夫距离经常被用于仓库物流,因为它很像天车移动一个物体所需的时间。

Python实现:
def ChebyshevDistance(x, y):
    import numpy as np
    x = np.array(x)
    y = np.array(y)
    return np.max(np.abs(x-y))

2.1.1.4 曼哈顿距离

  顾名思义,在曼哈顿街区要从一个十字路口开车到另一个十字路口,驾驶距离显然不是两点间的直线距离。这个实际驾驶距离就是“曼哈顿距离”。曼哈顿距离又叫出租车距离或“城市街区距离”(City Block distance)。其形式为:
D ( x , y ) = ∑ k = 1 n ∣ x k − y k ∣ D(x,y)=\sum_{k=1}^{n}|x_k-y_k| D(x,y)=k=1nxkyk

  该距离的意义为标准坐标系下两轴距距离之和,参考下方图片的红线:

在这里插入图片描述

其中红色的线表示的是曼哈顿距离,绿色的线表示的是欧式距离,蓝色的黄色的线表示的是等价的曼哈顿距离。

  • 二维平面两点 a ( x 1 , y 1 ) a(x_1,y_1) a(x1,y1) b ( x 2 , y 2 ) b(x_2,y_2) b(x2,y2) 间的曼哈顿距离:
    d 12 = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ d_{12}=|x_1-x_2|+|y_1-y_2| d12=x1x2+y1y2

  • n n n 维空间点 a ( x 11 , x 12 , … , x 1 n ) a(x_{11},x_{12},…,x_{1n}) a(x11,x12,,x1n) b ( x 21 , x 22 , … , x 2 n ) b(x_{21},x_{22},…,x_{2n}) b(x21,x22,,x2n) 的曼哈顿距离:

d 12 = ∑ k = 1 n ( ∣ x 1 k − x 2 k ∣ ) d_{12}=\sum_{k=1}^{n}(|x_{1k}-x_{2k}|) d12=k=1n(x1kx2k)

缺点

  • 虽然曼哈顿距离对于高维数据似乎还不错,但它是一个比欧几里得距离更不直观的测量方法,尤其是在高维数据中使用时。
  • 而且,它比欧几里得距离更容易给出一个更高的距离值,因为它不可能是最短路径。这不一定会带来问题,但你应该考虑到这一点。

用例

  • 当你的数据集有离散和/或二进制属性时,曼哈顿似乎很好用,因为它考虑到了现实中在这些属性值内可以采取的路径。以欧氏距离为例,会在两个向量之间创建一条直线,而在现实中这可能实际上是不可能的。

Python实现:

def ManhattanDistance(x, y):
    import numpy as np
    x = np.array(x)
    y = np.array(y)
    return np.sum(np.abs(x-y))

2.1.1.5 兰氏距离

  兰氏距离克服了量纲的影响,但没有考虑指标间的相关性

  兰氏距离对数据的量纲不敏感。不过兰氏距离假定变量之间相互独立没有考虑变量之间的相关性
d i j = ∑ k = 1 n ∣ x i k − x j k ∣ x i k + x j k d_{ij}=\sum_{k=1}^{n}\frac{|x_{ik}-x_{jk}|}{x_{ik}+x_{jk}} dij=k=1nxik+xjkxikxjk

  通常兰氏距离对于接近于0(大于等于0)的值的变化非常敏感。与马氏距离一样,兰氏距离对数据的量纲不敏感。

优缺点:克服了量纲的影响,但没有考虑指标间的相关性。


下面我们来看一下兰氏距离(Lance and Williams Distance)/堪培拉距离(Canberra Distance)的Python实现:

def CanberraDistance(x, y):
    import numpy as np
    x = np.array(x)
    y = np.array(y)
    n = len(x)
    d = 0
    for i in range(len(x)):
        if x[i] == 0 and y[i] == 0:
            d += 0
        else:
            d += abs(x[i] - y[i]) / (abs(x[i]) + abs(y[i]))
    return d

2.1.1.6 闵科夫斯基距离(明氏距离)

  闵可夫斯基距离不是一种距离,而是一组距离的定义。

  闵可夫斯基距离(Minkowski distance)是衡量数值点之间距离的一种非常常见的方法,假设两个n维变量 P P P Q Q Q 坐标如下:
P = ( x 1 , x 2 , … , x n )  and  Q = ( y 1 , y 2 , … , y n ) ∈ R n P=\left(x_{1}, x_{2}, \ldots, x_{n}\right) \text { and } Q=\left(y_{1}, y_{2}, \ldots, y_{n}\right) \in \mathbb{R}^{n} P=(x1,x2,,xn) and Q=(y1,y2,,yn)Rn

那么,闵可夫斯基距离定义为:
d i s t a n c e = ( ∑ i = 1 n ∣ x i − y i ∣ p ) 1 / p distance = \left(\sum_{i=1}^{n}\left|x_{i}-y_{i}\right|^{p}\right)^{1 / p} distance=(i=1nxiyip)1/p

闵科夫斯基距离需要用到参数 p p p

  • p = 1 p=1 p=1 时,就是曼哈顿距离;
  • p = 2 p=2 p=2 时,就是欧式距离;
  • p → ∞ p→∞ p 时,就是切比雪夫距离;

闵氏距离,包括曼哈顿距离、欧氏距离和切比雪夫距离都存在明显的缺点。

举个例子:二维样本(身高,体重),其中身高范围是150 ~ 190,体重范围是50 ~ 60,有三个样本:a(180,50),b(190,50),c(180,60)。那么a与b之间的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c之间的闵氏距离,但是身高的10cm真的等价于体重的10kg么?因此用闵氏距离来衡量这些样本间的相似度很有问题。

闵氏距离的缺点主要有两个:

  • (1) 将各个分量的量纲(scale),也就是“单位”当作相同的看待了
  • (2) 没有考虑各个分量的分布(期望,方差等)可能是不同的。

闵可夫斯基距离的Python实现,其中p pp为闵可夫斯基距离的参数:

def MinkowskiDistance(x, y, p):
    import math
    import numpy as np
    zipped_coordinate = zip(x, y)
    return math.pow(np.sum([math.pow(np.abs(i[0]-i[1]), p) for i in zipped_coordinate]), 1/p)

2.1.1.7 马氏距离

  马氏距离(Mahalanobis Distance)是度量学习中一种常用的距离指标,同欧氏距离、曼哈顿距离、汉明距离等一样被用作评定数据之间的相似度指标。但却可以应对高维线性分布的数据中各维度间非独立同分布的问题

  马氏距离(Mahalanobis Distance)是一种距离的度量,表示点与一个分布之间的距离。它是一种有效的计算两个未知样本集的相似度的方法可以看作是欧氏距离的一种修正,修正了欧式距离中各个维度尺度不一致且相关的问题

  马氏距离表示数据的协方差距离


  • 优点是量纲无关,考虑到变量(特性)之间的相关性
  • 缺点是:不同的特征不能差别对待,可能夸大弱特征。

  马氏距离(Mahalanobis Distance)是一种距离的度量,可以看作是欧氏距离的一种修正修正了欧式距离中各个维度尺度不一致且相关的问题


  • M M M 个样本向量 X 1 ∼ X m X_1\sim X_m X1Xm ,协方差矩阵记为 S S S ,均值记为向量 μ \mu μ ,则其中样本向量 X i X_i Xi μ \mu μ 的马氏距离为:
    d ( X i ) = ( X i − μ ) T S − 1 ( X i − μ ) d(X_i)=\sqrt{(X_i-\mu)^TS^{-1}(X_i-\mu)} d(Xi)=(Xiμ)TS1(Xiμ)
    则单个数据点马氏距离:
    D M ( x ) = ( x − μ ) T S − 1 ( x − μ ) D_{M}(x)=\sqrt{(x-\mu)^{T} S^{-1}(x-\mu)} DM(x)=(xμ)TS1(xμ)
    数据点 x , y x, y x,y 之间的马氏距离:
    D M ( x , y ) = ( x − y ) T S − 1 ( x − y ) D_{M}(x, y)=\sqrt{(x-y)^{T} S^{-1}(x-y)} DM(x,y)=(xy)TS1(xy)

  • 两个向量 X i X_i Xi X j X_j Xj 的马氏距离定义为:
    d ( X i , X j ) = ( X i − X j ) T S − 1 ( X i − X j ) d(X_i,X_j)=\sqrt{(X_i-X_j)^TS^{-1}(X_i-X_j)} d(XiXj=(XiXj)TS1(XiXj)

如果协方差矩阵是单位矩阵,也就是各维度(向量)独立同分布,马氏距离就变成了欧氏距离,公式就成了:
d ( X i , X j ) = ( X i − X j ) T ( X i − X j ) d(X_i,X_j)=\sqrt{(X_i-X_j)^T(X_i-X_j)} d(XiXj=(XiXj)T(XiXj)

也就是欧式距离。
若协方差矩阵是对角矩阵,公式变成了标准化欧式距离。

通过协方差矩阵,马氏距离考虑到了各个属性之间的联系。马氏距离在非奇异变换下是不变的,可用来检测异常值(outliers)

  马氏距离最典型的应用是根据距离做判别,假设有 n n n 个总体,计算某个样品 X X X 归属于哪一类。此时虽然样品 X X X 离某个总体的欧氏距离最近,但是未必归属它,比如该总体的方差很小,说明需要非常近才能归为该类。对于这种情况,马氏距离比欧氏距离更适合作判别。

适用场合:

  • 1、度量两个服从同一分布并且其协方差矩阵为 C C C 的随机变量 X X X Y Y Y 的差异程度
  • 2、度量 X X X 与某一类的均值向量的差异程度,判别样本的归属。此时, Y Y Y 为类均值向量.

优缺点

  • 优点:
    兰氏距离是一个无量纲的量,克服了闵可夫斯基距离与各指标的量纲有关的缺点,且兰氏距离对大的离群点不敏感,这使其特别适合高度偏移的和数据
  • 缺点:
    夸大了变化微小的变量的作用


    马氏距离还不受量纲的影响,两点之间的马氏距离与原始数据的测量单位无关。由标准化数据和中心化数据计算出的二点之间的马氏距离相同。马氏距离还可以排除变量之间的相关性的干扰,但它的缺点是夸大了变化微小的变量的作用


    闵科夫斯基距离和兰氏距离都是假定变量之间相互独立,即在正交空间中讨论距离,但在实际问题中,变量之间往往存在着一定的相关性,为克服变量之间相关性的影响,可以采用马氏距离

Python实现:

def MahalanobisDistance(x, y):
    '''
    马氏居立中的(x,y)与欧几里得距离的(x,y)不同,欧几里得距离中的(x,y)指2个样本,每个样本的维数为x或y的维数;这里的(x,y)指向量是2维的,样本个数为x或y的维数,若要计算n维变量间的马氏距离则需要改变输入的参数如(x,y,z)为3维变量。
    '''
    import numpy as np
    x = np.array(x)
    y = np.array(y)
    
    X = np.vstack([x,y])
    X_T = X.T
    sigma = np.cov(X)
    sigma_inverse = np.linalg.inv(sigma)
    
    d1=[]
    for i in range(0, X_T.shape[0]):
        for j in range(i+1, X_T.shape[0]):
            delta = X_T[i] - X_T[j]
            d = np.sqrt(np.dot(np.dot(delta,sigma_inverse),delta.T))
            d1.append(d)

2.1.2 相似性系数

2.1.2.1 夹角余弦
  • a. 在二维空间中向量 A ( x 1 , y 1 ) A(x_1,y_1) A(x1,y1) 与向量 B ( x 2 , y 2 ) B(x_2,y_2) B(x2,y2) 的夹角余弦公式:
    c o s θ = x 1 x 2 + y 1 y 2 x 1 2 + y 1 2 x 2 2 + y 2 2 cos\theta=\frac{x_1x_2+y_1y_2}{\sqrt{x_1^2+y_1^2}\sqrt{x_2^2+y_2^2}} cosθ=x12+y12 x22+y22 x1x2+y1y2

  • b. N N N 维样本点 A ( x 11 , x 12 , … , x 1 n ) A(x_{11},x_{12},…,x_{1n}) A(x11,x12,,x1n) B ( x 21 , x 22 , … , x 2 n ) B(x_{21},x_{22},…,x_{2n}) B(x21,x22,,x2n) 的夹角余弦:
    c o s θ = A B ∣ A ∣ ∣ B ∣ cos\theta=\frac{AB}{|A||B|} cosθ=A∣∣BAB

c o s θ = ∑ k = 1 n x 1 k x 2 k ∑ k = 1 n x 1 k 2 ∑ k = 1 n x 2 k 2 cos \theta = \frac{\sum_{k=1}^{n}x_{1k}x_{2k}}{\sqrt{\sum_{k=1}^{n}x_{1k}^2}\sqrt{\sum_{k=1}^{n}x_{2k}^2}} cosθ=k=1nx1k2 k=1nx2k2 k=1nx1kx2k
在这里插入图片描述

要注意,余弦度量的不是两者的相异度,而是相似度 c o s θ cosθ cosθ 余弦值的取值范围 [-1,1]。

  • 夹角余弦越大,表示两个向量的夹角越小越相似
  • 夹角余弦越小,表示两个向量之间的夹角越大越不相似

  • 应用场景:如文本分类时,两文本之间距离计算。

缺点

  • 余弦相似性的一个主要缺点是不考虑向量的大小只考虑其方向
  • 在实际应用中,这意味着值的差异没有被完全考虑。以推荐系统为例,那么余弦相似性并没有考虑到不同用户之间的评分等级差异。

用例

  • 当我们有高维数据且向量的大小并不重要时,我们经常使用余弦相似度。对于文本分析来说,当数据用字数来表示时,这种测量方法是很常用的。
  • 例如,当一个词在一个文档中出现的频率高于另一个文档时,这并不一定意味着一个文档与该词的关系更大。可能是文档的长度不均匀,计数的大小就不那么重要了。那么,我们最好是使用不考虑大小的余弦相似性。

Python实现:

def CosineDistance(x, y):
    import numpy as np
    x = np.array(x)
    y = np.array(y)
    return np.dot(x,y)/(np.linalg.norm(x)*np.linalg.norm(y))

2.1.2.2 修正的余弦相似性

  为什么需要在余弦相似度的基础上使用修正余弦相似度?

X X X Y Y Y 两个用户对两个内容的评分分别为(1,2)和(4,5),使用余弦相似度得到的结果是0.98,两者极为相似。但从评分上看 X X X 似乎不喜欢这2个内容,而 Y Y Y 则比较喜欢,余弦相似度对数值的不敏感导致了结果的误差,需要修正这种不合理性。


  修正cosine相似度的目的是解决 c o s θ cosθ cosθ 相似度仅考虑向量维度方向上的相似而没考虑到各个维度的量纲的差异性,所以在计算相似度的时候,做了每个维度减去均值的修正操作
s i m ( i , j ) = ∑ c ∈ I j ( R i , c − R ˉ i ) ( R j , c − R ˉ j ) ∑ c ∈ I j ( R i , c − R ˉ i ) 2 ∑ c ∈ I j ( R j , c − R ˉ j ) 2 sim(i,j)=\frac{\sum_{c\in I_j}(R_{i,c}-\bar{R}_i)(R_{j,c}-\bar{R}_j)}{\sqrt{\sum_{c\in I_j}(R_{i,c}-\bar{R}_i)^2}\sqrt{\sum_{c\in I_j}(R_{j,c}-\bar{R}_j)^2}} sim(i,j)=cIj(Ri,cRˉi)2 cIj(Rj,cRˉj)2 cIj(Ri,cRˉi)(Rj,cRˉj)


2.1.2.3 皮尔森相关系数

  皮尔逊相关系数(Pearson correlation coefficient)用于度量两个变量X和Y之间的相关程度(线性相关),其值介于-1与1之间。在自然科学领域中,该系数广泛用于度量两个变量之间的线性相关程度

两个变量之间的皮尔逊相关系数定义为两个变量的协方差除以它们的标准差的乘积:

在这里插入图片描述

  皮尔逊距离度量的是两个变量 X X X Y Y Y,它可以根据皮尔逊系数定义成
d X , Y = 1 − ρ X , Y d_{X,Y}=1-\rho_{X,Y} dX,Y=1ρX,Y

  可以发现,皮尔逊系数落在[-1,1],而皮尔逊距离落在 [0,2]。


2.2 二元变量

  只有两个状态(0或1)的变量称为二元变量。二元变量分为对称的和非对称的两种。如果假设所有的二元变量有相同的权重,则可以得到一个两行两列( 2 × 2 2 \times 2 2×2)的条件表。
在这里插入图片描述

  • q q q 表示在对象 i i i 和对象 j j j 中均取1的二值变量个数;
  • r r r 表示在对象 i i i 取1但对象 j j j 中取0的二值变量个数;
  • s s s 表示在对象 i i i 中取0而在对象 j j j 中取1的二值变量个数;
  • t t t 则表示在对象 i i i 和对象 j j j 中均取0的二值变量个数。
    二值变量的总数为 p p p,则: p = q + r + s + t p=q+r+s+t p=q+r+s+t

2.2.1 对称的二元变量

  两个状态是同等价值的,具有同样的权重,例如属性“性别”,有两个值“女性”和“男性”,两个取值都没有优先权。这类变量通常用简单匹配系数计算:
d ( i , j ) = r + s q + r + s + t d(i,j)=\frac{r+s}{q+r+s+t} d(i,j)=q+r+s+tr+s

其中,中 r r r i i i j j j 取值不相同的属性的个数; s s s i i i j j j 取值相同的属性的个数。


2.2.2 不对称的二元变量

  两个状态具有不同权重。如一个疾病disease的测试结果positive或negative,显然这两个测试结果的重要性是不一样的。对于非对称的二元变量之间相似度的度量最著名的有Jaccard系数:
d ( i , j ) = r + s q + r + s d(i,j)=\frac{r+s}{q+r+s} d(i,j)=q+r+sr+s


2.3 类别变量(标称变量)

  标称变量是二元变量的推广,可具有多于两个的状态值,如颜色变量(红、橙、黄、绿、蓝等)。两个对象 i i i j j j 之间的相异性可以根据不匹配率来计算:
d ( i , j ) = p − m p d(i,j)=\frac{p-m}{p} d(i,j)=ppm

其中, m m m 是匹配的数目(即对象 i i i j j j 取值相同的属性数),而 p p p是刻画对象的属性总数,我们可以通过赋予 m m m 较大的权重来增加 m m m 的影响。

例如,包含标称属性的表,只有一个标称属性, p p p 值等于1,设置 m m m 值为1:

在这里插入图片描述

在这里插入图片描述

2.4 顺序变量

  顺序变量类似于标称变量,不过序数型变量的各个状态是以有意义的序列排序的。

  通常,可以将序数型变量的值映射为秩。计算两个对象 i i i j j j 相异度的时候,用相应的秩代替实际取值,并标准化到 [0,1] 区间,之后利用距离度量方法进行计算

  假设 f f f 是用于描述 n n n个对象的一组顺序变量之一,关于 f f f 的相异度计算如下:

  • i i i 个对象的 f f f 变量值标记为 x i f x_{if} xif,变量 f f f M f M_f Mf 个有序状态,可以利用等级 1 , 2 , ⋯   , M f 1,2,\cdots,M_f 1,2,,Mf 分别替换相应的 x i f x_{if} xif,得到相应的 r i f , r i f ∈ 1 , 2 , ⋯   , M f r_{if},r_{if} \in{1,2,\cdots,M_f} rifrif1,2,,Mf
  • 由于每个顺序比那里的状态个数可能不同。因此有必要将每个顺序变量的取值分为映射到 [0,1] 区间,以便使每个变量的权值相同。可以通过将第 i i i 个对象中的第 f f f 个变量的 r i f r_{if} rif 用以下所计算得到的值来替换:
    z i f = r i f − 1 M f − 1 z_{if}=\frac{r_{if}-1}{M_f -1} zif=Mf1rif1
    接下来就可以用区间标度变量中所描述的任意一组距离度量方法进行计算相异度。

2.5 比例标度型变量

  比例标度型变量在非线性的标度上取正的度量值,例如指数标度:
A e B t 或 A e − B t Ae^{Bt} \quad 或\quad Ae^{-Bt} AeBtAeBt

其中 A A A B B B 为正的常数。典型例子包括:细菌繁殖增长的数目描述,或放射元素的衰减。

在计算比例数值变量所描述对象间的距离时,有两种处理方法:

  • 1)将比例数值变量看作区间标度变量,采用相同的方法处理,但不佳,因为比例尺度是非线性的;
  • 2)采用对数变换
    Y i f = l o g ( x i f ) Y_{if}=log(x_{if}) Yif=log(xif)
    对比例数值变量进行处理,然后将 Y i f Y_{if} Yif 当做区间标度变量来处理。

2.6 混合类型

  在实际数据库中,数据对象往往是用复合数据类型来描述的,而且常常包括以上六种数据类型:区间标度变量、对称二元变量、不对称二元变量、符号类型、顺序类型和比例数值类型

  • 1)一种方法是将变量按类型分组,对每种类型的变量单独聚类分析,如果分析得对兼容的结果,这种方法可行,但实际中,往往不可行。
  • 2)一种更可取的方法是将所有的变量一起处理,只进行一次聚类分析。

  一种技术是将不同类型的变量组合在单个相异度矩阵中,把所有有意义的变量转换到共同的值域区间 [0,1] 上。假设数据集包含 p p p 个不同类型的变量,对象 i i i j j j 间的相异度 d ( i , j ) d(i,j) d(i,j) 定义为:

d ( i , j ) = ∑ f = 1 p δ i j ( f ) d i j ( f ) ∑ f = 1 p δ i j ( f ) d(i,j)=\frac{\sum_{f=1}^{p}\delta_{ij}^{(f)}d_{ij}^{(f)}}{\sum_{f=1}^{p}\delta_{ij}^{(f)}} d(i,j)=f=1pδij(f)f=1pδij(f)dij(f)

其中, 指示符 δ i j ( f ) = 0 \delta_{ij}^{(f)}=0 δij(f)=0 ,如果 x i f x_{if} xif x j f x_{jf} xjf 缺失(即对象 i i i 或对象 j j j 没有属性 f f f 的度量值),或 x i f = x j f = 0 x_{if}=x_{jf}=0 xif=xjf=0,并且 f f f 是非对称的二元属性;否则,指示符 δ i j ( f ) = 1 \delta_{ij}^{(f)}=1 δij(f)=1。属性 f f f i i i j j j 之间相异性的贡献 δ i j ( f ) = 0 \delta_{ij}^{(f)}=0 δij(f)=0 根据它的类型计算:

  • f f f 是数值的:
    d i j ( f ) = ∣ x i f − x j f ∣ m a x h x h f − m i n h x h f d_{ij}^{(f)}=\frac{|x_{if}-x_{jf}|}{max_hx_{hf}-min_hx_{hf}} dij(f)=maxhxhfminhxhfxifxjf
    其中 h h h 遍取属性 f f f 的所有非缺失对象。
  • f f f 是标称或二元的:如果 x i f = x j f x_{if}=x_{jf} xif=xjf,则 d i j ( f ) = 0 d_{ij}^{(f)}=0 dij(f)=0 ,否则 d i j ( f ) = 1 d_{ij}^{(f)}=1 dij(f)=1
  • f f f 是序数的:计算排位 r i f r_{if} rif z i f = r i f − 1 M f − 1 z_{if}=\frac{r_{if}-1}{M_f-1} zif=Mf1rif1,并将 z i f z_{if} zif 作为数值属性对待

  对数值属性进行规范化处理,把变量值映射到区间 [0.0, 1.0],使得所有的属性值都映射到区间 [0.0, 1.0],然后再计算数值属性的距离。


3 模型评估

  在做海量数据聚类分析(MiniBatch Kmeans)的时候,常常因为数据量太大画不出 dendrogram,没办法用 Elbow Method 确定 K 值。这时需要其他 metrics 辅助确定 K 值。在做聚类之前,一定要先做 去重啊!

  受算法选择、算法参数设置、算法随机性等影响,聚类有效性会出现差异。

概括地说,评估聚类的方法主要有两种:

  • 内部评估方法:不需要借助其他监督数据,通过一个单一的量化得分评估算法好坏
  • 外部评估方法:需要知道数据的类别,通过将聚类结果与groundtruth进行对比,评估算法好坏

实际生产环境中,很少有标注数据帮助我们进行聚类,因为很难人为地确定到底有多少个簇,簇之间的区别不是很明显,特别是对于文本数据。


3.1 内部评价指标

内部评估方法有:

  • Silhouette Coefficient(也叫轮廓系数)
  • Calinski-Harbasz Score(CH)
  • Davies-Boulding(DBI)

紧密度(Compactness):每个聚类簇中的样本点到聚类中心的平均距离。对应聚类结果,需要使用所有簇的紧密度的平均值来衡量聚类算法和聚类各参数选取的优劣。紧密度越小,表示簇内的样本点越集中,样本点之间聚类越短,也就是说簇内相似度越高。


分割度(Seperation):是个簇的簇心之间的平均距离。分割度值越大说明簇间间隔越远,分类效果越好,即簇间相似度越低。


戴维森堡丁指数(Davies-bouldin Index,DBI):该指标用来衡量任意两个簇的簇内距离与簇间距离之比。该指标越小表示簇内距离越小,簇内相似度越高,簇间距离越大,簇间相似度低。


邓恩指数(Dunn ValidityIndex,DVI):任意两个簇的样本点的最短距离与任意簇中样本点的最大距离之商。该值越大,聚类效果越好。


轮廓系数 (Silhouette Coefficient):对于一个样本集合,它的轮廓系数是所有样本轮廓系数的平均值。轮廓系数的取值范围是[-1,1],同类别样本距离越相近不同类别样本距离越远,分数越高。

  当样本的真实标签未知时,聚类有效性可以通过内部评价指标进行评估。

  聚类内部评价指标通过计算聚类结果的类内样本紧密程度或类间样本疏远程度来评价聚类结果优劣


3.1.1 误差平方和(SSE)

  举例:(下图中数据-0.2, 0.4, -0.8, 1.3, -0.7, 均为真实值和预测值的差)

在这里插入图片描述

在k-means中的应用:
S S E = ∑ i = 1 k ∑ p ∈ C i ∣ p − m i ∣ 2 SSE=\sum_{i=1}^{k}\sum_{p \in C_i}|p-m_i|^2 SSE=i=1kpCipmi2

在这里插入图片描述

公式各部分内容:
在这里插入图片描述
k k k 为2类, m m m 代表当前 c c c 类的聚心/质心, p p p c c c 类中所有点】


上图中: k=2

  • SSE图最终的结果,对图松散度的衡量。(eg: SSE(左图)<SSE(右图))
  • SSE随着聚类迭代,其值会越来越小,直到最后趋于稳定: 【SSE越小越好】

在这里插入图片描述

  • 如果质心的初始值选择不好,SSE只会达到一个不怎么好的局部最优解。 【初始点的选择对最后结果的影响比较大】

在这里插入图片描述
像上图这种情况可以用肘部法则。


3.1.2 肘部法则(Elbow Method)

肘部法则: 通过图形大致的估计出最优的聚类数量。

各个类畸变程度之和:各个类的畸变程度等于该类重心与其内部成员位置距离的平方和:假设将 n n n 个样本划分到 K K K 个类中( K ≤ n − 1 K \leq n-1 Kn1,即至少有一类中有两个元素)

C k C_k Ck 表示第 k k k 个类( k = 1 , 2 , ⋯   , K k=1,2,\cdots,K k=1,2,,K),且该类重心位置记为 u k u_k uk ,那么第 k k k 个类的畸变程度为:
∑ i ∈ C k ∣ x i − u k ∣ 2 \sum_{i \in C_k}|x_i-u_k|^2 iCkxiuk2
这里的绝对值符号的意义表示的是距离,可视为一种广义的记号。

定义所有类的总畸变程度:
J = ∑ k = 1 K ∑ i ∈ C k ∣ x i − u k ∣ 2 J=\sum_{k=1}^{K}\sum_{i \in C_k}|x_i-u_k|^2 J=k=1KiCkxiuk2
在部多元统计教材中, J J J 又被称为聚合系数。
聚合系数折线图:横坐标为聚类的类别数 K K K,纵坐标为聚合系数 J J J
在这里插入图片描述

  • (1)对于 n n n 个点的数据集,迭代计算 k k k from 1 to n n n,每次聚类完成后计算每个点到其所属的簇中心的距离的平方和;
  • (2)平方和是会逐渐变小的,直到 k = n k=n k=n时平方和为 0,因为每个点都是它所在的簇中心本身。
  • (3)在这个平方和变化过程中,会出现一个拐点也即“肘”点, 下降率突然变缓时即认为是最佳的 k k k 值。

3.1.3 轮廓系数法(Silhouette Coefficient)

  在大部分的情况下,是对没有真实标签的数据进行探索,也就是对不知道真正答案的数据进行聚类。这样的聚类,是完全依赖于评价簇内的稠密程度(簇内差异小)和簇间的离散程度(簇外差异大)来评估聚类的效果。其中轮廓系数是最常用的聚类算法的评价指标。它是对每个样本来定义的,它能够同时衡量:

  • 样本与其自身所在的簇中的其他样本的相似度 a a a,等于样本与同一簇中所有其他点之间的平均距离。
  • 样本与其他簇中的样本的相似度 b b b,等于样本与下一个最近的簇中的所有点之间的平均距离。

  根据聚类“簇内差异小,簇外差异大”的原则,我们希望 b b b 永远大于 a a a,并且大得越多越好。单个样本的轮廓系数计算为:
s ( i ) = b ( i ) − a ( i ) max ⁡ { a ( i ) , b ( i ) } s(i)=\frac{b(i)-a(i)}{\max \{a(i), b(i)\}} s(i)=max{a(i),b(i)}b(i)a(i)

目的: 内部距离最小化,外部距离最大化

  轮廓系数法结合了聚类的凝聚度(Cohesion)和分离度(Separation),用于评估聚类的效果:
在这里插入图片描述

a ( i ) a(i) a(i) 表示样本 i i i 与其所在簇内其他样本的平均距离, b ( i ) b(i) b(i) 表示样本 i i i 与其他簇样本的平均距离。聚类总的轮廓系数 S C SC SC 为:
S C = 1 N ∑ i = 1 N s ( i ) SC=\frac{1}{N}\sum_{i=1}^{N}s(i) SC=N1i=1Ns(i)

轮廓系数取值范围为[-1,1],取值越接近1则说明聚类性能越好,表明簇内样本的距离越近,簇间样本距离越远;相反,取值越接近-1则说明聚类性能越差。轮廓系数最高的簇的数量表示簇的数量的最佳选择


案例

下图是500个样本含有2个feature的数据分布情况,我们对它进行SC系数效果衡量:

在这里插入图片描述

  • n_clusters = 2 The average silhouette_score is : 0.7049787496083262
  • n_clusters = 3 The average silhouette_score is : 0.5882004012129721
  • n_clusters = 4 The average silhouette_score is : 0.6505186632729437
  • n_clusters = 5 The average silhouette_score is : 0.56376469026194
  • n_clusters = 6 The average silhouette_score is : 0.4504666294372765

n_clusters 分别为 2,3,4,5,6时,SC系数如下,是介于[-1,1]之间的度量指标:

  每次聚类后,每个样本都会得到一个轮廓系数,当它为1时,说明这个点与周围簇距离较远,结果非常好,当它为0,说明这个点可能处在两个簇的边界上,当值为负时,暗含该点可能被误分了。

从平均SC系数结果来看,K取3,5,6是不好的,那么2和4呢?

k=2的情况:
在这里插入图片描述

k=4的情况:
在这里插入图片描述

  • n_clusters = 2时,第0簇的宽度远宽于第1簇;
  • n_clusters = 4时,所聚的簇宽度相差不大,因此选择K=4,作为最终聚类个数。

【分的时候每一簇的个数不能相差太大,因此此时应该选择k=4】

from sklearn.metrics import silhouette_score
 
# 计算轮廓系数
# 代码中的 X 表示样本数据,pre_labels 表示聚类之后的预测。最终返回的是一个数据集中,所有样本的轮廓系数的均值。
silhouette_score(X, y_pred)


缺点:

  每种评估方法都各有优缺点,因为 Silhouette Coefficient 的计算复杂度太高,即使在 GPU 的机器上,跑 30w 数据跑了1个小时还没跑出来,所以考虑 Calinski-Harbasz Score,Calinski-Harbasz Score 的优点就在于计算速度非常快


3.1.4 CH系数(Calinski-Harabasz Score)

  CHI 全称 Calinski-Harabaz Index,译为卡林斯基-哈拉巴斯指数,最终的得分定义为 组间分散度与组内分散度的比值

  类别内部数据的协方差越小越好,类别之间的协方差越大越好(换句话说:类别内部数据的距离平方和越小越好,类别之间的距离平方和越大越好),这样的Calinski-Harabasz分数 s s s 会高,分数 s s s 高则聚类效果越好。

Calinski-Harabasz 分数值 s s s 的数学计算公式是:
s = S S B k − 1 S S W N − k = t r ( B k ) t r ( W k ) × n E − k k − 1 s=\frac{\frac{SS_B}{k-1}}{\frac{SS_W}{N-k}}=\frac{tr(B_k)}{tr(W_k)} \times \frac{n_E -k}{k-1} s=NkSSWk1SSB=tr(Wk)tr(Bk)×k1nEk

  • k k k 代表聚类类别数, N N N 代表全部数据数目
  • S S B SS_B SSB 是类间方差, S S W SS_W SSW 是类内方差
  • B k B_k Bk为类别之间的协方差矩阵,即类间距离(between-clusters dispersion mean)
  • W k W_k Wk 为内部数据的协方差矩阵,即类内部的距离(within-cluster dispersion)
  • n E n_E nE为训练样本数
  • t r tr tr 为矩阵的迹

在这里插入图片描述

使用矩阵的迹进行求解的理解:矩阵的对角线可以表示一个物体的相似性。

  在机器学习里,主要为了获取数据的特征值,那么就是说,在任何一个矩阵计算出来之后,都可以简单化,只要获取矩阵的迹,就可以表示这一块数据的最重要的特征了,这样就可以把很多无关紧要的数据删除掉,达到简化数据,提高处理速度。

CH需要达到的目的:用尽量少的类别聚类尽量多的样本,同时获得较好的聚类效果

  在实际使用的过程中,发现类别越少,Calinski-Harbasz Score的分数越高,当k=2时,分数达到最高。但是30w数据分成2类也太敷衍了吧(抓狂)!于是开始研究这个metrics到底在评估什么东西。结论,当上述情况发生的时候,需要一个个K值去测试,找到一个local maxium(局部最高)的分数,这个分数对应的K值就是当前最佳的分类。

优点:

  • 在真实的分群 label 不知道的情况下,可以作为评估模型的一个指标。
  • 与轮廓系数的对比,笔者觉得最大的优势:快!相差几百倍!毫秒级。

同时,数值越小可以理解为:组间协方差很小,组与组之间界限不明显


from sklearn.metrics import calinski_harabaz_score
 
# 计算 CHI
# 因为计算方式的原因,CHI 的计算比轮廓系数快了一倍多,所以在选择评价标准的时候可以优先选择 CHI。
calinski_harabaz_score(X, y_pred)

3.1.5 Davies-Boulding(DBI)

  戴维森堡丁指数(Davies-Bouldin index,DBI) ,又称为分类适确性指标,是由 大卫L·戴维斯 和 唐纳德·Bouldin 提出的一种评估聚类算法优劣的指标。

  综合考虑了类内样本相似度以及类间样本差异度其值越小表征聚类有效性越高 ,假设我们有 m m m 个序列,将这些序列通过算法聚为 n n n 类,使用 DBI 聚类效果评价方法。具体定义如下:
D B I = 1 N ∑ i = 1 N m a x j ≠ i S i ‾ + S j ‾ ∥ w i − w j ∥ 2 DBI=\frac{1}{N}\sum_{i=1}^{N}\underset{j \neq i}{max}\frac{\overline{S_i}+\overline{S_j}}{\left \| w_i-w_j \right \|^2} DBI=N1i=1Nj=imaxwiwj2Si+Sj

其中,

  • D B I DBI DBI 表示 DBI 指标值;
  • S i ‾ \overline{S_i} Si i i i 类样本到其类中心的平均欧氏距离;
  • ∥ w i − w j ∥ 2 \left\| w_i-w_j\right\|^2 wiwj2为第 i i i 和第 j j j 类的类中心欧氏距离。

分类个数的不同可以导致不同的值,DBI 值越小,分类效果越好(说明分散程度越低)


以上提到的方法都是针对聚类样本是没有标签的,下面提到的是针对聚类样本已知真实标签的评估方法,一般已知真实标签更多用分类模型。


3.2 外部评价指标

外部评估方法有:

  • 纯度(Purity) Jaccard系数
  • (Jaccard Coefficient, JC)
  • FM指数(Fowlkes and MallowsIndex, FMI)
  • Rand指数(Rand Index, RI)兰德系数
  • F值(F-measure)

3.2.1 兰德系数

  兰德系数(Rand index)需要给定实际类别信息 C C C,假设 K K K是聚类结果。

  • a:在C与K中都是同类别的元素对数
  • b:在C与K中都是不同类别的元素对数

则兰德系数为:
R I = a + b C 2 n samples  R I=\frac{a+b}{C_{2}^{n_{\text {samples }}}} RI=C2nsamples a+b

  • 分母:任意两个样本为一类有多少种组合,是数据集中可以组成的总元素对数;
  • 分子:属性一致的样本数,即同属于这一类或都不属于这一类。
  • a a a 是真实在同一类、预测也在同一类的样本数; b b b 是真实在不同类、预测也在不同类的样本数。

R I RI RI 取值范围为[0,1],值越大意味着聚类结果与真实情况越吻合


3.2.2 调整兰德系数

  对于随机结果, R I RI RI 并不能保证分数接近零。为了实现“在聚类结果随机产生的情况下,指标应该接近零”,调整兰德系数(Adjusted rand index)被提出,它具有更高的区分度:
A R I = R I − E [ R I ] m a x ( R I ) − E [ R I ] ARI= \frac{RI−E[RI]}{max(RI)−E[RI]} ARI=max(RI)E[RI]RIE[RI]

ARI 取值范围为 [-1,1]值越大意味着聚类结果与真实情况越吻合。即 ARI 越接近 1 越好。.从广义的角度来讲,ARI衡量的是两个数据分布的吻合程度。

优缺点分析:

  • 对任意数量的聚类中心和样本数,随机聚类的ARI都非常接近于0
  • ARI需要真实标签
  • 可用于聚类算法之间的比较

from sklearn.metrics import adjusted_rand_score
 
# 计算 ARI
adjusted_rand_score([0,0,0,1,1,1], [0,0,1,1,2,2])
 
# 输出
0.24242424242424246

3.2.3 调整互信息分

互信息评分(Mutual Information based scores)与调整互信息( Adjusted mutual information):


  调整互信息分:Adjusted mutual info score 简称 AMI,是互信息分 MI 的优化,MI 随着分配簇的个数增加而增加。


  互信息也是用来衡量两个数据吻合程度。假设 U U U V V V 是对 N N N 个样本标签的分配情况,则两种分布的熵(熵表示的是不确定程度)分别为:

H ( U ) = ∑ i = 1 ∣ U ∣ P ( i ) l o g ( P ( i ) ) , H ( V ) = ∑ j = 1 ∣ V ∣ P ′ ( j ) l o g ( P ′ ( j ) ) H(U)=\sum_{i=1}^{|U|}P(i)log(P(i)),\quad H(V)=\sum_{j=1}^{|V|}P'(j)log(P'(j)) H(U)=i=1UP(i)log(P(i))H(V)=j=1VP(j)log(P(j))

其中, P ( i ) = ∣ U i ∣ N P(i)=\frac{|U_i|}{N} P(i)=NUi P ′ ( j ) = ∣ V j ∣ N P'(j)=\frac{|V_j|}{N} P(j)=NVj U U U V V V 之间的互信息 (MI)定义为:

M I ( U , V ) = ∑ i = 1 ∣ U ∣ ∑ j = 1 ∣ V ∣ P ( i , j ) l o g ( P ( i , j ) P ( i ) P ′ ( j ) ) MI(U,V)=\sum_{i=1}^{|U|}\sum_{j=1}^{|V|}P(i,j)log \left ( \frac{P(i,j)}{P(i)P'(j)} \right ) MI(U,V)=i=1Uj=1VP(i,j)log(P(i)P(j)P(i,j))

其中 P ( i , j ) = ∣ U i ∩ V j ∣ N P(i,j)=\frac{|U_i\cap V_j|}{N} P(i,j)=NUiVj,标准化后的互信息为:
N M I = M I ( U , V ) H ( U ) H ( V ) NMI=\frac{MI(U,V)}{\sqrt{H(U)H(V)}} NMI=H(U)H(V) MI(U,V)

与 ARI 类似,调整互信息定义为:
A M I = M I − E [ M I ] m a x ( H ( U ) H ( V ) ) − E [ M I ] AMI=\frac{MI-E[MI]}{max(H(U)H(V))-E[MI]} AMI=max(H(U)H(V))E[MI]MIE[MI]

  利用基于互信息的方法来衡量聚类效果需要实际类别信息,MI 取值范围为[0,1],AMI 取值范围为[-1,1],它们都是值越大意味着聚类结果与真实情况越吻合。


  • 优点:除取值范围在[0,1]之间,其他同 ARI,可用于聚类模型选择;
  • 缺点:需要先验知识。(看sklearn上的例子,貌似需要输入已知标签和预测标签,这就有点麻烦

  AMI 是基于预测簇向量与真实簇向量的互信息分数来衡量其相似度的,AMI 越大相似度越高,AMI 接近于0 表示簇向量是随机分配的。AMI 越接近 1 越好。

同样,在 sklearn 中,可以通过调用 metrics 模块下的方法计算,代码如下:

from sklearn.metrics import adjusted_mutual_info_score

labels_true = [0, 0, 0, 1, 1, 1]
labels_pred = [0, 0, 1, 1, 2, 2]

# 计算 AMI
adjusted_mutual_info_score(labels_true,labels_pred)  

# 输出
0.29879245817089006

3.2.4 同质性、完整性和 V-measure

  同质性和完整性是 基于条件熵 的互信息分数来衡量簇向量间的相似度,V-meansure 是同质性和完整性的调和平均

  • 同质性:homogeneity,指的是每个簇只包含单个类成员。其实也可以认为就是正确率,表示每个聚类簇中正确分类的样本数占该聚类簇总样本数的比例和;

  • 完整性:completeness,给定类的所有成员分配给同一类簇,也就是每个聚类簇中正确分类的样本数占类型的总样本数比例的和。

  V-measure 是结合同质性和完整性两个因素来评价簇向量间的相似度,V-measure 越接近 1 越好

同样的,给代码:

from sklearn.metrics import homogeneity_score
 
# 计算 V-measure
homogeneity_score([0,0,0,1,1,1], [0,0,1,1,2,2])
 
# 输出
0.6666666666666669

总结一下

  常见的模型评估方法就算是介绍完了,总算松了一口气,赶紧总结一下:

▶1. 分类模型

  在分类模型中,有直接结果的输出,而且对于结果我们有明确的定义:是or否,所以我们可以使用预测的 准确度、召回率、混淆矩阵、roc 曲线 等指标来进行评估。

▶2. 回归模型

  在回归模型中,同样也有直接结果的输出,对于预测结果和真实结果的误差可以用 平均均方误差、平均绝对误差、 r 2 r^2 r2 score 等指标进行评估。

▶3. 聚类模型

  在聚类模型中,当有样本真实标签时可通过 兰德系数、互信息分 等指标评估,但大多数情况下聚类样本是没有标签的,此时可以通过 轮廓系数、CHI 等指标进行评估。

  另外,分类模型评估比较常见,而且在金融风控领域对于 ROC 使用的比较多,后面抽空再分享一下 ROC 的评估过程。


参考:

技术 | 聚类分析中的各种相似度计算
7.聚类分析,相似度度量,模型评估
数据挖掘 第二篇:基于距离评估数据的相似性和相异性
聚类算法之模型评估
聚类问题的 5 种评估手段,总有一种你不知道的!附代码实现
常见距离度量方法优缺点对比!
机器学习中的数学——距离定义(一):欧几里得距离(Euclidean Distance)
内部和外部聚类算法评价指标

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值