Pulkit Sharma作者吴振东校对陈超翻译

层级聚类和Python实现的初学者指南(附链接)

本文从对比无监督学习和监督学习的特征切入,结合具体的案例来给大家介绍层级聚类的概念、应用场景、主要类型以及Python实现。

引言

理解顾客行为在任何工业领域都是至关重要的,直到去年我才意识到这个问题。当时我的CMO(chief marketing officer,首席营销官)问我:“你能告诉我,我们新产品的目标用户应该是什么群体呢?”

这对我来说是一个学习的过程。我很快意识到,作为一个数据科学家,将顾客细分以便于公司能够进行客户定制并建立目标策略有多重要。这就聚类概念能派上用场的地方!

用户分类通常很棘手,因为我们脑海当中并没有任何目标变量。我们现在正式踏入了无监督学习的领域,在没有任何设定结果的情况下来发掘模式和结构。这对数据科学家来说是充满挑战但却是让人激动的事。

在这里有几种不同的聚类方法(你会在下面的部分看到)。我将向你介绍其中一种——层级聚类

我们将会学习层级聚类是什么,它优于其他聚类算法的地方,不同层级聚类的方式以及开展的步骤。我们在最后会采用一个顾客分类数据库并实现Python的层级聚类。我喜欢这个方法并且十分确定在你读完本文之后也会喜欢上的!

注释:如上所述,聚类的方法很多。我鼓励你查看我们对不同类型聚类所做的指南:

  • An Introduction to Clustering and different methods of clustering

https://www.analyticsvidhya.com/blog/2016/11/an-introduction-to-clustering-and-different-methods-of-clustering/utm_source=blog&utm_medium=beginners-guide-hierarchical-clustering

想要学习更多关于聚类的内容和其他机器学习算法(监督和无监督)可以看看下面这个项目-

https://courses.analyticsvidhya.com/bundles/certified-ai-ml-blackbelt-plus?utm_source=blog&utm_medium=beginners-guide-hierarchical-clustering

目录

1. 监督vs 无监督学习

2. 为什么要用层级聚类

3. 什么是层级聚类

4. 层级聚类的类型

(1) 聚合式(Agglomerative)层级聚类

(2) 分裂式(Divisive)层级聚类

5. 层级聚类的步骤

6. 在层级聚类中如何选择类的数量?

7. 利用层级聚类解决一个批发顾客分类问题

监督vs无监督学习

在我们深入学习层级聚类之前,理解监督学习和无监督学习之间的差异是十分重要的。让我用一个简单的例子来解释这种差异。

假设我想要估计每天将被租借的自行车数量:

或者,我们想预测在泰坦尼克号上一个人是否生还:

在这两个例子当中都有一个固定的目标要实现:

  • 在第一个例子当中,要基于像季节、假期、工作日、天气、温度等特征来预测自行车租用数量。
  • 在第二个例子中要预测乘客是否会生还。在“生还”变量中,0代表这个人未生还,1代表这个人活了下来。这里的自变量包括客舱等级、性别、年龄、票价等等。

所以说,当我们有目标变量的时候(在上述两个例子当中的数量和生还),基于一系列预测变量或者自变量(季节,假期,性别,年龄等)来预测,这种问题叫做监督学习问题。

让我们看看下面的图以便更好地理解它:

在这里,y是因变量或者叫目标变量,X代表自变量。目标变量依赖于X,因此它也被叫做一个因变量。我们在目标变量的监督下使用自变量来训练模型,因而叫做监督学习

我们在训练模型时的目标是生成一个函数,能够将自变量映射到期望目标。一旦模型训练完成,我们可以把新的观测值放进去,模型就可以自己来预测目标。总而言之,这个过程就叫做监督学习

有时候我们并没有任何需要预测的目标变量。这种问题没有任何外显的目标变量,被叫做无监督学习。我们仅有自变量。

我们试图将全部数据划分成一系列的组。这些组被叫做簇,这个过程叫做聚类

这种技术通常被用于将总体聚类成不同的组别。常见的例子包括顾客分群、聚类相似的文件、推荐相似的歌或者电影等等。

现在有很多算法可以帮助我们完成聚类。最常用的聚类算法是K-means和层级聚类

为什么要采用层级聚类

在此之前,我们需要先知道K-means是怎样工作的。相信我,这会让层级聚类的概念变得更简单。

这里有一个对K-means算法如何工作的概览:

1. 决定簇的数量(k)

2. 选择k个随机的点作为中心点

3. 将所有的点纳入最近的中心点

4. 计算新形成的簇的中心点

5. 重复步骤3和4

这是一个迭代的过程。它将持续地运行,直到新形成的簇的中心点不再变化,或者到达了最大迭代次数。

但是K-means也受到了一些质疑。它通常试图生成规格相同的簇。还有,我们需要在算法开始之前就决定好簇的数量。理想情况下,我们在算法开始时不知道要多少簇,因而这也是K-means所面对的一种质疑。

这也恰恰就是层级聚类的优越之处。它解决了预先设定簇的数量的问题。听起来就是在做梦!所以,让我们看看层级聚类是什么以及它是怎样改进K-means的。

什么是层级聚类

我们有以下的一些点,我们想把它们聚类

我们可以把每个点作为单独的簇:

现在,基于这些簇的相似性,我们可以把最相似的簇放到一起,并且重复这个过程直到剩余单一的簇:

我们有必要建立一个簇的层级,这就是为什么这个算法叫做层级聚类。我们将在下一部分讨论如何决定簇的数量。现在,让我们看看不同类型的层级聚类

层级聚类的类型

这里有两种主要的层级聚类

1. 聚合式层级聚类

2. 分裂式层级聚类

让我们来详细理解一下每一种:

聚合式层级聚类

把每个点归于单独的一个簇。假设这里有四个数据点。我们把每个点分到一个簇里,在开始时就会有四个簇:

然后,在每一轮迭代中,我们把最相似的点对进行融合,然后重复上述步骤直到只剩单一簇:

每一步我们都在融合(或者增加)簇,对吧?因此,这种聚类也叫作累加层级聚类

分裂式层级聚类

分裂式层级聚类则是一种相反的思路。与一开始划分n个簇(n个观测值)不同,我们开始时只有一个簇,并且把所有的点都纳入这个簇。

所以,我们有10个或者1000个点并不重要。所有的点在一开始都在同一个簇中:

现在,在每一次迭代中,我们把簇中最远的点分离出来,并且重复上述过程直到每个簇都只有一个点:

我们每一步都在分裂(或划分)簇,因此叫做分裂式层级聚类

聚合式聚类被广泛应用于工业当中,在本文当中也将重点关注。一旦我们掌握了聚合式,分裂式层级聚类也将变得非常简单。

层级聚类的步骤

我们在层级聚类当中把最相似的点或类进行融合——我们已经知道这一点。现在问题是——如何决定哪些点相似哪些点不相似呢?这才是聚类当中最重要的问题之一!

这里有一种计算相似性的方式——计算簇中心点之间的距离。距离最近的点被认为是相似的点,我们可以融合它们。我们可以把这个叫做基于距离的算法(因为我们计算了簇之间的距离)。

在层级聚类中有一个临近矩阵(proximity matrix)的概念。这个矩阵存储了每对点之间的距离。让我们来用一个例子来理解这个矩阵和层级聚类的方法。

例子

假设一个老师想把她的学生分成不同的组。她有每个学生在一次作业当中所取得的分数,基于这些分数,她想把学生分成不同的组。这里没有关于分组的固定的目标。因为老师并不知道哪种学生应该分配到什么组,它不能用监督学习问题来描述。所以,我们将使用层级聚类把学生分成不同的组。

我们的例子有5个学生:

创造一个邻接矩阵

首先,我们创造一个邻接矩阵,这个矩阵会告诉我们这些点之间的距离。我们计算了每两个点之间的距离,会得到一个n*n的方形矩阵(n是观测值的数量)。

让我们来看一看这五个点之间的邻接矩阵:

这个矩阵的对角线永远是0,因为每个点到自己的距离总是0。我们将使用欧氏距离公式来计算剩下的距离。所以,让我们来看看我们想计算的点1和2之间的距离:

√(10-7)^2 = √9 = 3

类似地,我们可以计算所有点之间的距离,并且填充这个邻接矩阵。

步骤

第一步:首先,我们将所有的点归于一个簇:

不同颜色表征不同的簇。你可以看到数据中的5个点构成了五种不同的簇。

第二步:接下来,在邻接矩阵中找到距离最短的点,并且把这些点融合。然后更新邻接矩阵。

在这里,最小的距离是3,因此把点1和2进行融合:

让我们看看更新后的簇并且相应地更新邻接矩阵:

在这里,我们取了两个点(7,10)中的最大值来代替这个集群的标记。我们也可以用最小值或者平均值代替。现在,我们将再一次计算这些簇的邻接矩阵:

第三步:重复步骤2直到只剩下1个簇。

我们先看邻接矩阵当中的最小值,然后融合簇中最接近的一对。我们在重复上述步骤之后将得到以下融合的簇:

我们开始有5个簇,最后只有一个单一的簇。这也就是聚合式层级聚类的工作方式。但是棘手的问题仍然存在——怎么决定簇的数量呢?让我们看看下一部分。

在层级聚类中,我们应该怎样选择簇的数量呢?

准备好回答这个从开始就一直在提的问题了吗?为了获得层级聚类的数量,我们使用了一个叫树状图的绝妙概念。

树状图是一个树形图表,能够记录融合或分裂的顺序。

让我们回到老师-学生的例子。无论何时融合两个类,一个树状图都会记录这些类之间的距离并且以图的形式进行表征。让我们看看树状图是什么样的:

我们把样本放到x轴,距离作为y轴。无论两个簇何时融合,我们都将加入树状图内,连接点之间的高度就是这些点之间的距离。让我们来建立例子的树状图:

需要花点儿时间来加工上述图片。我们开始融合了样本1和2,这两个点之间的距离是3(指的是在上一部分出现的第一个邻接矩阵)。让我们来把它放到树状图上:

在这里,我们可以看看融合的样本1和2。垂直的线代表两个点之间的距离。相似的,我们把融合簇的所有步骤画到图上,最后可以得到如下树状图:

我们可以清晰地把层级聚类的步骤进行可视化。垂直线的距离越长,簇之间的距离越远。

现在,我们可以设置一个距离阈限,并画一条水平线(一般的,我们会用这种方式来设置阈限,它会切断最常的垂直线)。让我们设置阈限为12,然后画一条水平线。

类的数量是与阈值先相交的垂直线的数量。在上述例子里,因为红线与两条垂直线交叉,我们将有2个类。一个类包括样本(1,2,4),另一个类包括样本(3,5)。非常清晰对吗?

这就是我们在层级聚类中使用树状图确定类的数量的方式。在下一部分,我们将实际应用层级聚类帮助你理解本文中所学到的概念。

使用层级聚类来解决批发顾客分类问题

是时间开始用Python了!

我们将开始解决一个批发顾客分类问题。你可以在这里下载数据集(https://archive.ics.uci.edu/ml/machine-learning-databases/00292/Wholesale%20customers%20data.csv)。

这个数据托管在UCI机器学习知识库当中。本问题的目标是对一个批发商的顾客基于他们在不同产品类型(例如牛奶、食品杂货、地区等等)的年度开支进行分类。

让我们先来探索一下数据,然后再利用层级聚类进行顾客分类。

首先导入所需的函数库:

view rawimporting_libraries.py hosted with  by GitHub

https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit&action=edit&type=10&appmsgid=100034460&isMul=1&isSend=0&token=886063492&lang=zh_CN#file-importing_libraries-py

加载数据集然后看一下前几行:

view raw

https://gist.github.com/PulkitS01/8ac9bf3b54eb59b4e1d4eaa21d3d774e/raw/6cea281dc4dea42bbcb2160e6cef1535cad765e7/reading_data.py

这里有很多产品种类——生鲜、牛奶、杂货等等。数值代表被每个顾客所购买的数量。我们的目标是从这个数据中进行类的划分,可以把相似的顾客划归到同一类。我们将使用层级聚类解决这个问题。

但是在实际应用层级聚类解之前,我们需要把数据集进行归一化以便于所有变量的尺度是相同的。为什么这一步很重要呢?因为如果变量尺度不同,模型偏向那些拥有更大量级的变量像是生鲜或者牛奶(如上表格)。

所以,先将数据归一化,把所有变量放到同一尺度。

在这里,可以看到所有变量的尺度几乎是相似的。现在,我们可以开始进行层级聚类了。首先画出树状图来帮助我们决定这个问题当中簇的数量:

X轴为样本,y轴表征样本之间的距离。距离最大的垂直的线是蓝色的线,因此我们可以决定阈值为6,然后切断树状图:

这条线有两个交点,因此我们有两个簇。让我们使用层级聚类

在我们定义2个簇之后,我们可以看到输出结果中0 和1的值。0代表属于第一个簇的值,而1代表属于第二个簇的值。现在将两个簇进行可视化:

太棒了!我们现在可以清晰地看到两个簇。这是我们用Python来实现层级聚类的过程。

写在最后的话

层级聚类是一种非常有用的划分观察值的方法。优势在于无需预定义集群数量,这使它比k-Means更具优势。

如果你对数据科学还比较陌生,强烈建议你学习实用机器学习课程(https://courses.analyticsvidhya.com/courses/applied-machine-learning-beginner-to-professional?utm_source=blog&utm_medium=beginners-guide-hierarchical-clustering)。这是你可以在任何地方找到的最全面的端到端的机器学习课程之一。层级聚类只是课程中涵盖的众多主题之一。

原文标题:

A Beginner’s Guide to Hierarchical Clustering and how to Perform it in Python

原文链接:

https://www.analyticsvidhya.com/blog/2019/05/beginners-guide-hierarchical-clustering/

编辑:王菁

校对:杨学俊

译者简介

陈超北京大学应用心理硕士在读。本科曾混迹于计算机专业,后又在心理学的道路上不懈求索。越来越发现数据分析和编程已然成为了两门必修的生存技能,因此在日常生活中尽一切努力更好地去接触和了解相关知识,但前路漫漫,我仍在路上。

THU数据派
THU数据派

THU数据派"基于清华,放眼世界",以扎实的理工功底闯荡“数据江湖”。发布全球大数据资讯,定期组织线下活动,分享前沿产业动态。了解清华大数据,敬请关注姐妹号“数据派THU”。

入门Python层级聚类
1
相关数据
数据分析技术

数据分析是一类统计方法,其主要特点是多维性和描述性。有些几何方法有助于揭示不同的数据之间存在的关系,并绘制出统计信息图,以更简洁的解释这些数据中包含的主要信息。其他一些用于收集数据,以便弄清哪些是同质的,从而更好地了解数据。 数据分析可以处理大量数据,并确定这些数据最有用的部分。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

分类数据技术

一种特征,拥有一组离散的可能值。以某个名为 house style 的分类特征为例,该特征拥有一组离散的可能值(共三个),即 Tudor, ranch, colonial。通过将 house style 表示成分类数据,相应模型可以学习 Tudor、ranch 和 colonial 分别对房价的影响。 有时,离散集中的值是互斥的,只能将其中一个值应用于指定样本。例如,car maker 分类特征可能只允许一个样本有一个值 (Toyota)。在其他情况下,则可以应用多个值。一辆车可能会被喷涂多种不同的颜色,因此,car color 分类特征可能会允许单个样本具有多个值(例如 red 和 white)。

数据科学技术

数据科学,又称资料科学,是一门利用数据学习知识的学科,其目标是通过从数据中提取出有价值的部分来生产数据产品。它结合了诸多领域中的理论和技术,包括应用数学、统计、模式识别、机器学习、数据可视化、数据仓库以及高性能计算。数据科学通过运用各种相关的数据来帮助非专业人士理解问题。

知识库技术

知识库是用于知识管理的一种特殊的数据库,以便于有关领域知识的采集、整理以及提取。知识库中的知识源于领域专家,它是求解问题所需领域知识的集合,包括基本事实、规则和其它有关信息。

映射技术

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

监督学习技术

监督式学习(Supervised learning),是机器学习中的一个方法,可以由标记好的训练集中学到或建立一个模式(函数 / learning model),并依此模式推测新的实例。训练集是由一系列的训练范例组成,每个训练范例则由输入对象(通常是向量)和预期输出所组成。函数的输出可以是一个连续的值(称为回归分析),或是预测一个分类标签(称作分类)。

分类问题技术

分类问题是数据挖掘处理的一个重要组成部分,在机器学习领域,分类问题通常被认为属于监督式学习(supervised learning),也就是说,分类问题的目标是根据已知样本的某些特征,判断一个新的样本属于哪种已知的样本类。根据类别的数量还可以进一步将分类问题划分为二元分类(binary classification)和多元分类(multiclass classification)。

聚类技术

将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类。由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异。“物以类聚,人以群分”,在自然科学和社会科学中,存在着大量的分类问题。聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法。聚类分析起源于分类学,但是聚类不等于分类。聚类与分类的不同在于,聚类所要求划分的类是未知的。聚类分析内容非常丰富,有系统聚类法、有序样品聚类法、动态聚类法、模糊聚类法、图论聚类法、聚类预报法等。

图生成技术

根据给定信息信息生成图表。

北京大学机构

北京大学创办于1898年,初名京师大学堂,是中国第一所国立综合性大学,也是当时中国最高教育行政机关。辛亥革命后,于1912年改为现名。2000年4月3日,北京大学与原北京医科大学合并,组建了新的北京大学。原北京医科大学的前身是国立北京医学专门学校,创建于1912年10月26日。20世纪三、四十年代,学校一度名为北平大学医学院,并于1946年7月并入北京大学。1952年在全国高校院系调整中,北京大学医学院脱离北京大学,独立为北京医学院。1985年更名为北京医科大学,1996年成为国家首批“211工程”重点支持的医科大学。两校合并进一步拓宽了北京大学的学科结构,为促进医学与人文社会科学及理科的结合,改革医学教育奠定了基础。

官网,http://www.pku.edu.cn/
暂无评论
暂无评论~