赞
踩
目录
2.5.1 SC轮廓系数(Silhouette Coefficient)
聚类算法的核心思想是将数据集中的样本划分为若干个不相交的子集,即“簇”。每个簇可能对应于一些潜在的概念或类别。聚类算法的目标是让同一簇内的数据样本尽可能相似,而不同簇间的数据样本尽可能不相似。这种相似性通常基于数据样本之间的某种距离度量来定义,如欧氏距离、余弦相似度等。
聚类算法是无监督学习方法的一种,它不需要预先设定数据标签或类别信息,而是通过分析数据样本之间的内在规律和特征来自动划分数据类别。聚类算法的种类繁多,包括基于划分的聚类算法(如K-means)、基于层次的聚类算法、基于密度的聚类算法(如DBSCAN)、基于网格的聚类算法、基于模型的聚类算法等。(本处只介绍K-means算法)
K-means算法是一种基于迭代的聚类算法,它试图将数据点划分为K个集群(或称为簇),使得每个数据点都属于离其最近的均值(即聚类中心或质心)所对应的集群。K-means算法的核心是更新质心和分配数据点到最近的质心。
距离度量:通常使用欧氏距离来度量数据点与质心之间的距离。但在某些情况下,也可以使用其他距离度量,如曼哈顿距离、余弦相似度等。
准则函数(SSE):K-means算法使用均方差(Sum of the Squared Errors, SSE)作为准则函数,也称为损失函数。SSE表示每个数据点到其所属集群的质心的距离的平方和。数学上,SSE可以表示为:
其中,Ci是第i个集群的数据点集合,μi是第i个集群的质心,∣∣x−μi∣∣是数据点x与质心μi之间的距离。
“肘”方法(Elbow Method)是一种常用于确定K-means聚类算法中最佳聚类数(K值)的启发式方法。该方法基于SSE(Sum of the Squared Errors,误差平方和)与聚类数K之间的关系来确定最佳的K值。
以下是使用“肘”方法确定K值的步骤:
需要注意的是,“肘”方法是一种启发式方法,其结果可能受到数据分布、噪声等因素的影响。因此,在实际应用中,可能需要结合其他方法(如轮廓系数、Calinski-Harabasz指数等)来综合评估聚类效果,并选择最佳的K值。
在Python中,我们可以使用sklearn库的KMeans类来执行K-means聚类,并计算不同K值下的SSE(误差平方和),然后通过绘制图形来找到“肘点”。以下是一个简单的代码示例,用于实现这一过程:
- import numpy as np
- import matplotlib.pyplot as plt
- from sklearn.cluster import KMeans
- from sklearn.datasets import make_blobs
-
- # 生成模拟数据
- X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
-
- # 初始化一个空的列表来存储SSE值
- sse = []
-
- # 遍历不同的K值
- for k in range(1, 11):
- kmeans = KMeans(n_clusters=k, init='k-means++', max_iter=300, n_init=10, random_state=0)
- kmeans.fit(X)
- sse.append(kmeans.inertia_) # inertia_ 是KMeans类的一个属性,它给出了每个点到其最近质心的距离的平方和
-
- # 绘制SSE与K值的关系图
- plt.plot(range(1, 11), sse)
- plt.title('The Elbow Method showing the optimal k')
- plt.xlabel('Number of clusters')
- plt.ylabel('SSE')
- plt.show()
-
- # 根据SSE图,找到“肘点”
- # 实际应用中,可能需要一些启发式规则或手动选择
- # 例如,可以通过检查SSE的减少率来找到“肘点”
- # 这里我们假设“肘点”是SSE开始平缓变化的点
- # 注意:这是一个简化的示例,实际中可能需要更复杂的逻辑来确定“肘点”
在这个例子中,我们使用make_blobs
函数生成了一个模拟数据集,然后遍历了从1到10的不同K值,并计算了每个K值下的SSE。然后,我们使用matplotlib库绘制了SSE与K值的关系图。
要找到“肘点”,通常我们需要观察SSE的减少率。在图中,当K值较小时,SSE的减少幅度通常很大,因为增加聚类数能够显著改善聚类效果。然而,当K值增加到一定程度时,SSE的减少率会开始放缓,形成一个类似于“肘部”的弯曲点。这个“肘点”就是我们要找的K值。
在实际应用中,可能需要一些启发式规则或手动选择来确定“肘点”。例如,我们可以计算相邻K值之间SSE的减少率,并找到减少率开始明显放缓的点。然而,需要注意的是,“肘点”方法并不是一种严格的数学方法,其结果可能会受到数据分布、噪声等因素的影响。因此,在实际应用中,我们可能需要结合其他方法(如轮廓系数、Calinski-Harabasz指数等)来综合评估聚类效果,并选择最佳的K值。
轮廓系数(Silhouette Coefficient)是一种用于评估聚类效果的指标,它结合了聚类的凝聚度和分离度两种因素。对于数据集中的每个样本,轮廓系数衡量了样本与其所属聚类内其他样本的相似度(凝聚度)以及样本与其他聚类中样本的不相似度(分离度)。
轮廓系数是针对单个样本的,然后取所有样本的平均值得到整个数据集的轮廓系数。对于数据集中的第i
个样本,其轮廓系数s(i)
的计算步骤如下:
1. 计算样本i
到同聚类其他样本的平均距离a(i)
:这代表了样本i
所属聚类的凝聚度。a(i)
越小,说明样本i
越应该被聚类到该簇。
其中,C_i
是样本i
所属的聚类,|C_i|
是该聚类的样本数,dist(i, j)
是样本i
和j
之间的距离。
2.计算样本i
到所有其他聚类中的样本的平均距离的最小值b(i)
:这代表了样本i
与其他聚类的分离度。b(i)
越大,说明样本i
越不属于其他聚类。
其中,C_k
是除了C_i
以外的其他聚类。
3.计算样本i
的轮廓系数s(i)
:
轮廓系数的值域是[-1, 1]
。值越接近1表示聚类效果越好,样本i
越应该被聚类到当前聚类;值越接近-1表示聚类效果越差,样本i
更可能被聚类到错误的聚类中;值接近0则表示样本i
在两个聚类的边界上。
4.计算整个数据集的轮廓系数:取所有样本轮廓系数的平均值。
Calinski-Harabasz Index(Calinski-Harabasz指数)是聚类分析中的一种评估指标,主要用于评估聚类效果的好坏。以下是关于Calinski-Harabasz Index的详细介绍:
Calinski-Harabasz指数是基于簇内的协方差与簇间的协方差之间的比值进行计算的。该指标值越大,代表聚类效果越好。
Calinski-Harabasz指数通过计算聚类之间的离散度与聚类内部的紧密度之比来确定最佳的聚类数((m - k))/((k - 1))部分是一个修正系数,用于平衡聚类数量和样本数量对指标的影响。
当簇的密集且分离较好时,Calinski-Harabasz指数的值会更高。这意味着簇内部的数据点紧密聚集,而簇与簇之间有明显的分离。因此,Calinski-Harabasz指数越大,表示聚类效果越好。
Calinski-Harabasz指数适用于各种类型的数据集,尤其是数据分布相对均匀且没有明显的几何形状的聚类结构。然而,在处理具有非凸形状的聚类结构或存在噪声和异常值的数据集时,可能需要结合其他聚类评估指标进行综合评估。
- import numpy as np
- import matplotlib.pyplot as plt
- from sklearn.cluster import KMeans
- from sklearn.datasets import make_blobs
-
- # 创建一个包含不同数量簇的模拟数据集
- X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
-
- # 定义畸变程度(Distortion)的计算函数
- def calculate_distortion(X, k):
- kmeans = KMeans(n_clusters=k, random_state=0).fit(X)
- return kmeans.inertia_
-
- # 初始化一个列表,用于存储不同K值对应的畸变程度
- distortions = []
- for i in range(1, 11):
- K = i
- distortions.append(calculate_distortion(X, K))
-
- # 绘制K值与畸变程度的曲线
- plt.plot(range(1, 11), distortions, marker='o')
- plt.xlabel('Number of clusters')
- plt.ylabel('Distortion')
- plt.title('The Elbow Method showing the optimal k')
- plt.show()
-
- # 根据肘部方法选择最佳的K值(这里可以手动从图中观察)
- # 也可以编写一个自动化方法来选择K值,例如通过计算畸变程度的二阶导数或者变化率来选择
- # 自动化选择K值的示例(这里使用简单的斜率变化来模拟)
- # ... (这部分代码需要根据你的需求来实现)
-
- # 假设我们从图中观察到K=4时有一个明显的肘部,因此选择K=4
- best_k = 4
- kmeans = KMeans(n_clusters=best_k, random_state=0).fit(X)
- labels = kmeans.predict(X)
-
- # 绘制聚类结果
- plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
- centers = kmeans.cluster_centers_
- plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.5);
- plt.show()
在这个例子中,我们首先生成了一个模拟数据集,然后使用了一个函数来计算不同K值对应的畸变程度。接着,我们绘制了K值与畸变程度的曲线图,并手动从图中选择了最佳的K值。最后,我们使用选定的K值来执行K-means聚类,并绘制了聚类结果。
注意:在实际应用中,肘部可能并不总是那么明显,特别是在数据集非常复杂或者噪声很大的情况下。因此,你可能需要结合其他方法或者领域知识来确定最佳的K值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。