机器学习西瓜书笔记(九) 第九章聚类+代码

2024-09-01 12:44

本文主要是介绍机器学习西瓜书笔记(九) 第九章聚类+代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第九章

  • 第九章聚类
    • 9.1 聚类任务
      • 小结
    • 9.2 性能度量
      • 小结
    • 9.3 距离计算
      • 小结
    • 9.4 原型聚类
      • 9.4.1 k均值算法
      • 9.4.2 学习向量量化
      • 9.4.3 高斯混合聚类
      • 小结
    • 9.5 密度聚类
      • 小结
    • 9.6 层次聚类
      • 小结
    • 代码
      • K-means
      • 层次聚类
      • DBSCAN
    • 总结

第九章聚类

9.1 聚类任务

在"无监督学习"中,训练样本的标记信息是未知的,目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律,为进一步的数据分析提供基础。此类学习任务中研究最多、应用最广的是"聚类"。

聚类试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个"簇"。通过这样的划分,每个簇可能对应于一些潜在的概念(类别),如"浅色瓜" “深色瓜”,“有籽瓜” “无籽瓜”,甚至"本地瓜" "外地瓜"等;需说明的是,这些概念对聚类算法而言事先是未知的,聚类过程仅能自动形成簇结构,簇所对应的概念语义需由使用者来把握和命名。

形式化地说,假定样本集 D = x 1 , x 2 , . . . , x m D={x_1,x_2,...,x_m} D=x1,x2,...,xm包含m个无标记样本,每个样本 x i = ( x i 1 , x i 2 , . . . , x i m ) x_i=(x_{i1},x_{i2},...,x_{im}) xi=(xi1,xi2,...,xim)是一个n维特征向量,则聚类算法将样本集D划分为K个不相交的簇 { C l ∣ l = 1 , 2 , . . . , k } \{C_l|l=1,2,...,k\} {Cll=1,2,...,k},其中 C l ′ ∩ l ′ ≠ l C l = ϕ C_{l'}\cap_{l'\neq l} C_l =\phi Cll=lCl=ϕ D = ∪ l = 1 k C l D=\cup_{l=1}^k C_l D=l=1kCl。相应地,用 λ j ∈ { 1 , 2 , . . . , k } \lambda_j \in \{1,2,...,k\} λj{1,2,...,k}表示样本 x j x_j xj的"簇标记",即 x j ∈ C λ j x_j \in C_{\lambda_j} xjCλj。于是,聚类的结果可用包含m个元素的簇标记向量 λ = ( λ 1 ; λ 2 ; . . . ; λ m ) \lambda=(\lambda_1;\lambda_2;...;\lambda_m) λ=(λ1;λ2;...;λm)表示。

聚类既能作为一个单独过程,用于找寻数据内在的分布结构,也可作为分类等其他学习任务的前驱过程。例如,在一些商业应用中需对新用户的类型进行判别,但定义"用户类型"对商家来说却可能不太容易,此时往往可先对用户数据进行聚类,根据聚类结果将每个簇定义为一个类,然后再基于这些类训练分类模型用于判别新用户的类型。

基于不同的学习策略,人们设计出多种类型的聚类算法。而这些聚类算法都涉及两个基本问题,即性能度量和距离计算。

小结

聚类任务是无监督学习的一种,其目标是将数据集中的样本划分为若干个组别或“簇”,使得同一个簇内的样本之间相似度高,而不同簇内的样本之间相似度低。聚类任务在许多领域都有应用,例如市场细分、社交网络分析、天文数据分析等。以下是一些常见的聚类算法:

  1. K-Means聚类:这是最常用的聚类算法之一。它通过迭代选择簇中心,并将每个样本分配给最近的簇中心,然后重新计算每个簇的中心。这个过程一直重复,直到满足停止条件。

  2. 层次聚类:这种聚类方法不需要事先指定簇的数量。它通过逐步合并或分裂样本来构建一个层次嵌套的簇树(树状的簇结构)。层次聚类可以是凝聚的(自底向上)或分裂的(自顶向下)。

  3. DBSCAN(Density-Based Spatial Clustering of Applications with Noise):这种算法基于密度的聚类方法可以识别任意形状的簇,并且能够将低密度区域的样本识别为噪声。它不需要事先指定簇的数量。

  4. Mean Shift聚类:这是一种基于密度的非参数聚类算法,它通过寻找密度函数的局部极大值点来确定簇中心。

  5. 谱聚类:这种聚类方法使用数据的相似性矩阵,通过将这个矩阵视为图的拉普拉斯矩阵,并对其进行分解来实现聚类。

  6. OPTICS(Ordering Points To Identify the Clustering Structure):是DBSCAN的一种改进算法,可以处理不同密度的簇。

  7. Affinity Propagation聚类:这种算法通过数据点间的信息传递来创建簇,不需要预先指定簇的数量。

  8. Gaussian Mixture Models(GMM):这是一种基于概率的聚类方法,它假设数据由多个高斯分布混合而成,每个高斯分布对应一个簇。

聚类任务的评估通常比较复杂,因为真实的标签通常是未知的。一些常用的评估指标包括:

  • 轮廓系数(Silhouette Coefficient):衡量样本在簇内相似度和簇间不相似度的平衡。
  • 戴维森堡丁指数(Davies-Bouldin Index):衡量簇内相似度和簇间不相似度,值越小表示聚类效果越好。
  • Calinski-Harabasz指数:衡量簇间的分离度与簇内凝聚度,值越大表示聚类效果越好。

聚类算法的选择和评估通常依赖于具体的数据集和业务需求。在实际应用中,可能需要尝试多种算法和参数调整,以达到最佳的聚类效果。

9.2 性能度量

聚类性能度量亦称聚类"有效性指标"。与监督学习中的性能度量作用相似,对聚类结果,需通过某种性能度量来评估其好坏;另方面若明确了最终将要使用的性能度量,则可直接将其作为聚类过程的优化目标从而更好地得到符合要求的聚类结果。

聚类是将样本集D划分为若干互不相交的子集,即样本簇。直观上看,希望同一簇的样本尽可能彼此相似,不同簇的样本尽可能不同换言之,聚类结果的"簇内相似度"高且"簇间相似度"低。

聚类性能度量大致有两类。一类是将聚类结果与某个"参考模型"进行比较,称为"外部指标";另一类是直接考察聚类结果而不利用任何参考模型,称为"内部指标"。
在这里插入图片描述

小结

聚类性能度量是评估无监督聚类算法效果的关键,它通常涉及多个维度,包括簇内凝聚度(即簇内样本的相似性)、簇间分离度(即不同簇之间的差异性)、稳定性(聚类结果对于数据扰动的敏感度)和可解释性(簇的直观意义和易于理解性)。这些度量指标帮助我们理解聚类算法在特定数据集上的表现,但值得注意的是,没有单一的度量能够全面评价聚类效果,因此在实际应用中,研究者往往会综合多个度量指标来获得更全面的评估。

9.3 距离计算

在这里插入图片描述

常将属性划分为"连续属性"和"离散属性",前者在定义域上有无穷多个可能的取值,后者在定义域上是有限个取值。然而,在讨论距离计算时,属性上是否定义了"序"关系更为重要。例如定义域为{1,2,3}的离散属性与连续属性的性质更接近一些,能直接在属性值上计算距离:“1"与"2"比较接近、与"3"比较远,这样的属性称为"有序属性”;而定义域为{飞机,火车,轮船}这样的离散属性则不能直接在属性值上计算距离,称为"无序属性"。显然,闵可夫斯基距离可用于有序属性。
在这里插入图片描述

需注意的是,通常是基于某种形式的距离来定义"相似度度量",距离越大,相似度越小。然而,用于相似度度量的距离未必一定要满足距离度量的所有基本性质,尤其是直递性。例如在某些任务中我们可能希望有这样的相似度度量,“人”、“马"分别与"人马"相似,但"人"与"马"很不相似;要达到这个目的,可以令"人”、“马"与"人马"之间的距离都比较小,但"人"与"马"之间的距离很大,如下图所示,此时该距离不再满足直递性;这样的距离称为"非度量距离”。此外,本节介绍的距离计算式都是事先定义好的,但在不少现实任务中,有必要基于数据样本来确定合适的距离计算式,这可通过"距离度量学习"来实现。
在这里插入图片描述

小结

聚类距离计算是聚类分析中用于衡量样本间相似性或差异性的关键步骤,涉及多种距离度量方法,如欧氏距离、曼哈顿距离、切比雪夫距离等,每种方法都有其特定的适用场景和优势,旨在准确反映样本在特征空间中的相对位置,为后续的簇形成和分类提供依据。

不同的距离度量方法适用于不同类型的数据和不同的聚类场景。在实际应用中,选择哪种距离度量方法取决于数据的特性和聚类的目标。例如,对于高维数据,可能需要使用考虑数据结构的马氏距离;对于文本数据,余弦相似度可能是更好的选择。

9.4 原型聚类

原型聚类亦称 "基于原型的聚类 " (prototype based clustering) ,此类算法假设聚类结构能通过 一组原型刻画,在现实聚类任务中极为常用.通常情形下, 算法先对原型进行初始化,然后对原型进行迭代更新求解. 采用不同的原型表
示、不同的求解方式,将产生不同的算法.下面介绍几种著名的原型聚类算法.

9.4.1 k均值算法

在这里插入图片描述

在这里插入图片描述

最小化上式并不容易,找到它的最优解需考察样本集D所有可能的簇划分,这是一个NP难问题。因此,k均值算法采用了贪心策略,通过迭代优化来近似求解上式。算法流程如下图所示,其中第1行对均值向量进行初始化,在第4-8行与第9-16行依次对当前簇划分及均值向量迭代更新,若迭代更新后聚类结果保持不变,则在第18行将当前簇划分结果返回。

在这里插入图片描述

在这里插入图片描述

更新当前均值向量后,不断重复上述过程,如下图所示,第五轮迭代产生的结果与第四轮迭代相同,于是算法停止,得到最终的簇划分。
在这里插入图片描述

9.4.2 学习向量量化

与K均值算法类似,“学习向量量化”(简称LVQ)也是试图找到一组原型向量来刻画聚类结构,但与一般聚类算法不同的是,LVQ假设数据样本带有类别标记,学习过程利用样本的这些监督信息来辅助聚类。

给定样本集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } D=\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\} D={(x1,y1),(x2,y2),...,(xm,ym)},每个样本 x j x_j xj是由n个属性描述的特征向量 ( x j 1 ; x j 2 , . . . , x j n ) , y i ∈ Y (x_{j1};x_{j2},...,x_{jn}),y_i \in Y (xj1;xj2,...,xjn),yiY是样本 x j x_j xj的类别标记。LVQ的目标是学得一组n维原型向量 { p 1 , p 2 , . . . , p q } \{p_1,p_2,...,p_q\} {p1,p2,...,pq},每个原型向量代表一个聚类簇,簇标记 t i ∈ Y t_i\in Y tiY

LVQ算法描述如下图所示.算法第1行先对原型向量进行初始化,例如对第q个簇可从类别标记为 t q t_q tq的样本中随机选取一个作为原型向量。算法第2~12行对原型向量进行迭代优化。在每一轮迭代中,算法随机选取一个有标记训练样本,找出与其距离最近的原型向量,并根据两者的类别标记是否一致来对原型向量进行相应的更新。在第12行中,若算法的停止条件已满足(例如已达到最大迭代轮数,或原型向量更新很小甚至不再更新),则将当前原型向最作为最终结果返回。
在这里插入图片描述

LVQ的关键是第6-10行,即如何更新原型向量。直观上看,对样本 x j x_j xj,若最近的原型向量 p i ∗ p_{i^{*}} pi x j x_j xj的类别标记相同,则令 p i ∗ p_{i^{*}} pi x j x_j xj的方向靠拢,如第7行所示,此时新原型向量为

在这里插入图片描述

下面以西瓜数据集4.0为例来演示LVQ的学习过程。令9-21号样本的类别标记为c2,其他样本的类别标记为c1。假定q = 5,即学习目标是找到5个原型向量 p l , p 2 , p 3 , p 4 , p 5 p_l,p_2,p_3,p_4,p_5 pl,p2,p3,p4,p5,并假定其对应的类别标记分别为 c 1 , c 2 , c 2 , c 1 , c 1 c_1,c_2,c_2,c_1,c_1 c1,c2,c2,c1,c1

算法开始时,根据样本的类别标记和簇的预设类别标记对原型向量进行随机初始化,假定初始化为样本 x 5 , x 1 2 , x 1 8 , x 2 3 , x 2 9 x_5,x_12,x_18,x_23,x_29 x5,x12,x18,x23,x29。在第一轮迭代中,假定随机选取的样本为 x 1 x_1 x1,该样本与当前原型向量 p l , p 2 , p 3 , p 4 , p 5 p_l,p_2,p_3,p_4,p_5 pl,p2,p3,p4,p5的距离分别为0.283,0.506,0.434,0.260,0.032。由于 p 5 p_5 p5 x 1 x_1 x1距离最近且两者具有相同的类别标记c2,假定学习率 η = 0.1 \eta=0.1 η=0.1,则LVQ更新p5得到新原型向量
在这里插入图片描述

在这里插入图片描述

9.4.3 高斯混合聚类

与K均值、LVQ用原型向量来刻画聚类结构不同,高斯混合聚类采用概率模型来表达聚类原型。
(多元)高斯分布的定义。对n维样本空间X中的随机向量x,若x服从高斯分布,其概率密度函数为
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

小结

原型聚类是一种常见的无监督学习方法,它通过将数据点基于距离度量划分到由原型或中心点代表的簇中,旨在优化簇内凝聚度和簇间分离度,其中K-Means算法是其最著名的代表,通过迭代优化簇中心位置来最小化簇内点到中心的距离,而K-Medoids算法则选择数据集中的点作为簇中心以提高聚类的鲁棒性,尽管原型聚类需要预先指定簇的数量,但其直观性和易于实现的特点使其在多种应用场景中广泛使用。

在原型聚类中确定最佳簇数量通常需要综合考虑多种指标和启发式方法,例如通过肘部法则观察簇内平方和的变化来识别拐点,利用轮廓系数评估簇内相似度与簇间差异度,或使用间隙统计量比较聚类内变化与随机数据分布的期望值,此外还可以参考Calinski-Harabasz指数、Davies-Bouldin指数等统计量,以及NbClust方法提供的多种指标,最终结合领域知识和数据特性来做出决定。

9.5 密度聚类

密度聚类亦称"基于密度的聚类",此类算法假设聚类结构能通过样本分布的紧密程度确定。通常情形下,密度聚类算法从样本密度的角度来考察样本之间的可连接性,并基于可连接样本不断扩展聚类簇以获得最终的聚类结果。

DBSCAN是一种著名的密度聚类算法,它基于一组"邻域"参数 ( ϵ , M i n P t s ) (\epsilon,MinPts) (ϵ,MinPts)来刻画样本分布的紧密程度。给定数据集 D = { x 1 , . . . , x m } D=\{x_1,...,x_m\} D={x1,...,xm},定义下面这几个概念:
在这里插入图片描述

基于这些概念,DBSCAN将"簇"定义为:由密度可达关系导出的最大的密度相连样本集合。形式化地说,给定邻域参数 ( ϵ , M i n P t s ) (\epsilon,MinPts) (ϵ,MinPts),簇 C ⊆ D C \subseteq D CD是满足以下性质的非空样本子集:
在这里插入图片描述

那么,如何从数据集D中找出满足以上性质的聚类簇呢?实际上,若x为核心对象,由x密度可达的所有样本组成的集合记为 X = { x ′ ∈ D ∣ x ′ X=\{x'\in D|x' X={xDx x x x密度可达 } \} },则不难证明X即为满足连接性与最大性的簇。

于是,DBSCAN算法先任选数据集中的一个核心对象为"种子",再由此出发确定相应的聚类簇,算法描述如图所示。在第1~7行中,算法
先根据给定的邻域参数 ( ϵ , M i n P t s ) (\epsilon,MinPts) (ϵ,MinPts)找出所有核心对象,然后在第10~24行中,
以任一核心对象为出发点,找出由其密度可达的样本生成聚类簇,直到所有核心对象均被访问过为止。
在这里插入图片描述

在这里插入图片描述

小结

密度聚类是一种基于空间密度的无监督学习方法,它通过识别数据空间中的高密度区域来形成簇,同时能够很好地处理噪声和发现任意形状的簇。这种聚类方法特别适合于那些不是由严格圆形或球形簇组成的数据集,并且能够识别出那些连接紧密的点群,即使这些点群被噪声和其他簇所包围。常见的密度聚类算法包括DBSCAN、OPTICS和DENCLUE,它们通过设置密度阈值和邻域大小来确定簇的边界,从而实现对数据的聚类。

9.6 层次聚类

层次聚类试图在不同层次对数据集进行划分,从而形成树形的聚类结构。数据集的划分可采用"自底向上"的聚合策略,也可采用"自顶向下"的分拆策略。

AGNES是一种采用自底向上聚合策略的层次聚类算法。它先将数据集中的每个样本看作一个初始聚类簇,然后在算法运行的每一步中找出距离最近的两个聚类簇进行合并,该过程不断重复,直至达到预设的聚类簇个数。这里的关键是如何计算聚类簇之间的距离。实际上,每个簇是一个样木集合,因此,只需采用关于集合的某种距离即可。例如,给定聚类簇 C i C_i Ci C j C_j Cj,可通过下面的式子来计算距离:
在这里插入图片描述

显然,最小距离由两个簇的最近样本决定,最大距离由两个簇的最远样本决定, 而平均距离则由两个簇的所有样本共同决定当聚类簇距离由 d m i n , d m a x d_{min}, d_{max} dmin,dmax d a v g d_{avg} davg计算时,AGNES算法被相应地称为"单链接"、"全链接"或"均链接"算法。

AGNES算法描述如下图所示在第1-9行,算法先对仪含一个样本的初始聚类簇和相应的距离矩阵进行初始化;然后在第11-23行,AGNES不断合并距离最近的聚类簇,并对合并得到的聚类簇的距离矩阵进行更新;上述过程不断重复直至达到预设的聚类簇数。
在这里插入图片描述

以西瓜数据集4.0为例,令AGNES算法一直执行到所有样本出现在同一个簇中,即k=1,则可得到下图所示的"树状图",其中每层链接一组聚类簇。
在这里插入图片描述

在树状图的特定层次上进行分割,则可得到相应的簇划分结果例如,以上图中所示虚线分割树状图,将得到包含7个聚类簇的结果:
在这里插入图片描述

将分割层逐步提升,则可得到聚类簇逐渐减少的聚类结果例如下图显示出了从上图中产生7至4个聚类簇的划分结果。
在这里插入图片描述

小结

层次聚类是一种将数据点逐步分组的无监督学习方法,它通过构建一个层次嵌套的簇树(树状的簇结构)来表示数据点之间的相似性。这种聚类方法可以是凝聚的(自底向上),从单个数据点开始逐渐合并成越来越大的簇;也可以是分裂的(自顶向下),从所有数据点组成的一个大簇开始逐渐分割成越来越小的簇。层次聚类不需要预先指定簇的数量,并且能够提供数据点之间关系的直观表示,如树状图,适用于对数据结构的探索性分析。

代码

K-means

图中首先显示了使用一个K-means算法产生三个聚类会是什么样的结果。然后显示错误初始化对分类过程的影响。通过将n_init设置为1(默认值为10),可以减少算法使用不同的质心种子运行的次数。下一幅图显示了使用八个聚类所能提供的信息,并最终得出了基本事实。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.cluster import KMeans
from sklearn import datasetsnp.random.seed(5)
iris = datasets.load_iris()
X = iris.data
y = iris.targetestimators = [('k_means_iris_8', KMeans(n_clusters=8)),('k_means_iris_3', KMeans(n_clusters=3)),('k_means_iris_bad_init', KMeans(n_clusters=3, n_init=1,init='random'))]fignum = 1
titles = ['8 clusters', '3 clusters', '3 clusters, bad initialization']
for name, est in estimators:fig = plt.figure(fignum, figsize=(4, 3))ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)est.fit(X)labels = est.labels_ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=labels.astype(np.float), edgecolor='k')ax.w_xaxis.set_ticklabels([])ax.w_yaxis.set_ticklabels([])ax.w_zaxis.set_ticklabels([])ax.set_xlabel('Petal width')ax.set_ylabel('Sepal length')ax.set_zlabel('Petal length')ax.set_title(titles[fignum - 1])ax.dist = 12fignum = fignum + 1# Plot the ground truth
fig = plt.figure(fignum, figsize=(4, 3))
ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)for name, label in [('Setosa', 0),('Versicolour', 1),('Virginica', 2)]:ax.text3D(X[y == label, 3].mean(),X[y == label, 0].mean(),X[y == label, 2].mean() + 2, name,horizontalalignment='center',bbox=dict(alpha=.2, edgecolor='w', facecolor='w'))
# Reorder the labels to have colors matching the cluster results
y = np.choose(y, [1, 2, 0]).astype(np.float)
ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=y, edgecolor='k')ax.w_xaxis.set_ticklabels([])
ax.w_yaxis.set_ticklabels([])
ax.w_zaxis.set_ticklabels([])
ax.set_xlabel('Petal width')
ax.set_ylabel('Sepal length')
ax.set_zlabel('Petal length')
ax.set_title('Ground Truth')
ax.dist = 12fig.show()

在这里插入图片描述

层次聚类

此示例使用聚合聚类和scipy中可用的树状图方法绘制了层次聚类对应的树状图。

import numpy as npfrom matplotlib import pyplot as plt
from scipy.cluster.hierarchy import dendrogram
from sklearn.datasets import load_iris
from sklearn.cluster import AgglomerativeClusteringdef plot_dendrogram(model, **kwargs):# Create linkage matrix and then plot the dendrogram# create the counts of samples under each nodecounts = np.zeros(model.children_.shape[0])n_samples = len(model.labels_)for i, merge in enumerate(model.children_):current_count = 0for child_idx in merge:if child_idx < n_samples:current_count += 1  # leaf nodeelse:current_count += counts[child_idx - n_samples]counts[i] = current_countlinkage_matrix = np.column_stack([model.children_, model.distances_,counts]).astype(float)# Plot the corresponding dendrogramdendrogram(linkage_matrix, **kwargs)iris = load_iris()
X = iris.data# setting distance_threshold=0 ensures we compute the full tree.
model = AgglomerativeClustering(distance_threshold=0, n_clusters=None)model = model.fit(X)
plt.title('Hierarchical Clustering Dendrogram')
# plot the top three levels of the dendrogram
plot_dendrogram(model, truncate_mode='level', p=3)
plt.xlabel("Number of points in node (or index of point if no parenthesis).")
plt.show()

在这里插入图片描述

DBSCAN

发现高密度的核心样本并从中膨胀聚类。

import numpy as npfrom sklearn.cluster import DBSCAN
from sklearn import metrics
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler# #############################################################################
# Generate sample data
centers = [[1, 1], [-1, -1], [1, -1]]
X, labels_true = make_blobs(n_samples=750, centers=centers, cluster_std=0.4,random_state=0)X = StandardScaler().fit_transform(X)# #############################################################################
# Compute DBSCAN
db = DBSCAN(eps=0.3, min_samples=10).fit(X)
core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
core_samples_mask[db.core_sample_indices_] = True
labels = db.labels_# Number of clusters in labels, ignoring noise if present.
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
n_noise_ = list(labels).count(-1)print('Estimated number of clusters: %d' % n_clusters_)
print('Estimated number of noise points: %d' % n_noise_)
print("Homogeneity: %0.3f" % metrics.homogeneity_score(labels_true, labels))
print("Completeness: %0.3f" % metrics.completeness_score(labels_true, labels))
print("V-measure: %0.3f" % metrics.v_measure_score(labels_true, labels))
print("Adjusted Rand Index: %0.3f"% metrics.adjusted_rand_score(labels_true, labels))
print("Adjusted Mutual Information: %0.3f"% metrics.adjusted_mutual_info_score(labels_true, labels))
print("Silhouette Coefficient: %0.3f"% metrics.silhouette_score(X, labels))# #############################################################################
# Plot result
import matplotlib.pyplot as plt# Black removed and is used for noise instead.
unique_labels = set(labels)
colors = [plt.cm.Spectral(each)for each in np.linspace(0, 1, len(unique_labels))]
for k, col in zip(unique_labels, colors):if k == -1:# Black used for noise.col = [0, 0, 0, 1]class_member_mask = (labels == k)xy = X[class_member_mask & core_samples_mask]plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),markeredgecolor='k', markersize=14)xy = X[class_member_mask & ~core_samples_mask]plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),markeredgecolor='k', markersize=6)plt.title('Estimated number of clusters: %d' % n_clusters_)

在这里插入图片描述

总结

第九章聚类包括聚类任务的介绍、性能度量、距离计算、原型聚类、密度聚类和层次聚类等几个部分。以下是对这些内容的简要总结:

  1. 聚类任务:聚类是无监督学习中的一种方法,旨在将数据集中的样本划分为若干个簇,使得同一簇内的样本尽可能相似,不同簇之间的样本尽可能不同。聚类结果可以揭示数据的内在结构,也可以作为其他学习任务的前处理步骤。

  2. 性能度量:聚类性能度量用于评估聚类结果的好坏。内部指标直接基于聚类结果进行评估,而外部指标则需要一个参考模型进行比较。常见的内部指标包括轮廓系数、Davies-Bouldin指数等。

  3. 距离计算:距离计算是聚类算法中的基础,用于衡量样本之间的相似度。不同的属性类型(连续、离散、有序、无序)可能需要不同的距离计算方法。闵可夫斯基距离是常用的距离度量之一。

  4. 原型聚类:原型聚类算法假设聚类结构可以通过一组原型来刻画。K均值算法是原型聚类中的一个代表,它通过迭代优化的方式将数据划分为多个簇,使得簇内距离最小化。

  5. 密度聚类:密度聚类算法基于样本分布的密度,通过识别高密度区域来形成簇。DBSCAN算法是密度聚类的一个典型例子,它通过核心样本和邻域参数来定义簇。

  6. 层次聚类:层次聚类通过逐步合并或分割样本来构建一个层次结构的簇树。AGNES算法是层次聚类的一个实例,它采用自底向上的策略,逐步合并距离最近的簇。

最后,文中还提供了一些Python代码示例,用于演示K均值聚类、层次聚类和DBSCAN算法的实现和结果可视化。这些代码可以帮助读者更好地理解聚类算法的工作原理和应用场景。

这篇关于机器学习西瓜书笔记(九) 第九章聚类+代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126969

相关文章

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程