[关闭]
@JeemyJohn 2018-05-16T09:20:07.000000Z 字数 8888 阅读 3862

无监督聚类——从 K-Means 说起

达人课



0. 前言

  在第一章中,我们就介绍了机器学习最主要的两大类就是 有监督学习(Supervised Learning)无监督学习(Unsupervised Learning)。而到目前为止,我们介绍的算法全都是有监督学习方法,因此本节就来介绍一下无监督学习算法。
  
  首先,我们回顾一下什么叫无监督学习。在机器学习任务中,如果训练样本的标记信息是未知的,目标是通过对无标记训练样本的的学习来揭示数据内在的性质和规律。简单来说它与有监督学习方法的差别就在于无监督学习训练样本没有类别标签。

  无监督学习方法在现实场景中还是有很多应用的,例如在金融和计算广告等反欺诈场景中,我们是不可能能够获取大量的标签数据的,因为欺诈用户不会告诉你他是欺诈用户的。这时候,如果想要利用机器学习方法检测出他们来,只能使用无监督方法。
  
  对于无监督学习方法,基于不同的学习策略,人们已经设计出多种类型的聚类算法:原型聚类、密度聚类以及层次聚类等。为了更好地学习不同的聚类算法,我们首先共同探讨一下聚类方法涉及的两个问题:评价指标距离计算

1. 评价指标

  众所周知,对于有监督学习方法的分类预测结果,我们有很多种不同的评价指标来度量分类效果的好坏。例如,召回率、精准率、准确率、F1-Score以及AUC值等等。但是,由于无监督学习方法与有监督学习不同,绝大多数情况下,我们根本不知道它的真实类别标签,所以我们不可能完全依据有监督学习方法的评价指标来度量聚类算法。

此处输入图片的描述

图1. scikit-learn中聚类算法效果对比

  无监督聚类算法的评价指标大致可以分为两大类:一类是,聚类的结果具有某个参考模型作为人为基准进行比较,称之为外部指标;第二种是:直接考察聚类结果而不参考任何模型,称之为内部指标

1.1 外部指标

  对数据集 , 假定通过聚类算法将样本聚为 , 参考模型给出的簇划分为。相应的,令 分别表示与 对应的簇标记向量。我们将样本两两配对考虑,定义如下:

其中集合 包含了在 中属于相同的簇并且在 中也属于相同的簇的样本; 包含了在 中属于相同的簇并且在 中不属于相同的簇的样本……以此类推。对每个样本对 (i < j) 仅能出现在一个集合中,因此有

  基于以上定义,对无监督聚类算法的聚类结果我们有如下的性能度量指标:

很显然,上述指数值都在[0,1]之间,并且值越大越好。

1.2 内部指标

  对于聚类结果 , 作如下定义:

其中,用于计算两个样本间的距离代表类的样本中心。基于以上定义如下内部指标:

显然,DBI的值越小越好,而DI值越大越好。

2. 距离度量

  样本空间中两个点之间的距离度量表示的是两个样本点之间的相似程度:距离越短,表示相似程度越高;相反,距离越大,表示两个样本的相似程度低。
  
  常用的距离度量方式有:1)闵可夫斯基距离;2)欧氏距离;3)曼哈顿距离;4)切比雪夫距离;5)余弦距离。

2.1 闵可夫斯基距离

  闵可夫斯基距离不是一种距离,而是一类距离的定义。对于n维空间中的两个点 ,那么两点之间的闵可夫斯基距离为:

其中p是一个可变参数:
- 当p=1时,被称为曼哈顿距离;
- 当p=2时,被称为欧氏距离;
- 当p=时,被称为切比雪夫距离。

2.2 欧氏距离

  由以上说明可知,欧式距离的计算公式为:

欧式距离(L2范数)是最易于理解的一种距离计算方法,源自欧式空间中两点间的距离公式,也是最常用的距离度量方式。

2.3 曼哈顿距离

  由闵可夫斯基距离定义可知,曼哈顿距离的计算公式为:

3. K-Means算法

  对给定的样本集 ,K均值算法根据聚类结果划分 最小化平方误差

其中 是类 的均值向量。

  上式刻画了类内样本到类中心点 的紧密程度,MSE值越小,说明类内样本相似度越高。但是最优化上式的值是一个NP难问题,因为要精确地找到它的最优解需要对样本集D的所有划分的情况进行一一列举。因此,K-Means算法最终采用的是贪心的策略,通过迭代优化的方式来来近似求解最优 值。算法流程如下:

  • 输入: 样本集 ,最终聚类的类别树k;
  • 算法流程:
    随机选择k个样本点作为类标中心;
    Repeat
       计算每个样本点到所有类标中心点的距离;
       将所有样本点划分到距离最近的类标中心所在的类标;
       重新计算每个类的类标中心
    Until 样本点类别划分不发生变化或者达到指定的最大迭代次数

K-M.png-43.1kB

图2. K-Means聚类过程示意图(a)~(f)

4. 密度聚类方法

  基于密度的聚类(Density-Based Clustering)方法主要考虑的是样本分布的紧密程度,这里的紧密程度主要是用样本间的距离来衡量的。通常情况下,密度聚类算法从样本密度的角度来考察样本之间的可连续性,并基于可连续样本不断地扩展聚类簇以获得最终的聚类结果。接下来我们以典型的基于密度的聚类方法 DBSCAN算法 来进行讲解,帮助大家理解密度聚类算法。
  
  DBSCAN是一种著名的密度聚类算法,它基于一组 “邻域”参数()来刻画样本分布的紧密程度。对给定样本集,进行如下定义:

image.png-80.7kB

图3. DBSCAN算法工作示意图

  基于以上概念的定义,那么DBSCAN中簇的定义很简单:由密度可达关系导出的最大密度相连的样本集合,即为我们最终聚类的一个类别,或者说一个簇。形式化的定义如下:给定邻域参数(),簇 如下性质的非空样本子集:

  • 连接性(Connectivity)
    对任意样本 密度相连;

  • 最大性(Maximality)
    密度可达

  那么怎么才能找到这样的簇样本集合呢?DBSCAN使用的方法很简单,它任意选择一个没有类别的核心对象作为种子(Seed),然后找到所有这个核心对象能够密度可达的样本集合,即为一个聚类簇。接着继续选择另一个没有类别的核心对象去寻找密度可达的样本集合,这样就得到另一个聚类簇。一直运行到所有核心对象都有类别为止。算法形式化的描述如下:

输入: 样本集 ,邻域参数(

输出: 类别划分

执行步骤:

  1. 确定每个样本点 邻域
  2. 将所有满足条件 的样本点标记为核心对象, 并将所有核心对象集合记为
  3. 分别初始化聚类类别数 和未访问样本数

  4.   记录当前未访问集合:
      随机选取一个核心对象 ,初始化队列
      
      
       去除队列 的第一个样本
       
        令
        
        
       
      
      ,生成类簇
      

  基本上这就是DBSCAN算法的主要内容了,是不是很简单?但是我们还是有三个问题没有考虑。

  第一个是一些异常样本点或者说少量游离于簇外的样本点,这些点不在任何一个核心对象在周围,在DBSCAN中,我们一般将这些样本点标记为噪音点。

  第二个是距离的度量问题,即如何计算某样本和核心对象样本的距离。在DBSCAN中,一般采用最近邻思想,采用某一种距离度量来衡量样本距离,比如欧式距离。这和KNN分类算法的最近邻思想完全相同。对应少量的样本,寻找最近邻可以直接去计算所有样本的距离,如果样本量较大,则一般采用KD树或者球树来快速的搜索最近邻。如果大家对于最近邻的思想,距离度量,KD树和球树不熟悉,建议参考之前写的另一篇文章K近邻法(KNN)原理小结。

  第三种问题比较特殊,某些样本可能到两个核心对象的距离都小于ϵ,但是这两个核心对象由于不是密度直达,又不属于同一个聚类簇,那么如果界定这个样本的类别呢?一般来说,此时DBSCAN采用先来后到,先进行聚类的类别簇会标记这个样本为它的类别。也就是说BDSCAN的算法不是完全稳定的算法。

5. 层次聚类方法

  
  我们知道对于聚类最经典的方法K-Means算法,虽然简单好用,但是始终存在K值选择和初始聚类中心选择的问题需要解决。并且,这些问题对聚类的最终结果将产生至关重要的影响。而本节介绍的层次聚类算法就可以避免这些问题的困扰。
  
  层次聚类(Hierarchical Clustering)是聚类算法家族中的重要的成员,他致力于通过合并和分裂构建树状的类簇。对数据的划分主要有两种方式: 自顶向下 的分裂和 自底向上 的聚合。每棵树的根是一个聚集所有样本的独有的类。
  
   是一种采用自底向上聚合策略的层次聚类算法。他先将数据集中的每个样本看成是一个初始的聚类簇,然后在算法运行的每一步中找出距离最近的两个簇进行合并。该过程不断重复,直至达到预设的聚类簇的个数。因此,这里的关键又是如何计算两个聚类簇之间的距离。
  
  众所周知,对于两个点之间的距离我们按照相应的距离公式直接计算两个点之间的距离即可。但是对于两个包含很多点的聚类簇,想计算他们之间的距离就并不是那么简单了。为此,人们定义了如下几种关于两个聚类簇 的不同距离度量及其计算方式:

具体采用哪种距离取决于具体的业务,一般情况下为了防止噪声点的影响,建议采用后两种距离度量。

AGNES聚类算法的形式化描述如下:

算法输入: 训练集 ,
      类簇距离度量公式:
      局类簇数目:
算法输出: 聚类结果划分:

详细步骤:
















6. 聚类算法应用与实战

6.1 聚类算法的应用

  在互联网领域,尤其是电商、金融公司等涉及金融最明显的领域,网络欺诈行为非常猖獗。为此,”异常检测”成为这些公司十分重要的任务。国内外著名的欺诈检测公司“同盾科技”“DataVisor” 在该领域做得都非常好。
  
  笔者曾经就职于国内一家大型电商公司的安全部门,负责恶意订单检测任务,这时候其实我们有多种可行的方案:1)规则引擎;2)有监督学习;3)无监督学习。接下来我分别介绍一下以上各种方案在欺诈检测领域的优缺点:

6.2 聚类算法实战

  本节以聚类算法在欺诈检测为例,介绍无监督学习方法的实战案例的讲解。但是由于数据保密等原因,不能使用真实数据。为此,我们使用人为制造的正负样本进行检测。
  
  首先,为了展示方便,我们使用二维特征作为样本。首先随机产生1000个正样本,然后产生100个负样本。在真实场景中,一般正样本分布比较均匀集中,而负样本一般情况下远离正样本。源程序如下:

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from sklearn.cluster import KMeans
  4. x = np.random.normal(0, 2, 1000)
  5. y = np.random.normal(0, 2, 1000)
  6. x1 = np.random.normal(10, 1, 100)
  7. y1 = np.random.normal(10, 1, 100)
  8. x = np.append(x, x1)
  9. y = np.append(y, y1)
  10. x = np.append(x, y)
  11. X = x.reshape(1100, 2)
  12. plt.figure(figsize=(10, 4))
  13. plt.subplot(121)
  14. plt.scatter(X[:, 0], X[:, 1], s=5)
  15. y_pred = KMeans(n_clusters=2, random_state=170).fit_predict(X)
  16. plt.subplot(122)
  17. plt.scatter(X[:, 0], X[:, 1], s=5, c=y_pred)
  18. plt.show()

运行结果:

Figure_1.png-143.7kB

图4. KMeans异常检测示意图(黄色为离群异常点)

  本节只是使用KMeans对简单的分布的异常点进行检测,本文的目的只是告诉读者聚类算法的应用以及sklearn中KMeans接口的简单调用。更加专业的异常检测算法请看下一章的 IForest 算法。


参考文献

[1] Friedman J, Hastie T, Tibshirani R. The elements of statistical learning[M]. New York: Springer series in statistics, 2001.

[2] 周志华. 机器学习 : = Machine learning[M]. 清华大学出版社, 2016.

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注