赞
踩
聚类是一种将数据分组的无监督学习方法,其目标是使同组内的数据相似度高,不同组间的数据相似度低。常用的聚类算法包括K均值聚类、层次聚类和DBSCAN等。下面是这些算法的Python实现和案例分析。
项目背景:我们有一组二维数据点,目标是将这些点分成三组(即三类)。
K均值聚类是一种迭代算法,目标是通过最小化类内距离平方和来找到簇的最优分组。
Python 实现:
- from sklearn.cluster import KMeans
- import matplotlib.pyplot as plt
- import numpy as np
-
- # 生成示例数据
- np.random.seed(0)
- X = np.vstack([
- np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
- np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
- np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
- ])
-
- # 使用K均值算法聚类
- kmeans = KMeans(n_clusters=3, random_state=0)
- kmeans.fit(X)
- y_kmeans = kmeans.predict(X)
-
- # 可视化结果
- plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
- centers = kmeans.cluster_centers_
- plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='X')
- plt.xlabel('X axis')
- plt.ylabel('Y axis')
- plt.title('K-Means Clustering')
- plt.show()

项目背景:层次聚类的目标是通过递归合并或拆分簇来形成一组聚类。它可以通过聚合或分裂的方式进行。
Python 实现:
- from scipy.cluster.hierarchy import dendrogram, linkage, fcluster
- import matplotlib.pyplot as plt
- import numpy as np
-
- # 生成示例数据
- np.random.seed(0)
- X = np.vstack([
- np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
- np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
- np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
- ])
-
- # 进行层次聚类
- Z = linkage(X, 'ward')
- dendrogram(Z)
- plt.xlabel('Samples')
- plt.ylabel('Distance')
- plt.title('Dendrogram for Hierarchical Clustering')
- plt.show()
-
- # 根据距离阈值分配簇标签
- max_d = 5
- clusters = fcluster(Z, max_d, criterion='distance')
-
- # 可视化结果
- plt.scatter(X[:, 0], X[:, 1], c=clusters, s=50, cmap='viridis')
- plt.xlabel('X axis')
- plt.ylabel('Y axis')
- plt.title('Hierarchical Clustering')
- plt.show()

项目背景:DBSCAN是一种基于密度的聚类算法,它可以发现任意形状的簇,并识别出噪声点。
Python 实现:
- from sklearn.cluster import DBSCAN
- import matplotlib.pyplot as plt
- import numpy as np
-
- # 生成示例数据
- np.random.seed(0)
- X = np.vstack([
- np.random.normal(loc=[2, 2], scale=0.3, size=(50, 2)),
- np.random.normal(loc=[8, 3], scale=0.3, size=(50, 2)),
- np.random.normal(loc=[5, 8], scale=0.3, size=(50, 2)),
- np.random.normal(loc=[8, 8], scale=0.3, size=(50, 2))
- ])
-
- # 使用DBSCAN算法聚类
- dbscan = DBSCAN(eps=0.5, min_samples=5)
- y_dbscan = dbscan.fit_predict(X)
-
- # 可视化结果
- plt.scatter(X[:, 0], X[:, 1], c=y_dbscan, s=50, cmap='viridis')
- plt.xlabel('X axis')
- plt.ylabel('Y axis')
- plt.title('DBSCAN Clustering')
- plt.show()

不同的聚类算法在面对不同形状、大小和密度的数据集时各有优缺点:
在实际应用中,选择合适的聚类算法需要结合数据的特性、任务的需求和算法的复杂度等因素。
项目背景:均值漂移是一种基于密度的聚类算法,通过平滑分布并逐步漂移均值来找到簇的峰值。它不需要预先指定簇的数量。
Python 实现:
- from sklearn.cluster import MeanShift, estimate_bandwidth
- import matplotlib.pyplot as plt
- import numpy as np
-
- # 生成示例数据
- np.random.seed(0)
- X = np.vstack([
- np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
- np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
- np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
- ])
-
- # 使用均值漂移算法聚类
- bandwidth = estimate_bandwidth(X, quantile=0.2, n_samples=100)
- meanshift = MeanShift(bandwidth=bandwidth, bin_seeding=True)
- meanshift.fit(X)
- labels = meanshift.labels_
- cluster_centers = meanshift.cluster_centers_
-
- # 可视化结果
- plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
- plt.scatter(cluster_centers[:, 0], cluster_centers[:, 1], c='red', s=200, alpha=0.75, marker='X')
- plt.xlabel('X axis')
- plt.ylabel('Y axis')
- plt.title('Mean Shift Clustering')
- plt.show()

项目背景:GMM是一种基于概率模型的聚类方法,假定数据来自于多个不同的正态分布,并通过EM算法估计参数。
Python 实现:
- from sklearn.mixture import GaussianMixture
- import matplotlib.pyplot as plt
- import numpy as np
-
- # 生成示例数据
- np.random.seed(0)
- X = np.vstack([
- np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
- np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
- np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
- ])
-
- # 使用GMM聚类
- gmm = GaussianMixture(n_components=3, random_state=0)
- gmm.fit(X)
- labels = gmm.predict(X)
-
- # 可视化结果
- plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
- plt.xlabel('X axis')
- plt.ylabel('Y axis')
- plt.title('Gaussian Mixture Model Clustering')
- plt.show()

项目背景:谱聚类是一种利用图论的聚类算法,通过对数据点之间的相似性矩阵进行谱分解来确定聚类。
Python 实现:
- from sklearn.cluster import SpectralClustering
- import matplotlib.pyplot as plt
- import numpy as np
-
- # 生成示例数据
- np.random.seed(0)
- X = np.vstack([
- np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
- np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
- np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
- ])
-
- # 使用谱聚类算法聚类
- spectral = SpectralClustering(n_clusters=3, affinity='nearest_neighbors', random_state=0)
- labels = spectral.fit_predict(X)
-
- # 可视化结果
- plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
- plt.xlabel('X axis')
- plt.ylabel('Y axis')
- plt.title('Spectral Clustering')
- plt.show()

我们在这几个案例中展示了不同聚类算法的使用和效果,包括:
不同的聚类算法在不同的场景下都有各自的优缺点。结合数据的特点和实际需求选择合适的算法,可以提高聚类的准确性和实用性。
继续深入探讨更多的聚类算法,我们可以学习模糊C均值(FCM)和自组织映射(SOM)等技术,以及探讨如何评估聚类结果的质量。
项目背景:模糊C均值聚类是一种允许数据点同时属于多个簇的聚类方法。每个数据点都分配了一个隶属度,表示其属于某一簇的概率。
Python 实现:
安装scikit-fuzzy
库:
pip install scikit-fuzzy
代码实现:
- import numpy as np
- import matplotlib.pyplot as plt
- import skfuzzy as fuzz
-
- # 生成示例数据
- np.random.seed(0)
- X = np.vstack([
- np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
- np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
- np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
- ])
-
- # 转置输入数据
- X_T = X.T
-
- # 使用模糊C均值算法聚类
- cntr, u, u0, d, jm, p, fpc = fuzz.cluster.cmeans(
- X_T, 3, 2, error=0.005, maxiter=1000, init=None)
-
- # 获取每个数据点的聚类标签
- cluster_membership = np.argmax(u, axis=0)
-
- # 可视化结果
- plt.scatter(X[:, 0], X[:, 1], c=cluster_membership, s=50, cmap='viridis')
- plt.xlabel('X axis')
- plt.ylabel('Y axis')
- plt.title('Fuzzy C-Means Clustering')
- plt.show()

项目背景:自组织映射(SOM)是一种无监督学习的神经网络方法,通过映射高维数据到低维网格的方式实现聚类和数据可视化。
Python 实现:
安装minisom
库:
pip install minisom
代码实现:
- import numpy as np
- import matplotlib.pyplot as plt
- from minisom import MiniSom
-
- # 生成示例数据
- np.random.seed(0)
- X = np.vstack([
- np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
- np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
- np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
- ])
-
- # 使用SOM进行聚类
- som = MiniSom(x=7, y=7, input_len=2, sigma=0.5, learning_rate=0.5)
- som.random_weights_init(X)
- som.train_random(X, 100)
-
- # 获取每个数据点的聚类标签
- labels = np.array([som.winner(x) for x in X])
- unique_labels = {label: index for index, label in enumerate(np.unique(labels))}
- cluster_membership = np.array([unique_labels[label] for label in labels])
-
- # 可视化结果
- plt.scatter(X[:, 0], X[:, 1], c=cluster_membership, s=50, cmap='viridis')
- plt.xlabel('X axis')
- plt.ylabel('Y axis')
- plt.title('Self-Organizing Map Clustering')
- plt.show()

聚类算法的效果需要使用评估指标来衡量。常用的评估指标包括轮廓系数、调整兰德指数和聚类纯度。
Python 实现:
- from sklearn.metrics import silhouette_score
-
- # 生成示例数据
- np.random.seed(0)
- X = np.vstack([
- np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
- np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
- np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
- ])
-
- # 使用K均值算法聚类
- from sklearn.cluster import KMeans
- kmeans = KMeans(n_clusters=3, random_state=0)
- labels = kmeans.fit_predict(X)
-
- # 计算轮廓系数
- score = silhouette_score(X, labels)
- print(f'Silhouette Score: {score:.2f}')

我们进一步介绍了模糊C均值和自组织映射聚类算法,以及如何通过轮廓系数评估聚类效果。
不同的聚类算法适用于不同的数据特性和应用场景。通过评估指标,可以更好地选择合适的聚类算法,提高模型的准确性和实用性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。