聚类算法是数据挖掘和机器学习中的一种重要技术,用于将数据集中的对象分组,使得同一组内的对象比其他组的对象更相似。本文将介绍几种常见的聚类算法,并通过实例演示它们在不同数据集上的表现。
K-Means 是一种广泛使用的聚类算法,它通过迭代优化簇中心来将数据点分配到 K 个簇中。下面是一个使用K-Means算法对手绘数字数据进行聚类的示例。
# 假设已经有了一个数据集和对应的标签
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 初始化 KMeans
kmeans = KMeans(n_clusters=10, random_state=0)
# 拟合模型
kmeans.fit(digits.data)
# 预测簇标签
labels = kmeans.predict(digits.data)
# 可视化聚类结果
plt.scatter(digits.data[:, 0], digits.data[:, 1], c=labels)
plt.show()
K-Means 算法简单高效,但它需要预先指定簇的数量,并且对初始簇中心的选择敏感。此外,它假设簇是凸形的,这在某些情况下可能不适用。
层次聚类是一种基于树状结构的聚类方法,它可以生成不同层次的聚类结果。下面是一个使用层次聚类对硬币图像进行聚类的示例。
# 假设已经有了一个硬币图像的数据集
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
# 计算层次聚类
Z = linkage(coins.data, method='ward')
# 绘制树状图
plt.figure(figsize=(10, 7))
dendrogram(Z)
plt.title('Hierarchical Clustering Dendrogram')
plt.show()
层次聚类不需要预先指定簇的数量,可以发现数据的层次结构。但它的时间复杂度较高,不适合处理大规模数据集。
均值漂移是一种基于密度的聚类算法,它通过迭代寻找密度峰值来确定簇中心。下面是一个使用均值漂移算法对数据进行聚类的示例。
# 假设已经有了一个数据集
from sklearn.cluster import MeanShift, estimate_bandwidth
# 估计带宽
bandwidth = estimate_bandwidth(X, quantile=0.2, n_samples=500)
# 初始化 MeanShift
ms = MeanShift(bandwidth=bandwidth, bin_seeding=True)
# 拟合模型
ms.fit(X)
# 获取簇标签和中心
labels = ms.labels_
cluster_centers = ms.cluster_centers_
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(cluster_centers[:, 0], cluster_centers[:, 1], s=50, c='red')
plt.show()
均值漂移算法不需要预先指定簇的数量,可以处理任意形状的簇。但它对参数敏感,且计算复杂度较高。
聚类性能评估是衡量聚类算法效果的重要手段。下面是一个使用轮廓系数对 K-Means 聚类结果进行评估的示例。
# 假设已经有了一个数据集和对应的 K-Means 聚类标签
from sklearn.metrics import silhouette_score
# 计算轮廓系数
silhouette_avg = silhouette_score(X, labels)
print("轮廓系数: {:.3f}".format(silhouette_avg))
轮廓系数是一个介于 -1 和 1 之间的值,值越高表示聚类效果越好。它考虑了簇内相似度和簇间不相似度,是一个常用的聚类性能评估指标。
特征选择和聚合是聚类分析中的重要步骤,它们可以提高聚类算法的性能和可解释性。下面是一个使用特征聚合对数据进行聚类的示例。
# 假设已经有了一个数据集
from sklearn.cluster import KMeans
from sklearn.feature_extraction.image import grid_to_graph
# 创建网格图
graph = grid_to_graph(n_x=10, n_y=10, n_z=1)
# 特征聚合
connectivity = graph_laplacian(graph, normed=True)
affinity_matrix = np.exp(-connectivity / (2. * sigma ** 2))
# 初始化 KMeans
kmeans = KMeans(n_clusters=5, affinity='nearest_neighbors', n_neighbors=10)
# 拟合模型
kmeans.fit(affinity_matrix)
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_)
plt.show()
特征聚合可以增强簇内相似度,减弱簇间相似度,从而提高聚类效果。它通常与图聚类算法结合使用,如谱聚类和层次聚类。