当前位置:   article > 正文

Python实战开发及案例分析(8)—— 聚类算法_python实战多个变量进行聚类分析

python实战多个变量进行聚类分析

        聚类是一种将数据分组的无监督学习方法,其目标是使同组内的数据相似度高,不同组间的数据相似度低。常用的聚类算法包括K均值聚类、层次聚类和DBSCAN等。下面是这些算法的Python实现和案例分析。

案例分析:使用K均值聚类对数据集进行分组

项目背景:我们有一组二维数据点,目标是将这些点分成三组(即三类)。

K均值聚类算法

        K均值聚类是一种迭代算法,目标是通过最小化类内距离平方和来找到簇的最优分组。

Python 实现:

  1. from sklearn.cluster import KMeans
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. # 生成示例数据
  5. np.random.seed(0)
  6. X = np.vstack([
  7. np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
  8. np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
  9. np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
  10. ])
  11. # 使用K均值算法聚类
  12. kmeans = KMeans(n_clusters=3, random_state=0)
  13. kmeans.fit(X)
  14. y_kmeans = kmeans.predict(X)
  15. # 可视化结果
  16. plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
  17. centers = kmeans.cluster_centers_
  18. plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='X')
  19. plt.xlabel('X axis')
  20. plt.ylabel('Y axis')
  21. plt.title('K-Means Clustering')
  22. plt.show()

案例分析:使用层次聚类对数据集进行分组

项目背景:层次聚类的目标是通过递归合并或拆分簇来形成一组聚类。它可以通过聚合或分裂的方式进行。

层次聚类算法

Python 实现:

  1. from scipy.cluster.hierarchy import dendrogram, linkage, fcluster
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. # 生成示例数据
  5. np.random.seed(0)
  6. X = np.vstack([
  7. np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
  8. np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
  9. np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
  10. ])
  11. # 进行层次聚类
  12. Z = linkage(X, 'ward')
  13. dendrogram(Z)
  14. plt.xlabel('Samples')
  15. plt.ylabel('Distance')
  16. plt.title('Dendrogram for Hierarchical Clustering')
  17. plt.show()
  18. # 根据距离阈值分配簇标签
  19. max_d = 5
  20. clusters = fcluster(Z, max_d, criterion='distance')
  21. # 可视化结果
  22. plt.scatter(X[:, 0], X[:, 1], c=clusters, s=50, cmap='viridis')
  23. plt.xlabel('X axis')
  24. plt.ylabel('Y axis')
  25. plt.title('Hierarchical Clustering')
  26. plt.show()

案例分析:使用DBSCAN聚类算法

项目背景:DBSCAN是一种基于密度的聚类算法,它可以发现任意形状的簇,并识别出噪声点。

DBSCAN算法

Python 实现:

  1. from sklearn.cluster import DBSCAN
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. # 生成示例数据
  5. np.random.seed(0)
  6. X = np.vstack([
  7. np.random.normal(loc=[2, 2], scale=0.3, size=(50, 2)),
  8. np.random.normal(loc=[8, 3], scale=0.3, size=(50, 2)),
  9. np.random.normal(loc=[5, 8], scale=0.3, size=(50, 2)),
  10. np.random.normal(loc=[8, 8], scale=0.3, size=(50, 2))
  11. ])
  12. # 使用DBSCAN算法聚类
  13. dbscan = DBSCAN(eps=0.5, min_samples=5)
  14. y_dbscan = dbscan.fit_predict(X)
  15. # 可视化结果
  16. plt.scatter(X[:, 0], X[:, 1], c=y_dbscan, s=50, cmap='viridis')
  17. plt.xlabel('X axis')
  18. plt.ylabel('Y axis')
  19. plt.title('DBSCAN Clustering')
  20. plt.show()

结论

不同的聚类算法在面对不同形状、大小和密度的数据集时各有优缺点:

  • K均值聚类:适用于数据分布较均匀、簇数已知的情况,但对异常值敏感。
  • 层次聚类:可用于层次结构分析,适合较小规模的数据集。
  • DBSCAN:适用于发现任意形状的簇,同时识别噪声,但对参数设置敏感。

在实际应用中,选择合适的聚类算法需要结合数据的特性、任务的需求和算法的复杂度等因素。

案例分析:使用均值漂移(Mean Shift)聚类算法

项目背景:均值漂移是一种基于密度的聚类算法,通过平滑分布并逐步漂移均值来找到簇的峰值。它不需要预先指定簇的数量。

Mean Shift算法

Python 实现:

  1. from sklearn.cluster import MeanShift, estimate_bandwidth
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. # 生成示例数据
  5. np.random.seed(0)
  6. X = np.vstack([
  7. np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
  8. np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
  9. np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
  10. ])
  11. # 使用均值漂移算法聚类
  12. bandwidth = estimate_bandwidth(X, quantile=0.2, n_samples=100)
  13. meanshift = MeanShift(bandwidth=bandwidth, bin_seeding=True)
  14. meanshift.fit(X)
  15. labels = meanshift.labels_
  16. cluster_centers = meanshift.cluster_centers_
  17. # 可视化结果
  18. plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
  19. plt.scatter(cluster_centers[:, 0], cluster_centers[:, 1], c='red', s=200, alpha=0.75, marker='X')
  20. plt.xlabel('X axis')
  21. plt.ylabel('Y axis')
  22. plt.title('Mean Shift Clustering')
  23. plt.show()

案例分析:使用高斯混合模型(GMM)聚类算法

项目背景:GMM是一种基于概率模型的聚类方法,假定数据来自于多个不同的正态分布,并通过EM算法估计参数。

Gaussian Mixture Model算法

Python 实现:

  1. from sklearn.mixture import GaussianMixture
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. # 生成示例数据
  5. np.random.seed(0)
  6. X = np.vstack([
  7. np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
  8. np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
  9. np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
  10. ])
  11. # 使用GMM聚类
  12. gmm = GaussianMixture(n_components=3, random_state=0)
  13. gmm.fit(X)
  14. labels = gmm.predict(X)
  15. # 可视化结果
  16. plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
  17. plt.xlabel('X axis')
  18. plt.ylabel('Y axis')
  19. plt.title('Gaussian Mixture Model Clustering')
  20. plt.show()

案例分析:使用谱聚类(Spectral Clustering)算法

项目背景:谱聚类是一种利用图论的聚类算法,通过对数据点之间的相似性矩阵进行谱分解来确定聚类。

Spectral Clustering算法

Python 实现:

  1. from sklearn.cluster import SpectralClustering
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. # 生成示例数据
  5. np.random.seed(0)
  6. X = np.vstack([
  7. np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
  8. np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
  9. np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
  10. ])
  11. # 使用谱聚类算法聚类
  12. spectral = SpectralClustering(n_clusters=3, affinity='nearest_neighbors', random_state=0)
  13. labels = spectral.fit_predict(X)
  14. # 可视化结果
  15. plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
  16. plt.xlabel('X axis')
  17. plt.ylabel('Y axis')
  18. plt.title('Spectral Clustering')
  19. plt.show()

结论

        我们在这几个案例中展示了不同聚类算法的使用和效果,包括:

  1. Mean Shift:适用于任意形状的聚类,且无需指定簇数量,但对参数选择敏感。
  2. Gaussian Mixture Model (GMM):基于概率模型,可对聚类进行概率解释。
  3. Spectral Clustering:通过相似性矩阵来定义数据点之间的关系,适用于发现复杂形状的聚类。

        不同的聚类算法在不同的场景下都有各自的优缺点。结合数据的特点和实际需求选择合适的算法,可以提高聚类的准确性和实用性。

        继续深入探讨更多的聚类算法,我们可以学习模糊C均值(FCM)和自组织映射(SOM)等技术,以及探讨如何评估聚类结果的质量。

案例分析:使用模糊C均值(Fuzzy C-Means)聚类算法

项目背景:模糊C均值聚类是一种允许数据点同时属于多个簇的聚类方法。每个数据点都分配了一个隶属度,表示其属于某一簇的概率。

FCM算法

Python 实现:

安装scikit-fuzzy库:

pip install scikit-fuzzy

代码实现:

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import skfuzzy as fuzz
  4. # 生成示例数据
  5. np.random.seed(0)
  6. X = np.vstack([
  7. np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
  8. np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
  9. np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
  10. ])
  11. # 转置输入数据
  12. X_T = X.T
  13. # 使用模糊C均值算法聚类
  14. cntr, u, u0, d, jm, p, fpc = fuzz.cluster.cmeans(
  15. X_T, 3, 2, error=0.005, maxiter=1000, init=None)
  16. # 获取每个数据点的聚类标签
  17. cluster_membership = np.argmax(u, axis=0)
  18. # 可视化结果
  19. plt.scatter(X[:, 0], X[:, 1], c=cluster_membership, s=50, cmap='viridis')
  20. plt.xlabel('X axis')
  21. plt.ylabel('Y axis')
  22. plt.title('Fuzzy C-Means Clustering')
  23. plt.show()

案例分析:使用自组织映射(SOM)聚类算法

项目背景:自组织映射(SOM)是一种无监督学习的神经网络方法,通过映射高维数据到低维网格的方式实现聚类和数据可视化。

SOM算法

Python 实现:

安装minisom库:

pip install minisom

代码实现:

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from minisom import MiniSom
  4. # 生成示例数据
  5. np.random.seed(0)
  6. X = np.vstack([
  7. np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
  8. np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
  9. np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
  10. ])
  11. # 使用SOM进行聚类
  12. som = MiniSom(x=7, y=7, input_len=2, sigma=0.5, learning_rate=0.5)
  13. som.random_weights_init(X)
  14. som.train_random(X, 100)
  15. # 获取每个数据点的聚类标签
  16. labels = np.array([som.winner(x) for x in X])
  17. unique_labels = {label: index for index, label in enumerate(np.unique(labels))}
  18. cluster_membership = np.array([unique_labels[label] for label in labels])
  19. # 可视化结果
  20. plt.scatter(X[:, 0], X[:, 1], c=cluster_membership, s=50, cmap='viridis')
  21. plt.xlabel('X axis')
  22. plt.ylabel('Y axis')
  23. plt.title('Self-Organizing Map Clustering')
  24. plt.show()

聚类评估指标

        聚类算法的效果需要使用评估指标来衡量。常用的评估指标包括轮廓系数、调整兰德指数和聚类纯度。

使用轮廓系数评估聚类

Python 实现:

  1. from sklearn.metrics import silhouette_score
  2. # 生成示例数据
  3. np.random.seed(0)
  4. X = np.vstack([
  5. np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
  6. np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
  7. np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
  8. ])
  9. # 使用K均值算法聚类
  10. from sklearn.cluster import KMeans
  11. kmeans = KMeans(n_clusters=3, random_state=0)
  12. labels = kmeans.fit_predict(X)
  13. # 计算轮廓系数
  14. score = silhouette_score(X, labels)
  15. print(f'Silhouette Score: {score:.2f}')

结论

        我们进一步介绍了模糊C均值和自组织映射聚类算法,以及如何通过轮廓系数评估聚类效果。

  • Fuzzy C-Means:提供了一种更加灵活的聚类方法,允许数据点同时属于多个簇。
  • Self-Organizing Map (SOM):利用神经网络的方式映射高维数据,实现聚类和可视化。
  • 聚类评估:轮廓系数提供了一种评估聚类紧密度和分离度的方法。

        不同的聚类算法适用于不同的数据特性和应用场景。通过评估指标,可以更好地选择合适的聚类算法,提高模型的准确性和实用性。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/774583
推荐阅读
相关标签
  

闽ICP备14008679号