本文主要是介绍机器学习西瓜书笔记(九) 第九章聚类+代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
第九章
- 第九章聚类
- 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\} {Cl∣l=1,2,...,k},其中 C l ′ ∩ l ′ ≠ l C l = ϕ C_{l'}\cap_{l'\neq l} C_l =\phi Cl′∩l′=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} xj∈Cλj。于是,聚类的结果可用包含m个元素的簇标记向量 λ = ( λ 1 ; λ 2 ; . . . ; λ m ) \lambda=(\lambda_1;\lambda_2;...;\lambda_m) λ=(λ1;λ2;...;λm)表示。
聚类既能作为一个单独过程,用于找寻数据内在的分布结构,也可作为分类等其他学习任务的前驱过程。例如,在一些商业应用中需对新用户的类型进行判别,但定义"用户类型"对商家来说却可能不太容易,此时往往可先对用户数据进行聚类,根据聚类结果将每个簇定义为一个类,然后再基于这些类训练分类模型用于判别新用户的类型。
基于不同的学习策略,人们设计出多种类型的聚类算法。而这些聚类算法都涉及两个基本问题,即性能度量和距离计算。
小结
聚类任务是无监督学习的一种,其目标是将数据集中的样本划分为若干个组别或“簇”,使得同一个簇内的样本之间相似度高,而不同簇内的样本之间相似度低。聚类任务在许多领域都有应用,例如市场细分、社交网络分析、天文数据分析等。以下是一些常见的聚类算法:
-
K-Means聚类:这是最常用的聚类算法之一。它通过迭代选择簇中心,并将每个样本分配给最近的簇中心,然后重新计算每个簇的中心。这个过程一直重复,直到满足停止条件。
-
层次聚类:这种聚类方法不需要事先指定簇的数量。它通过逐步合并或分裂样本来构建一个层次嵌套的簇树(树状的簇结构)。层次聚类可以是凝聚的(自底向上)或分裂的(自顶向下)。
-
DBSCAN(Density-Based Spatial Clustering of Applications with Noise):这种算法基于密度的聚类方法可以识别任意形状的簇,并且能够将低密度区域的样本识别为噪声。它不需要事先指定簇的数量。
-
Mean Shift聚类:这是一种基于密度的非参数聚类算法,它通过寻找密度函数的局部极大值点来确定簇中心。
-
谱聚类:这种聚类方法使用数据的相似性矩阵,通过将这个矩阵视为图的拉普拉斯矩阵,并对其进行分解来实现聚类。
-
OPTICS(Ordering Points To Identify the Clustering Structure):是DBSCAN的一种改进算法,可以处理不同密度的簇。
-
Affinity Propagation聚类:这种算法通过数据点间的信息传递来创建簇,不需要预先指定簇的数量。
-
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),yi∈Y是样本 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 ti∈Y。
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 C⊆D是满足以下性质的非空样本子集:
那么,如何从数据集D中找出满足以上性质的聚类簇呢?实际上,若x为核心对象,由x密度可达的所有样本组成的集合记为 X = { x ′ ∈ D ∣ x ′ X=\{x'\in D|x' X={x′∈D∣x′由 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_)
总结
第九章聚类包括聚类任务的介绍、性能度量、距离计算、原型聚类、密度聚类和层次聚类等几个部分。以下是对这些内容的简要总结:
-
聚类任务:聚类是无监督学习中的一种方法,旨在将数据集中的样本划分为若干个簇,使得同一簇内的样本尽可能相似,不同簇之间的样本尽可能不同。聚类结果可以揭示数据的内在结构,也可以作为其他学习任务的前处理步骤。
-
性能度量:聚类性能度量用于评估聚类结果的好坏。内部指标直接基于聚类结果进行评估,而外部指标则需要一个参考模型进行比较。常见的内部指标包括轮廓系数、Davies-Bouldin指数等。
-
距离计算:距离计算是聚类算法中的基础,用于衡量样本之间的相似度。不同的属性类型(连续、离散、有序、无序)可能需要不同的距离计算方法。闵可夫斯基距离是常用的距离度量之一。
-
原型聚类:原型聚类算法假设聚类结构可以通过一组原型来刻画。K均值算法是原型聚类中的一个代表,它通过迭代优化的方式将数据划分为多个簇,使得簇内距离最小化。
-
密度聚类:密度聚类算法基于样本分布的密度,通过识别高密度区域来形成簇。DBSCAN算法是密度聚类的一个典型例子,它通过核心样本和邻域参数来定义簇。
-
层次聚类:层次聚类通过逐步合并或分割样本来构建一个层次结构的簇树。AGNES算法是层次聚类的一个实例,它采用自底向上的策略,逐步合并距离最近的簇。
最后,文中还提供了一些Python代码示例,用于演示K均值聚类、层次聚类和DBSCAN算法的实现和结果可视化。这些代码可以帮助读者更好地理解聚类算法的工作原理和应用场景。
这篇关于机器学习西瓜书笔记(九) 第九章聚类+代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!