一、聚类算法的介绍
1.什么是聚类算法
- 聚类算法是一类无监督学习算法,用于将数据集中的对象分组(或聚类)成具有相似性的集合。聚类算法不依赖于预定义的类别标签,而是根据数据的内在特点将相似的数据点聚集在一起。
- 聚类算法的目标是通过最大化组内的相似性和最小化组间的差异来实现聚类。聚类算法可以帮助我们发现数据中的潜在结构、识别相似的数据点、进行数据压缩和预处理等。
2.聚类算法在现实中的应用
- 市场细分:聚类算法可以帮助市场营销人员将消费者分成不同的细分市场,根据不同的需求和行为模式进行定向营销和个性化推荐。
- 图像分析:聚类算法可用于图像分割和图像检索,将相似的图像分组在一起或识别相似的特征,用于图像分类、图像搜索和图像压缩等任务。
- 自然语言处理:聚类算法可以用于文本聚类和主题建模,将相似的文本或主题聚集在一起,用于文本分类、信息检索和文本摘要等应用。
- 生物信息学:聚类算法可用于基因表达数据分析,通过对基因表达模式的聚类,可以发现基因之间的关联性、预测基因功能和识别疾病模式等。
聚类算法在许多领域都有重要的作用,帮助人们从大规模和复杂的数据中发现模式、提取信息和做出决策。
3.聚类算法与分类算法最大的区别
- 目标:聚类算法是无监督学习方法,其目标是将数据集中的对象分成不同的组(簇),使得同一组内的对象相似性较高,不同组之间的相似性较低。而分类算法是有监督学习方法,其目标是将数据分为预定义的类别,通过学习从输入特征到类别标签的映射关系。
- 标签信息:聚类算法不需要事先知道对象的标签信息,它根据数据内在的相似性来进行分组。而分类算法的训练数据集需要包含标签信息,即每个样本都有对应的类别标签。
- 监督性:聚类算法不依赖于监督信息,它在没有预定义的类别标签下进行聚类。而分类算法依赖于监督信息,通过已知的类别标签进行模型训练和预测。
- 输出结果:聚类算法的输出是数据的分组结果,即每个数据点所属的簇或簇的分配情况。而分类算法的输出是对新样本的预测类别标签。
- 应用场景:聚类算法常用于数据挖掘、图像分析、市场细分等领域,帮助发现数据的内在结构和模式。分类算法常用于预测、识别和分类任务,例如垃圾邮件过滤、图像分类和疾病诊断等。
聚类算法也可以作为分类算法的预处理步骤,帮助对数据进行特征提取和降维,以改善分类的性能。
4.聚类算法(KMeans)的API
- sklearn.cluster.KMeans(n_cluster=8)
- 参数:
- n_cluster:要聚类的类别数
- 方法:
- estimator.fit(x)
- estimator.predict(x)
- estimator.fit_predict(x)
- 计算聚类中心并预测每个样本属于哪个类别,相当于先调用fit(x),然后再调用predict(x)
- 参数:
5.聚类算法(KMeans)实现流程
-
选择聚类数目:
确定要将数据集分成的聚类数目k。
-
初始化聚类中心:
随机选择k个数据点作为初始的聚类中心,或使用其他初始化方法。
-
迭代聚类过程:
进行以下步骤,直到满足终止条件(例如达到最大迭代次数或聚类中心的变化小于某个阈值):
- 分配样本到最近的聚类中心:计算每个数据点与各个聚类中心的距离,将数据点分配给距离最近的聚类中心。
- 更新聚类中心:对于每个聚类,计算其所包含数据点的均值,将均值作为新的聚类中心。
-
聚类结果:得到最终的聚类结果,每个数据点都被分配到一个聚类中心。
K-means算法对初始聚类中心的选择比较敏感,不同的初始选择可能会导致不同的聚类结果。为了克服这个问题,可以尝试多次运行K-means算法,每次使用不同的初始聚类中心,并选择聚类结果最好的一次。
二、模型评估
1.误差平方和(SSE):
误差平方和(Sum of Squared Errors,SSE)是一种常用的评估指标,用于衡量聚类算法(如K-means)的聚类质量。它的计算原理如下:
- 首先,对于每个数据点,计算其与所属聚类中心之间的欧氏距离。
- 对于每个数据点,将其与所属聚类中心的欧氏距离平方,得到该数据点的误差平方。
- 将所有数据点的误差平方求和,得到总的误差平方和(SSE)。
SSE的计算可以表示为以下公式:
S
S
E
=
Σ
(
d
i
s
t
a
n
c
e
(
p
o
i
n
t
,
c
e
n
t
e
r
)
2
)
SSE = Σ (distance(point, center)²)
SSE=Σ(distance(point,center)2)
其中,distance(point, center)表示数据点与所属聚类中心之间的欧氏距离,Σ表示对所有数据点求和。
SSE评估的原理是,当聚类效果较好时,同一聚类中的数据点应该相互靠近,与其他聚类中的数据点相对较远。因此,同一聚类中的数据点与其所属聚类中心的距离应该较小,导致误差平方较小。而不同聚类中的数据点与其所属聚类中心的距离较大,导致误差平方较大。因此,SSE较小表示聚类效果较好,各个聚类紧密且分离明显。
2.“肘”方法(Elbow method)–K值确定
"肘"方法(Elbow method)是一种常用的方法,用于选择K-means聚类算法中最佳的聚类数目K。如上图所示,K=3这个拐点是最佳聚类数目。其评估原理如下:
- 首先,我们尝试不同的聚类数目K,例如从K=1开始逐渐增加。
- 对于每个K值,我们计算聚类算法得到的SSE(误差平方和)。
- 绘制K值与对应的SSE之间的折线图。
- 观察折线图的形状,寻找一个拐点,类似于手肘的形状。这个拐点对应的K值就是"肘",代表着聚类数目的最佳选择。
"肘"方法的目标是找到一个合适的聚类数目K,使得增加K值之后,SSE值的下降趋势发生明显的改变,即出现一个拐点。这个拐点对应的K值即是最佳的聚类数目,可以提供合理的聚类解决方案。
3.轮廓系数法(Silhouette coefficient)
轮廓系数(Silhouette coefficient)是一种常用的聚类算法评估方法,用于衡量聚类结果的质量和紧密度。其评估原理如下:
- 对于每个数据点,计算以下两个值:
- a(i):数据点i与同一簇内其他数据点的平均距离(与簇内其他点的相似度)。
- b(i):数据点i与最近的不同簇中的数据点的平均距离(与其他簇的相异度)。
- 对于每个数据点i,计算其轮廓系数:
- s(i) = (b(i) - a(i)) / max(a(i), b(i))
- 计算整个数据集的平均轮廓系数:
- S = sum(s(i)) / n
轮廓系数的取值范围为[-1, 1],其中:
- 接近1表示数据点与其所属簇内的其他数据点相似度高且与其他簇的相异度较大,聚类结果较好。
- 接近-1表示数据点与其所属簇内的其他数据点相似度低且与其他簇的相异度较小,聚类结果较差。
- 接近0表示数据点与其所属簇内的其他数据点相似度和与其他簇的相异度相近,聚类结果不明显。
通过计算整个数据集的平均轮廓系数S,可以评估整体聚类结果的质量。较高的平均轮廓系数表示聚类结果较好,各个簇之间紧密且分离明显;较低的平均轮廓系数表示聚类结果较差,各个簇之间重叠程度较高。
-
聚类算法的优点:
可以考虑每个数据点与其所属簇内其他数据点的相似度以及与其他簇的相异度,提供了对聚类质量的综合评估。
-
聚类算法的缺点:
然而,它也存在一些限制,如对于不规则形状的聚类结果评估可能不准确,并且对于聚类数目的选择没有明确的指导。
4.CH系数(Calinski-Harabasz coefficient)
CH系数(Calinski-Harabasz coefficient)是一种聚类算法评估方法,用于衡量聚类结果的紧密度和分离度。其评估原理如下:
-
对于聚类结果,计算簇内离散度(intra-cluster dispersion)和簇间离散度(inter-cluster dispersion)。
-
簇内离散度度量了簇内数据点之间的相似程度,可以使用平均欧氏距离、平均余弦相似度等。
-
簇间离散度度量了不同簇之间的差异程度,可以使用欧氏距离、余弦相似度等。
-
计算CH系数:
- CH = (B / (k - 1)) / (W / (n - k))
其中,B为簇间离散度的总和,W为簇内离散度的总和,k为聚类数目,n为数据点总数。
CH系数的取值范围为[0, +∞],较大的CH系数表示聚类结果较好,簇内离散度小、簇间离散度大,簇与簇之间分离明显。较小的CH系数表示聚类结果较差,簇内离散度大、簇间离散度小,簇与簇之间重叠程度高。
然而,CH系数对于聚类形状和分布的偏好可能存在一定的偏差,因此在实际应用中,还需要结合其他评估指标和领域知识来进行综合评估和选择最佳的聚类结果。
-
CH需要达到的目的:
用尽量少的类别聚类尽量多的样本,同时获得较好的聚类效果。