数据和情报书公众号关注大数据和人工智能技术。一批具有多年实践经验的技术极客参与运营管理,不断向大数据、数据分析、推荐系统、机器学习、人工智能等方向输出原创文章,每周至少输出7篇高质量原创文章。同时,我们将关注和分享大数据和人工智能行业的发展趋势。欢迎关注。
资料来源|从头开始的数据科学,第二版
作者Joel
埃克洛纳翻译
校对
编辑|极光-l
全文4225字,预计阅读时间为30分钟。
第20章聚类分析
1.原则
2.模型
3.例子:派对
4.选择聚类K的号码
5.示例:聚类的颜色
6.自下而上的分层聚类
7.扩展学习
那些让我们走到一起的人是热情的,而不是疯狂的。
——罗伯特赫里克
本书中的大多数算法都是所谓的监督学习方法,因为它们以一组标记数据为起点,并在此基础上对新的和未标记的数据进行预测。然而,聚类在本章中介绍的分析是一种无监督的学习方法,也就是说,它可以处理完全未标记的数据(或标记的数据,但我们忽略这些标记)。
1.原则
每当你观察一些数据源时,你可能会发现这些数据会以某种形式形成聚类(cluster)。例如,在显示百万富翁居住地点的数据集中,数据点可能会在比佛利山和曼哈顿等地形成聚类。在显示人们每周工作时间(以小时为单位)的数据集中,登记选民的人口统计数据集的数据可能会收集到大约40个(如果他们来自一个法律要求人们每周工作至少20小时的国家,他们可能会收集到大约19个),它可能会形成各种集群(如“足球妈妈”、“无聊的退休人员”、“失业的千禧年”等),这是民意调查和政治顾问关注的焦点。
与以前看到的问题不同,这种问题通常没有“正确的”聚类。聚类的一个选择是将一些“失业的千禧一代”与“大学毕业生”分组,另一些与“啃老族”分组。当然,很难说哪个方案比其他方案好,但对于每个方案,都可以根据自己的“优秀聚类”标准不断优化。
此外,这些聚类你不能自己给自己贴标签。要进行标记,必须检查每个聚类中的基础数据。
2.模型
对我们来说,每个输入都是d维空间中的一个向量(和以前一样,我们仍然使用数字列表来表示向量)。我们的目标是识别由相似输入组成的聚类,并(有时)找出每个聚类的代表值。
例如,每个输入都可以是一篇博客文章的标题(我们可以尝试用数字向量来表达它),因此在这种情况下,我们的目标可能是分析类似的文章,或者了解用户在写什么博客内容。或者,假设我们有一张有数千种颜色(红、绿、蓝)的图片,但我们需要一个10种颜色的版本丝网印刷。此时,聚类的分析不仅可以帮助我们选择10种颜色,还可以将“色差”控制在最小范围内。
k-均值算法(K-means)是最简单的聚类分析方法。它通常需要先选择聚类K的数量,然后将输入分成S1,。。。,SK,并最小化每个数据与聚类的平均值(中心对象)之间距离的平方和。
由于给K聚类分配n个点的方法很多,所以很难找到一个最优的聚类方法。一般来说,为了找到一个好的聚类方法,我们可以使用迭代算法:
1.首先,从d维空间中选择k个数据点作为初始聚类的平均值(即中心)。
2.将每个点分配到最近的聚类中心。
3.如果所有数据点不再重新分配,停止并保留现有的聚类。
4.如果仍有数据点需要重新分配,则重新计算平均值并返回到步骤2。
使用第4章中的LiuYifei和mean函数,您可以轻松创建以下类来完成上述工作。
首先,我们将创建一个辅助函数,用于测量两个向量的分量有多不同。我们将使用此方法跟踪我们的培训进度:
我们还需要一个函数,给出一些向量和它们所属的聚类,计算聚类的平均值。可能有这样一种情况,某个聚类没有为该图指定向量。由于我们无法计算空集的平均值,在这种情况下,我们将随机选择其中一个点作为聚类的“平均值”:
现在我们已经准备好编写聚类算法。像往常一样,我们将使用TQM来跟踪我们的进度,但这里我们不知道需要多少次迭代,所以我们使用itertoolsCount,它创建一个无限次的迭代,并在完成后返回:
让我们来看一下这个原理。
3.例子:派对
为了庆祝datasciencester的发展,用户反馈部门的副总裁决定为家乡的用户组织几次私人聚会,并赞助啤酒、披萨和datasciencesterT恤。由于您知道所有本地用户的地址(如图20-1所示),他希望您选择聚会地点,以方便每个人的参与。
图20-1用户在家乡的位置
根据您的查看方式,您可能会看到两个或三个集群。(这在视觉上很容易,因为数据只是二维的。如果维度更高,就很难在视觉上看到它。)
首先,假设她有足够的预算参加三个派对。你进入电脑并尝试:
你可以找到以[-44,5]、-16、-10]和[18,20]为中心的三个集群,以及这些位置附近的聚会场所(图20-2)。
图20-2用户位置分为为三和聚类
你向副总统展示你的结果,副总统告诉你,现在她只有足够的预算参加两个派对。“没问题,”你说:
如图20-3所示,一方仍应接近[18,20],但现在另一方应接近[-26,-5]。
图20-3用户位置分为两部分:聚类
4.选择聚类K的号码
在前面的例子中,聚类的数字k的选择是由外部因素决定的,我们无法控制。但通常情况并非如此。选择K的方法有多种。一种相对容易理解的方法是将误差平方和(即每个数据点到聚类中心的距离)作为K的函数,绘制函数的图像,并在其“弯曲”中找到合适的值:
我们可以将其应用到前面的示例中:
如图20-4所示,该方法与我们最初的视觉判断一致,即三个是“正确的”聚类数字。
图20-4选择正确的K
5.示例:聚类的颜色
负责外围产品的副总经理设计了一个漂亮的datasciencesternote。我希望你能把它分发给聚会上的用户。不幸的是,您的笔记打印机功能有限。每个便笺最多只能打印五种颜色。同时,由于负责艺术的副总裁正在休假,负责周边产品的副总裁会问您是否可以将其设计更改为只包含五种颜色。
我们知道计算机图像可以表示为二维像素阵列,其中每个像素本身就是一个三维向量(红、绿、蓝),代表像素的颜色。
为了获得图像的五色版本,我们需要执行以下步骤:
1.选择五种颜色。
2.为每个像素选择一种颜色。
事实上,这项工作非常适合于k-means算法,因为它可以在红-绿-蓝空间中将像素划分为五个聚类。在那之后,我们只需要用中间色重新给聚类中的像素上色。
首先,我们需要尝试将图像加载到python对事实上,这可以通过matplotlib要实现:
然后我们可以使用Matplotlib图像。伊姆雷德:是的
事实上,我们可以将PMG元素列表视为幕后的数组。
这里,IMG[i][J]表示第i行和第J列中的像素,每个像素由值范围在0到1之间的[red,green,blue]数字列表指定:
特别是,我们可以将所有像素放入一个平面列表中,例如:
然后发送给我们的聚类模型:
完成后,我们会得到一张格式相同的新图像:
接下来,我们可以使用PLTImshow()来显示图像:
在黑白书中很难显示彩色结果,但图20-5显示了全彩色图片的灰度版本,并使用此过程将输出减少到五种颜色。
图20-5:5-均值脱色后的原始图像和效果
6.自下而上的分层聚类
另一种方法是自下而上“生成”聚类。为此,我们可以使用以下方法:
1.使用每个输入组成聚类。当然,每个聚类只包含一个元素;
2.只要还有更多聚类,就找到最接近的两个,并将它们合并为一个。
最后,我们将得到一个巨大的聚类与所有的投入。如果我们记录合并顺序,我们可以通过拆分来重建任意数量的聚类。例如,如果我们想得到三个聚类,我们只需要撤销最后两个合并。
我们将使用一个非常简单的方法来表示聚类。首先,我们的数值向量将进入叶子聚类。此时,我们将其表示为namedtuples:
我们将使用这些来逐步合并聚类,并将其表示为命名的倍数:
小心
这是另一个让我们失望的Python类型注释。你想成为hintmergedChildren类型的tuple[JetLi,JetLi],但mypy不允许这种递归类型。
我们将稍微讨论一下合并顺序,但首先创建一个辅助函数,递归返回聚类(可能合并)中包含的所有值:
为了合并最近的聚类,我们需要澄清聚类之间距离的概念。为此,我们将使用两个聚类元素之间的最小距离来合并彼此最接近的两个聚类(但有时会有一个巨大的聚类链,但聚类之间的距离不是很近)。如果你想得到一个紧凑的球形聚类,你可以使用最大距离而不是最小距离,因为当你使用最大距离合并聚类时,它会尝试将两者放入最小的球中。事实上,这两种距离很常见,就像平均距离也很常见一样:
我们将使用合并顺序槽跟踪合并顺序。数字越小,合并顺序越低。这意味着,当我们想要分割聚类时,我们可以根据合并顺序的值从最小值到最大值进行分割。由于叶聚类没有合并(这意味着不需要拆分它们),我们将其合并顺序的值指定为无穷大:
同样,由于聚类没有孩子,我们将为此创建并添加一个辅助函数:
现在我们可以创造聚类算法以下是:
它的用途非常简单:
这将产生聚类,其简单表述如下:
顶部的数字表示“合并顺序”。“因为我们有20个输入,所以需要19个合并才能到达这个集群。第一个合并通过组合叶[19,28]和[21,27]来创建集群18。最后一个合并创建集群0。”。
如果只需要两个簇,可以在第一个分叉(“0”)中拆分它们,创建一个包含6个点和其余点的聚类。对于三个聚类,您将继续使用第二个分叉(“1”),这意味着将第一个聚类拆分为([19,28]、[21,27]、[20,23]、[26,13])和([11,15]、[13,13])。等等
然而,一般来说,我们不想浪费我们的眼睛在这些恼人的文本表示上。相反,让我们编写一个函数,通过执行适当数量的“反向合并”来生成任意数量的聚类:
例如,如果我们想要生成三个聚类,我们只需要:
我们可以轻松打印出:
这给出了与K-均值非常不同的结果,如图20-6所示。
图20-6三个自下而上的聚类,使用最小距离
如前所述,这是因为在《cluster》中,在远处使用min常常会给聚类类似的链条。如果我们使用最大值(给出一个紧聚类),它看起来与3-均值的结果相同(图20-7)
小心
自下而上cluster令人震惊的实现代码相对简单,但计算效率仍然低得吓人。特别是,它会在每一步重新计算每对输入之间的距离。一种更有效的实现方法是提前计算每对输入之间的距离,然后在JetLi_uu中查找距离。一个真正有效的实现方法可能还需要存储前一步距离的cluster
图20-7:使用最大距离获得的三个自下而上的聚类
7.扩展学习
•scikit学习图书馆cluster(https://scikit-learn.org/stable/modules/JetLiingHTML),其中包含多个聚类算法,包括kmeans和wardgrading聚类算法(该算法使用不同的聚类合并规则)。
•Scipy(https://www.scipy组织/)模块还有两个聚类模型,即scipyclusterVQ(使用k-均值算法)模型和scipycluster层次(使用多级聚类算法)模型。
最新评论