“文章原创,转载请注明出处”
上一篇介绍了聚类分析中的KMeans算法,这一节就来具体地说说聚类分析。聚类分析,cluster analysis,是一种研究“物以类聚”现代统计学分析方法,其目的是要把分类对象按照一定的规则分成若干个类。这些类别并非事先给定的,而是根据数据的特征确定的。
NOTE:聚类的划分:
-
根据分类对象的不同,可以分为:Q型聚类分析和R型聚类分析。Q型是指对样品对象进行聚类;而R型则是对变量(属性)进行聚类。
-
按照分析方法的不同,又可以分为:系统聚类法、快速聚类法和模糊聚类法。上一篇介绍的KMeans法就是快速聚类法中的一种。
一、相似性的度量
在上一篇中,我们已经介绍过,聚类其实就是将相似度高的样品啊属性啊合并成一个类别。但是,上一篇我们仅仅给出了一种也是最简单的一种相似性的度量方式——欧式距离。这里我们详细看看相似性有哪些度量方式:
除了使用有序尺度变量(将属性划分为一级、二级等等的有次序关系的量来表示)和名义尺度变量(使用既没有等级关系,又不存在数量关系的量来表示。比如男女)之外,一般采用的测量尺度的方式就是间隔尺度变量。
间隔尺度变量即是使用连续的量来表示测量尺度,一般都是连续型的,比如欧式距离、重量等等。一般来讲,在应对Q型聚类时会使用距离去度量;而对R型聚类来说,则会使用相似系数这种方式去度量。下面来分别看一看:
a. 距离
上一篇中使用的欧氏距离即是这里的一种,在介绍各种不同的距离定义之前,首先看看距离的定义需要满足哪些条件:
- 首先,距离必须是非负的。即: dij⩾0,∀i,j ;
- 对于相同取值的样品,之间的距离必须为0。即: dij=0 ,当且仅当,第i个样品与第j个样品的各变量值相同;
- i样品到j样品的距离与j样品到i样品的距离相等。即: dij=dji,∀i,j ;
- 满足: dij⩽dik+dkj,∀i,j,k 。
下面就来看看常用的距离定义,首先看看最常用的Minkowski距离:
(1). Minkowski距离
观察这个距离可以看到,当 q=2 时,上面定义的距离就是常用的欧氏距离。另外:
- q=1 时, dij=∑pk=1∣xik−xjk∣ 称为绝对值距离;
- q=∞ 时, dij=max1⩽k⩽p∣xik−xjk∣ 称为切比雪夫距离。
Minkowski距离存在一个问题,就是当变量的单位不同或者测量值范围相差很大时,直接使用Minkowski距离效果不佳。这个时候,应该先对数据进行标准化(就是减去均值除上标准差)之后再计算距离(这个后面还会说到)。
(2). Lance距离(Lance and Williams)
当 xji>0 时,定义第i个样品到第j个样品的距离为:
从公式就可以看出来,这个距离与变量之间的单位没有什么关系;而且其对异常值也不敏感,因而适用于一些高度偏斜的数据。
(3). Mahalanobis距离(马氏距离)
上面的两种距离都没有考虑变量之间的相关性问题,马氏距离就可以考虑到这个问题。但是由于马氏距离定义的问题,在聚类分析中使用马氏距离并不合适。但是这里也还是给出马氏距离的定义:
其中 xi=(xi1,…,xip)T , xj=(xj1,…,xjp)T , S 为样本协方差阵。
注:为什么说马氏距离不适用与聚类分析呢?
聚类分析是无监督算法中的一种,无监督算法是什么?无监督算法是没有先验信息的,所有的数据拿过来是没有什么目标信息啊什么的。没有不同类之间的先验信息,那么协方差阵 S 就无法计算。因而,在实际聚类分析中,马氏距离并不适用。
(4). 斜交空间距离
其中 rkl 是变量 xk 与变量 xl 的相关系数。学过高等代数的应该可以很容易看明白这个定义。此外,当变量之间互不相关的时候,这里的 dij=[dij(2)/p]Minkowski ,也就是退化到了欧氏距离(相差一个常数倍)。
b. 相似系数
对变量进行聚类时,通常使用相似系数来考量其间的相似度。那么相似系数的定义有需要满足哪些条件呢?
- 完全相关。即: cij=±1 ,当且仅当 xi=axj+b;a(≠0),b 是常数;
- ∣cij∣⩽1,∀i,j ;
- cij=cji,∀i,j 。
下面看看常用的两种相似系数:
(1). 夹角余弦
变量 xi 和 xj 的夹角余弦的定义为:
学过解析几何应该很容易看出这个定义的含义所在,其实 cij=cosθij 。
(2). 相关系数
这里的相关系数其实就是统计里面通常所说的相关系数。其实,如果变量都是标准化了的,那么夹角余弦就是相关系数,看出来了吗?
小节
到这边,就把统计中常用的用于度量相似性的定义讲了一些。这些定义,大都有其自身的数学背景。有些来自于几何学,有些来自于线性空间理论。对于使用者来说,搞明白什么时候选择什么样的度量方式更加重要!下一篇,我们讲一讲聚类分析中的一个常用方法:系统聚类法。
转自:http://jackycode.github.io/blog/2014/04/21/cluster-analysis/