无监督学习与生成式人工智能(MEAP)(二)(2)https://developer.aliyun.com/article/1522538
4.8 关联规则案例研究
关联规则挖掘是一个非常有用和强大的解决方案。我们将使用关联规则解决一个实际案例研究。
回想一下,在本章的开头,我们建议研究杂货店的模式。这种店铺摆设的逻辑是什么呢?
想象一下:你在像沃尔玛、乐购、Spar 或 Marks & Spencer 等杂货零售商工作。他们必须规划新店的视觉布局。显然,零售商要明智地利用店内空间,充分利用最大的容量。与此同时,至关重要的是不妨碍顾客的活动。顾客应该可以接触到所有展示的物品,并能够轻松地导航。你可能会有一些经历过一些店铺让我们感到窒息和陈列品充斥,而另一些则整齐摆放的情况。
我们如何解决这个问题呢?
这个问题可能有多种解决方案。一些零售商可能希望根据商品类别对物品进行分组。他们可能希望将所有烘焙产品都放在一个架子上,或者根据任何其他条件使用。我们在这里学习的是机器学习的例子。
使用购物篮分析,我们可以生成规则,指示各种商品之间的相关关系。我们可以预测哪些商品经常一起购买,并且可以将它们放在店里的一起。例如,如果我们知道牛奶和面包经常一起购买,那么面包可以放在牛奶柜台附近。购买牛奶的顾客可以轻松找到面包并继续购买。
但事情并不像听起来那么简单。让我们逐步解决这个案例。
- 业务问题定义:第一步是明确定义我们清楚的业务问题。我们希望发现各种商品之间的关系,以便可以更好地安排商店内的布局。在这里,陈列计划 变得很重要。陈列计划帮助零售商以明智的方式规划商店内的空间利用,使顾客也可以轻松导航和访问产品。它可以被视为商店的视觉布局。示例如图 4.16 所示。
图 4.16 显示了一个陈列计划的示例。陈列计划对于视觉营销非常有用。
在图中,我们可以看到每个商品类别都有特定的区域。关联规则非常有洞察力,可以帮助生成陈列计划的方向。
- 数据发现:下一步是数据发现,其中历史交易被搜索并加载到数据库中。通常,一笔交易看起来像表 4.22。
表 4.22 实际零售店生成的发票示例。将这种数据格式转换为可以被关联规则算法消费的格式是相当具有挑战性的。
发票编号 | 日期 | 商品 | 金额 |
1001 | 01-Jun-21 | 牛奶,鸡蛋,奶酪,面包 | $10 |
1002 | 01-Jun-21 | 面包,香蕉,苹果,黄油 | $15 |
1003 | 01-Jun-21 | 黄油,胡萝卜,奶酪,鸡蛋,面包,牛奶,香蕉 | $19 |
1004 | 01-Jun-21 | 牛奶 | $1 |
1005 | 01-Jun-21 | 面包 | $0.80 |
- 数据准备:这一步也许是最困难的一步。正如你可能意识到的那样,关联规则模型的创建是一项非常简单的任务。我们有可以为我们处理繁重工作的库。但是它们期望的数据集是以特定格式存在的。这是一项繁琐的任务,非常耗时,并且需要大量的数据预处理技能。
在准备数据集时,有几个注意事项你必须记住,它们是: - 有时在数据准备阶段我们会得到NULL或空值。数据集中的缺失值可能会导致计算时出现问题。在其他机器学习解决方案中,我们建议处理缺失值。在关联规则的情况下,我们建议忽略相应的交易,并且不在最终数据集中考虑它。
- 很多时候,我们在数据中会得到垃圾值。数据集中会发现像!@%^&*()_ 这样的特殊字符。这可能是由系统中不正确的输入导致的。因此,需要进行数据清洗。
- 我们在书的附录中非常详细地介绍了数据预处理步骤,在这里我们处理 NULL 值和垃圾值。
- 将表格转换为关联规则学习算法可以理解和使用的格式是一项必不可少但又艰巨的步骤。深入了解 SQL 数据透视的概念以更好地理解这个概念。否则,你可能需要某人(一位数据工程师)为你创建数据集。
- 模型准备: 或许最容易的步骤之一就是建模。我们已经为不同的算法解决了 Python 解决方案。所以,你应该对此相当熟悉。
- 模型解释: 创建模型可能很容易,但解释规则却不是。大多数时候,你可以得到如下规则:
- #NA -> (牛奶,奶酪) - 这样的规则显然是不可用的,也没有任何意义。它表明数据准备不正确,数据集中仍然存在一些垃圾值。
- (某些物品)->(包装材料)- 或许是最明显的规则,但同样不可用。这个规则表明,无论何时购物,都会购买包装材料,相当明显对吧?
- (土豆,番茄)->(洋葱):这种规则看起来可能是正确的,但这是零售商已经知道的常识。显然,大多数购买蔬菜的顾客都会一起购买土豆、番茄和洋葱。这样的规则可能对业务价值增加不多。
- 支持、置信度和提升阈值允许过滤出最重要的规则。我们可以按提升的降序排序规则,然后移除最明显的规则。
- 业务主题专家: 业务利益相关者和主题专家参与每一个步骤是至关重要的。在这个案例研究中,运营团队、视觉营销团队、产品团队和营销团队是关键参与者,他们应该在每一个步骤都密切配合。
- 一旦规则生成并得到接受,我们就可以使用它们来改善零售空间的陈列方案。零售商可以利用它们来改善营销策略并改进产品促销活动。例如,如果接受了像(A,B)->(C)这样的规则,零售商可能希望将产品捆绑在一起并作为一个单一实体出售。这将增加同一交易中购买的平均物品数量。
- 这个案例研究可以扩展到任何其他领域或业务功能。例如,如果我们希望检查用户在网页上的移动,可以使用相同的步骤。网页开发人员可以分析客户在其网站上的历史点击和使用情况。通过识别模式,他们可以找出用户倾向于点击什么以及哪些功能会最大化他们的参与度。医生可以使用关联规则更好地诊断患者。医生可以比较与其他症状的概率相关的症状,并提供更准确的诊断。
现在,我们将研究这些算法的局限性以及关联规则和序列规则的其他可用解决方案。
4.9 总结思考
在我们研究的关联规则和序列规则中,存在一些假设和限制。
- 在生成规则时,忽略了物品的各自重要性。例如,如果一个顾客在一次交易中购买了 5 罐牛奶和一公斤苹果,那么它被类似地对待于一张发票,其中购买了一罐牛奶和五公斤苹果。因此,我们必须记住物品的各自重要性没有被考虑。
- 商品的成本反映了产品的感知价值。一些昂贵的产品更为重要,因此,如果顾客购买了它们,就可以产生更多的收入。在分析发票时,我们忽略了物品的成本。
- 在分析序列时,我们没有考虑两个交易之间的各自时间段。例如,在 T1 和 T2 之间有 10 天,而在 T2 和 T3 之间有 40 天 - 这两个时间段被视为相同。
- 在所有的分析中,我们将不同类别视为相同。易腐烂商品和不易腐烂商品被以类似方式处理。例如,保质期为 2-3 天的新鲜牛奶被类似对待于保质期无限的洗衣粉。
- 许多时候,我们在分析后得到了不感兴趣的规则。这些结果来自常识(土豆,西红柿)->(洋葱)。这样的规则并不太有用。我们很多时候都面临这样的问题。
- 虽然不感兴趣的规则是一个挑战,但发现的大量规则又是问题之一。我们得到了成百上千的规则,要理解和分析每一个都变得困难。在这里,阈值变得很有用。
- 计算所需的时间和内存需求是巨大的。这些算法需要多次扫描数据集,因此是非常耗时的练习。
- 生成的规则取决于用于分析的数据集。例如,如果我们仅在夏季生成的数据集上进行分析,我们就不能将规则应用于冬季,因为消费者的偏好会随着不同季节而变化。此外,随着时间的流逝,宏观和微观经济因素也会发生变化,因此算法也应随之更新。
还有一些其他算法也很有趣。对于关联规则,我们可以有多关系关联规则、k-最佳模式发现、近似频繁数据集、广义关联规则、高阶模式发现等。对于序列挖掘,我们有广义序列模式、FreeSpan、PrefixSpan、挖掘相关模式等。这些算法非常有趣,可以用于增强知识。
关联规则和序列挖掘是非常有趣的主题。各个商业领域和功能越来越多地使用关联规则来理解事件的模式。这些见解使团队能够做出明智而科学的决策,以改善客户体验和整体参与度。本章是本书第二部分的第一章。我们在本章中探讨了关联规则和序列挖掘。这些是使用 Apriori、FP 和 ECLAT 算法进行研究的,而序列挖掘则使用了 SPADE。
在下一章中,我们将研究高级聚类算法。敬请关注!
您现在可以继续问题部分。
实际的下一步和建议的阅读
- 请阅读以下关联规则算法的研究论文
- 关联规则的快速发现(
www.cs.bme.hu/~marti/adatbanya/apriori_hashtree.pdf
) - 用于挖掘关联规则的快速算法(
rakesh.agrawal-family.com/papers/vldb94apriori.pdf
) - 模式和关联规则挖掘方法的高效分析(
arxiv.org/pdf/1402.2892.pdf
) - 关于其保护隐私能力的关联规则挖掘技术综述(
www.ripublication.com/ijaer17/ijaerv12n24_216.pdf
) - 对于序列挖掘,请阅读以下研究论文:
- SPADE:用于挖掘频繁序列的高效算法(
link.springer.com/content/pdf/10.1023/A:1007652502315.pdf
) - 顺序挖掘:模式与算法分析(
arxiv.org/pdf/1311.0350.pdf
) - 基于趣味性的顺序模式挖掘算法(
ieeexplore.ieee.org/document/8567170
) - 一种解决顺序模式挖掘问题的新方法(
link.springer.com/chapter/10.1007/978-3-642-34630-9_6
)
4.10 总结
- 我们研究了关联规则,这些规则可用于发现数据集中存在的变量之间的引人注目的关系
- 我们介绍了支持度、置信度、提升度和确信度的概念,用于衡量生成的规则的效果。
- 然后我们转向了 apriori 算法,该算法利用了“自下而上”的方法,首先根据子集的频率生成候选项。Apriori 算法会迭代地扫描整个数据,因此需要很长时间。
- 我们讨论了 ECLAT,这是一种深度优先搜索方法。它在整个数据集上以垂直方式执行搜索。由于它不会迭代地扫描数据集,因此比 apriori 更快。
- 我们还介绍了频繁模式增长算法,该算法通过将数据库表示为称为频繁模式树或 FP 树的树来工作。由于这种频繁模式,无需像 Apriori 算法中那样生成候选项,因此它所需的时间较少。
- 我们接着介绍了一种名为 SPADE 的基于序列的学习技术,其中我们也考虑了各种事件发生的具体顺序。
- 最后,我们使用 apyori、pyECLAT、fpgrowth_py 和 pyspade 实现了 Python 技术。
第五章:聚类 (高级)
“在复杂中寻找简单- 爱因斯坦”
有时生活很简单,有时我们会遇到相当复杂的情况。我们在两种情况下都能应对,并根据情况调整我们的方法。
在本书的第一部分中,我们涵盖了更简单、更简单的主题。这使您为前进的旅程做好了准备。我们目前处于第二部分,比第一部分稍微复杂一些。第三部分比前两部分更加高级。因此,随着每一章的进行,难度将稍微增加,期望也会增加。
我们在本书的第一部分中学习了聚类算法。我们了解到聚类是一种无监督学习技术,我们希望通过发现数据集中的有趣模式来将数据点分组。我们深入研究了聚类解决方案的含义、聚类算法的不同类别以及最后的案例研究。在那一章中,我们深入探讨了 kmeans 聚类、层次聚类和 DBSCAN 聚类的数学背景、过程、Python 实现以及优缺点。在开始本章之前,建议您复习第二章。
你可能会遇到许多次不符合简单形式和形状的数据集。此外,我们在选择最终要实现的算法之前必须找到最佳匹配项。在这里,我们可能需要更复杂的聚类算法的帮助;这就是本章的主题。在本章中,我们将再次研究三种这样的复杂聚类算法 - 谱聚类、高斯混合模型 (GMM) 聚类和模糊聚类。一如既往,Python 实现将遵循数学和理论概念。本章在数学概念上稍微有些复杂。您不需要成为数学博士,但有时了解算法如何在后台工作是很重要的。与此同时,您会惊讶地发现这些算法的 Python 实现并不乏味。本章没有任何案例研究。
在本书的第五章中,我们将涵盖以下主题:
- 谱聚类
- 模糊聚类
- 高斯混合模型 (GMM) 聚类
- 总结
欢迎来到第五章,祝你一切顺利!
5.1 技术工具包
我们将继续使用到目前为止所使用的相同版本的 Python 和 Jupyter 笔记本。本章中使用的代码和数据集已经上传到 GitHub (github.com/vverdhan/UnsupervisedLearningWithPython/tree/main/Chapter%205
)。
我们将继续使用到目前为止所使用的常规 Python 库 - numpy、pandas、sklearn、seaborn、matplotlib 等等。在本章中,您需要安装几个 Python 库,它们是 - skfuzzy 和 network 。使用库,我们可以非常快速地实现算法。否则,编写这些算法是相当耗时且繁琐的任务。
让我们开始重新了解一下聚类!
5.2 聚类
回顾第二章,聚类用于将相似的对象或数据点分组。它是一种无监督学习技术,我们的目的是在数据中找到自然分组,如图 5-1 所示。
图 5-1 将对象结果聚类为自然分组。
在这里,我们可以观察到,在左侧我们有未分组的数据,在右侧数据点已经被分组成逻辑组。我们还可以观察到,可以有两种方法来进行分组或聚类,而且两者都会产生不同的聚类。聚类作为一种技术,在业务解决方案中被广泛应用,如客户细分、市场细分等。
我们在第二章中理解了 kmeans、层次和 DBSCAN 聚类。我们还涵盖了各种距离测量技术和用于衡量聚类算法性能的指标。建议您重新查看这些概念。
在本章中,我们将专注于高级聚类方法。我们将在下一节开始使用谱聚类。
5.3 谱聚类
谱聚类是独特的聚类算法之一。在这个领域进行了一些高质量的研究。像杨安东教授、迈克尔·乔丹教授、雅尔·韦斯教授、施坚博教授、杰特恩德拉·马利克教授等著名的研究人员。我们在本章的最后一节引用了一些论文。
让我们首先定义谱聚类。谱聚类基于数据点的相似性而不是绝对位置进行聚类。因此,在数据处于复杂形状的任何地方,谱聚类都是答案。我们在图 5-2 中展示了一些谱聚类可以提供合理解决方案的示例。
图 5-2 各种复杂数据形状的示例,可以使用谱聚类进行聚类。
对于图 5-2,我们也可以使用其他算法,如 k 均值聚类。但它们可能无法充分反映数据的复杂形状。正式地说,像 kmeans 聚类这样的算法利用数据点的紧密程度。换句话说,点之间的接近程度和向群集中心的紧密程度驱动 kmeans 中的聚类。另一方面,在谱聚类中,连通性是驱动逻辑。在连通性中,数据点要么彼此紧密相邻,要么以某种方式连接。这种基于连接性的聚类示例已在图 5-2 中描述。
观察图 5-3(i),数据点呈现出环形图案。可能有数据点遵循这种环形图案。这是一个复杂的模式,我们需要对这些数据点进行聚类。想象一下,通过使用聚类方法,红色圆圈被划分为同一簇,如图 5-3(ii)所示。毕竟,它们彼此靠近。但是如果我们仔细观察,这些点是呈圆形排列的,存在一种模式,因此实际的簇应该如图 5-3(iii)所示。
图 5-3 (i) 我们可以有这样一种复杂的数据点表示需要进行聚类。观察环形(ii)一个非常简单的解释可能导致将红点视为同一簇的一部分,但显然,它们并不属于同一簇(iii)我们这里有两个圆。内圆中的点属于一个簇,而外部的点属于另一个簇。
图 5-3 中显示的示例旨在描述谱聚类的优势。
正如我们之前所说的,谱聚类利用连接方法进行聚类。在谱聚类中,立即相邻的数据点在图中被识别出来。这些数据点有时被称为节点。然后,这些数据点或节点被映射到低维空间。低维空间实际上就是在这个过程中,谱聚类使用从数据集派生的特征值、亲和力矩阵、拉普拉斯矩阵和度矩阵。然后,低维空间可以被分成多个簇。
谱聚类利用连接方法进行聚类,它依赖于图论,在这里我们根据连接它们的边来识别节点的簇。
我们将详细研究这个过程。但在检查这个过程之前,有一些重要的数学概念构成了谱聚类的基础,我们现在将进行介绍。
5.3.1 谱聚类的构建模块
我们知道聚类的目标是将相似的数据点分组到一个簇中,而不相似的数据点分组到另一个簇中。我们应该了解一些数学概念。我们将从相似性图的概念开始,这是数据点的一种相当本质的表示。
相似性图
图是表示数据点的一种最简单和直观的方法之一。在图 5-4(i)中,我们展示了一个图的示例,它只是数据点之间的连接,用边来表示。现在,如果两个数据点之间的相似性是正的,或者它高于某个阈值,那么它们就会连接起来,如图 5-4(ii)所示。我们可以使用相似性的权重而不是绝对值。因此,在图 5-4(ii)中,由于点 1 和 2 相对于点 1 和 3 更相似,因此点 1 和 2 之间的连接权重高于点 1 和 3 之间的连接权重。
图 5-4(i) 图是数据点的简单表示。如果它们非常相似,则点或节点彼此连接(ii)如果数据点之间的相似性高,则权重较高,否则对于不相似的数据点,权重较低。
所以,我们可以得出结论——使用相似性图,我们希望对数据点进行聚类,使得
- 数据点的边具有较高的权重值,因此彼此相似,因此它们在同一簇中。
- 数据点的边具有较低的权重值,因此彼此不相似,因此它们在不同的簇中。
除了相似性图之外,我们还应该了解特征值和特征向量的概念,我们已经在前一章中详细介绍了。建议您进行复习。我们现在将转向邻接矩阵的概念。
邻接矩阵
仔细看图 5-5。我们可以看到从 1 到 5 的各个点彼此连接。然后我们在矩阵中表示连接。该矩阵称为邻接矩阵。
正式地说,在邻接矩阵中,行和列分别是相应的节点。矩阵内部的值表示连接——如果值为 0,则表示没有连接,如果值为 1,则表示存在连接。
图 5-5 邻接矩阵表示各个节点之间的连接,如果值为 1,则表示行和列中的相应节点连接。如果值为 0,则表示它们不连接。例如,节点 1 和节点 5 之间存在连接,因此该值为 1,而节点 1 和节点 4 之间没有连接,因此相应的值为 0。
所以对于邻接矩阵,我们只关心两个数据点之间是否存在连接。如果我们扩展邻接矩阵的概念,我们得到度矩阵,这是我们的下一个概念。
度矩阵
正式地说,度矩阵是一个对角矩阵,其中沿对角线的节点的度数是连接到它的边的数量。如果我们使用上述相同的示例,我们可以将度矩阵表示为图 5-6 所示。节点 3 和 5 各自有三个连接,它们在对角线上得到 3 作为值,而其他节点各自只有两个连接,因此它们在对角线上得到 2 作为值。
图 5-6 虽然邻接矩阵表示各个节点之间的连接,但度矩阵是每个节点的连接数。例如,节点 5 有三个连接,因此其前面有 3,而节点 1 只有两个连接,所以它有 2。
你可能会想为什么我们要使用矩阵?矩阵提供了数据的优雅表示,并且可以清楚地描述两个点之间的关系。
现在我们已经涵盖了邻接矩阵和度矩阵,我们可以转向拉普拉斯矩阵。
拉普拉斯矩阵
拉普拉斯矩阵有很多变体,但如果我们采用最简单的形式,即拉普拉斯矩阵是度矩阵减去邻接矩阵。换句话说,L = D – A。我们可以在图 5-7 中展示它。
图 5-7 拉普拉斯矩阵相当容易理解。要获得拉普拉斯矩阵,我们只需将邻接矩阵从度矩阵中减去,如上例所示。这里,D 表示度矩阵,A 是邻接矩阵,L 是拉普拉斯矩阵。
拉普拉斯矩阵是非常重要的,我们使用 L 的特征值来开发谱聚类。一旦我们获得了特征值和特征向量,我们可以定义另外两个值 – 谱间隙和 Fielder 值。第一个非零特征值是 谱间隙,它定义了图的密度。Fielder 值 是第二个特征值,它提供了将图分割成两个组件所需的最小切割的近似值。Fielder 值的相应向量称为 Fielder 矢量。
Fielder 矢量具有正负组件,它们的结果总和为零。
我们将在下一节详细学习谱聚类的过程时使用这个概念。在转向谱聚类的过程之前,我们现在将介绍亲和力矩阵的另一个概念。
亲和力矩阵
在邻接矩阵中,如果我们用权重的相似性替换连接的数量,我们将得到亲和力矩阵。如果点完全不相似,则亲和力为 0,否则如果它们完全相似,则亲和力为 1。矩阵中的值表示数据点之间不同水平的相似性。
快速测验 – 回答这些问题以检查你的理解。答案在书的末尾
- 度矩阵是通过计算连接数量创建的。真还是假。
- 拉普拉斯矩阵是否是度和邻接矩阵之间的转置的除法。真还是假。
- 在纸上写下一个矩阵,然后推导出它的邻接和度矩阵。
我们现在已经掌握了谱聚类的所有构建模块。我们现在可以转向谱聚类的过程。
5.3.2 谱聚类的过程
现在我们已经掌握了谱聚类的所有构建模块。在高层次上,各个步骤可以总结如下:
- 我们获得数据集并计算其度矩阵和邻接矩阵。
- 使用它们,我们得到拉普拉斯矩阵。
- 然后我们计算拉普拉斯矩阵的前 k 个特征向量。k 个特征向量实际上就是对应于 k 个最小特征值的向量。
- 这样形成的矩阵用于在 k 维空间中对数据点进行聚类。
现在我们将介绍使用示例来覆盖谱聚类的过程,如图 5-8 所示。这些步骤通常在实际实现中不会遵循,因为我们有包和库来实现它。这里涵盖了这些步骤,以便让您了解如何从零开始开发算法的想法。对于 Python 实现,我们将仅使用库和包。虽然可能从头开始开发实现,但重新发明轮子不够高效。
图 5-8 考虑所示的示例,其中我们有一些数据点,它们彼此连接。我们将对这些数据执行谱聚类。
现在当我们希望对这些数据进行谱聚类时。
- 我们将把创建邻接矩阵和度矩阵的工作留给您。
- 下一步是创建拉普拉斯矩阵。我们在图 5-9 中分享了输出的拉普拉斯矩阵。
图 5-9 展示了数据的拉普拉斯矩阵。建议您创建度矩阵和邻接矩阵并检查输出。
- 现在,Fielder 向量如图 5-10 所示,用于上述拉普拉斯矩阵。我们创建 Fielder 向量,如上一节所述。观察矩阵的和为零。
图 5-10 Fielder 向量是拉普拉斯矩阵的输出,在这里观察到矩阵的和为零。
- 我们可以看到有一些正值和一些负值,根据这些值,我们可以创建两个不同的簇。这是一个非常简单的示例,用来说明谱聚类的过程。
图 5-11 识别了两个簇。这是一个非常简单的示例,用来说明谱聚类的过程。
上述过程是谱聚类的一个非常简单的表示。谱聚类对图像分割、语音分析、文本分析、实体解析等非常有用。这是一种非常简单直观的方法,不对数据的形状做出任何假设。像 kmeans 这样的方法假设点在聚类中心周围呈球形分布,而在谱聚类中没有这样的强假设。
另一个重要的区别是,在谱聚类中,与其他方法相比,数据点不需要具有凸边界,其中紧凑性驱动聚类。谱聚类有时会很慢,因为需要计算特征值、拉普拉斯等。随着数据集的增大,复杂性增加,因此谱聚类可能会变慢,但是当我们有一个稀疏的数据集时,它是一种快速的方法。
我们现在将进行谱聚类算法的 Python 实现。
5.2.1 谱聚类的 Python 实现
到目前为止,我们已经涵盖了谱聚类的理论细节,现在是时候进入代码了。为此,我们将创建一个数据集并运行 k-means 算法,然后使用谱聚类来比较结果。
第一步:首先导入所有必要的库。这些库是标准库,除了我们将要介绍的几个。sklearn
是最著名和最受欢迎的库之一,我们从中导入 SpectralClustering
、make_blobs
和 make_circles
。
from sklearn.cluster import SpectralClustering from sklearn.datasets import make_blobs import matplotlib.pyplot as plt from sklearn.datasets import make_circles from numpy import random import numpy as np from sklearn.cluster import SpectralClustering, KMeans from sklearn.metrics import pairwise_distances from matplotlib import pyplot as plt import networkx as nx import seaborn as sns
第二步:我们现在将创建一个数据集。我们使用的是 make_circles
方法。在这里,我们取 2000 个样本,并将它们表示成一个圆。结果如下所示。
data, clusters = make_circles(n_samples=2000, noise=.01, factor=.3, random_state=5) plt.scatter(data[:,0], data[:,1])
第三步:我们现在将使用 kmeans 聚类测试这个数据集。两种颜色显示两个不同的重叠的簇。
kmeans = KMeans(init='k-means++', n_clusters=2) km_clustering = kmeans.fit(data) plt.scatter(data[:,0], data[:,1], c=km_clustering.labels_, cmap='prism', alpha=0.5, edgecolors='g')
第四步:我们现在用谱聚类运行相同的数据,发现两个簇在这里被单独处理。
spectral = SpectralClustering(n_clusters=2, affinity='nearest_neighbors', random_state=5) sc_clustering = spectral.fit(data) plt.scatter(data[:,0], data[:,1], c=sc_clustering.labels_, cmap='prism', alpha=0.5, edgecolors='g')
我们可以观察到同一数据集在两个算法中的处理方式不同。谱聚类在处理分离的圆圈时表现更好,分离的圆圈被独立的表示出来。
第五步:你可以尝试改变数据集中的值并运行算法,模拟不同的情况,进而比较结果。
第一部分的算法已经讲解完成。下一部分我们会讲解模糊聚类。.
无监督学习与生成式人工智能(MEAP)(二)(4)https://developer.aliyun.com/article/1522541