聚类是一种无监督学习任务,旨在将数据集中的样本分成不同的组或簇,使得同一簇内的样本相似度较高,而不同簇之间的样本相似度较低。聚类算法试图在没有先验标签的情况下发现数据中的内在结构和模式。
以下是一个常见的聚类算法示例:K-means 聚类算法。
K-means 算法的基本思想是将数据分成 K 个簇,每个簇由一个中心点(质心)来表示。算法的步骤如下:
- 初始化:随机选择 K 个样本作为初始质心。
- 质心分配:对于每个样本,计算其与每个质心的距离,将样本分配给最近的质心所属的簇。
- 更新质心:对于每个簇,计算其内部样本的平均值,将其作为新的质心。
- 重复步骤 2 和步骤 3,直到质心不再改变或达到预定的迭代次数。
以下是一个使用 scikit-learn 库中的 K-means 算法进行聚类的示例代码:
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 生成一个模拟的聚类数据集
X, _ = make_blobs(n_samples=200, centers=4, random_state=42)
# 使用K-means算法进行聚类
kmeans = KMeans(n_clusters=4, random_state=42)
kmeans.fit(X)
# 获取聚类结果
cluster_labels = kmeans.labels_
centroids = kmeans.cluster_centers_
# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=cluster_labels)
plt.scatter(centroids[:, 0], centroids[:, 1], marker='X', color='red', s=100)
plt.title('K-means Clustering')
plt.show()
上述代码生成了一个模拟的聚类数据集,并使用 K-means 算法对数据进行聚类。通过 fit() 方法进行训练后,labels* 属性包含每个样本的聚类标签,cluster_centers* 属性包含每个簇的质心坐标。
最后,通过绘制散点图,我们可以将聚类结果可视化,其中每个样本的颜色表示其所属的簇,红色的 X 表示簇的质心。
聚类算法有许多变体和改进,包括层次聚类、DBSCAN、GMM 等。具体选择哪个算法取决于数据的性质和问题的要求。
当涉及聚类时,可以使用一些评价指标来评估聚类结果的质量。以下是两个常用的聚类评价指标:
- 轮廓系数(Silhouette Coefficient):
轮廓系数是一种衡量样本聚类紧密度和分离度的指标。它的取值范围在[-1, 1]之间,数值越接近 1 表示样本聚类得越好,数值越接近-1 表示样本聚类得越差。
轮廓系数的计算方式如下:
- 对于样本 i,计算其与同簇其他样本的平均距离,记为 a(i)。
- 对于样本 i,计算其与最近其他簇中样本的平均距离,记为 b(i)。
- 计算样本 i 的轮廓系数:s(i) = (b(i) – a(i)) / max(a(i), b(i))。
- 对所有样本的轮廓系数取平均,得到聚类的整体轮廓系数。
- 均一性(Homogeneity)和完整性(Completeness):
均一性和完整性是一对互补的度量指标,用于评估聚类结果与真实标签之间的一致性。
均一性度量了同一真实类别中的样本是否都被分配到了同一个簇中。完整性度量了同一个簇中的样本是否都属于同一个真实类别。
均一性和完整性的计算方式如下:
- 均一性(h) = 1 – H(C|K) / H(C),其中 H(C|K) 是给定聚类结果下,条件熵。
- 完整性(c) = 1 – H(K|C) / H(K),其中 H(K|C) 是给定真实标签下,条件熵。
- 调和平均(v) = 2 _ (h _ c) / (h + c)。
需要注意的是,聚类评价指标仅对有已知真实标签的数据集有效。在没有真实标签的情况下,评估聚类结果的质量会更加主观。
以下是一个示例代码,演示如何使用轮廓系数和均一性、完整性进行聚类结果的评估:
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score, homogeneity_completeness_v_measure
# 生成一个模拟的聚类数据集
X, y = make_blobs(n_samples=200, centers=4, random_state=42)
# 使用K-means算法进行聚类
kmeans = KMeans(n_clusters=4, random_state=42)
kmeans.fit(X)
# 获取聚类结果和真实标签
cluster_labels = kmeans.labels_
# 计算轮廓系数
silhouette_avg = silhouette_score(X, cluster_labels)
print("轮廓系数:", silhouette_avg)
# 计算均一性、完整性和调和平均
homo, comp, v_measure = homogeneity_completeness_v_measure(y, cluster_labels)
print("均一性:", homo)
print("完整性:", comp)
print("调和平均:", v_measure)
上述代码中,通过调用 scikit-learn 库中的 silhouette_score 函数计算轮廓系数。该函数需要传入原始数据集 X 和聚类结果 cluster_labels。
同时,使用 homogeneity_completeness_v_measure 函数计算均一性、完整性和调和平均。该函数需要传入真实标签 y 和聚类结果 cluster_labels。
执行上述代码后,会分别打印轮廓系数、均一性、完整性和调和平均的值,用于评估聚类结果的质量。
这些评价指标可以帮助我们了解聚类结果的紧密度、分离度和与真实标签的一致性。在实际应用中,根据具体问题的需求,选择适当的评价指标来评估聚类结果。