聚类算法演示与比较

聚类算法是数据挖掘和机器学习中的一种重要技术,用于将数据集中的对象分组,使得同一组内的对象比其他组的对象更相似。本文将介绍几种常见的聚类算法,并通过实例演示它们在不同数据集上的表现。

K-Means聚类算法

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()

特征聚合可以增强簇内相似度,减弱簇间相似度,从而提高聚类效果。它通常与图聚类算法结合使用,如谱聚类和层次聚类。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485