社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

超强总结!十大聚类算法!附Python实现

学姐带你玩AI • 3 月前 • 216 次点击  

来源:投稿  作者:sunny
编辑:学姐

在数据科学领域,聚类分析是一种无监督学习方法,旨在将数据集划分为多个组或簇,使得同一簇内的数据点彼此相似,而不同簇间的数据点差异较大。

本文将详细介绍十大常用的聚类算法,阐述其基本原理,并提供相应的Python代码示例,帮助读者深入理解并实践这些算法。

1. K-means聚类

原理:K-means算法是最常见的聚类算法之一,其目标是将数据点分组到K个簇中,使得簇内的点尽可能相似,而簇间的点尽可能不同。算法通过迭代优化簇中心的位置,以最小化簇内的平方误差总和。

步骤

  1. 随机选择K个数据点作为初始簇中心。
  2. 将每个数据点分配给最近的簇中心。
  3. 重新计算每个簇的中心(即簇内所有点的均值)。
  4. 重复步骤2和3,直到簇中心不再发生变化或达到预设的迭代次数。

Python代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

# 生成模拟数据
np.random.seed(0)
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 应用K-means算法
kmeans = KMeans(n_clusters=4)
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.5)
plt.title("K-means Clustering")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()

2. 层次聚类

原理:层次聚类通过构建数据点之间的层次结构来进行聚类,可以是自底向上的凝聚方法或自顶向下的分裂方法。凝聚型层次聚类从每个点作为单独的簇开始,逐渐合并最近的簇;分裂型则相反。

步骤(以凝聚型为例):

  1. 将每个数据点视为一个单独的簇。
  2. 找到最相似的两个簇并将它们合并。
  3. 重复步骤2,直到所有数据点都合并到一个簇中或达到预定的簇数量。

Python代码

from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt

# 生成层次聚类的链接矩阵
Z = linkage(X, method='ward')

# 绘制树状图
plt.figure(figsize=(105))
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Sample index')
plt.ylabel('Distance')
dendrogram(Z)
plt.show()

3. DBSCAN(基于密度的空间聚类)

原理:DBSCAN是一种基于密度的聚类算法,能够识别任意形状的簇,同时对噪声和离群点具有较好的鲁棒性。它不需要事先指定簇的数量,能有效处理异常点。

步骤

  1. 标记所有点为核心点、边界点或噪声点。
  2. 删除噪声点。
  3. 为剩余的核心点创建簇,如果一个核心点在另一个核心点的邻域内,则将它们放在同一个簇中。
  4. 将每个边界点分配给与之关联的核心点的簇。

Python代码

from sklearn.cluster import DBSCAN

# 应用DBSCAN算法
dbscan = DBSCAN(eps=0.5, min_samples=5)
clusters = dbscan.fit_predict(X)

# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=clusters, cmap='viridis', marker='o', s=50)
plt.title("DBSCAN Clustering")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()

4. 谱聚类

原理:谱聚类使用数据的相似性矩阵来进行聚类,特别适用于复杂形状的数据集。它首先将数据映射到一个图表示,然后基于图的拉普拉斯矩阵的特征向量进行聚类。

(由于谱聚类的实现相对复杂,且通常依赖于特定的库函数,此处不提供详细代码,但可查阅scikit-learn等库的文档了解实现方法。)

5. 高斯混合模型(GMM)

原理:高斯混合模型是一种基于概率模型的聚类方法,适用于估计子群体的分布。它假设所有数据点都是从有限数量的高斯分布中生成的,每个高斯分布代表一个簇。

(GMM的实现同样依赖于库函数,如scikit-learn的GaussianMixture,此处不展示代码。)

6. 模糊C-means(FCM)

原理:模糊C-means与K-means相似,但允许一个数据点属于多个簇,每个簇都有一定的隶属度或概率。它通过优化目标函数(通常是隶属度矩阵和簇中心的函数)来找到最佳簇划分。

(FCM的实现同样需要特定的库支持,如sklearn-fuzzy或pyfuzzy等,此处不展示代码。)

7. K-medoids

原理:K-medoids与K-means类似,但使用数据点(medoids)而不是均值作为簇的中心。这使得K-medoids对噪声和异常值更加鲁棒。

(K-medoids的实现通常依赖于特定的库函数,如sklearn-extra等,此处不展示代码。)

8. Mean Shift

原理:Mean Shift是一种基于密度的非参数聚类算法,通过迭代地更新候选簇中心点来寻找数据点密度最高的区域。它不需要事先指定簇的数量。

(Mean Shift的实现同样依赖于库函数,如scikit-learn的MeanShiftClustering,此处不展示代码。)

9. OPTICS(基于密度的聚类排序)

原理:OPTICS是DBSCAN的一种扩展,能够处理不同密度的数据集。它通过构建一个可达性图来展示数据点的密度连接性,从而允许用户根据数据集的密度结构选择适当的簇划分。

(OPTICS的实现相对复杂,且通常依赖于特定的库函数,如sklearn-extra或pyclustering等,此处不展示代码。)

10. BIRCH(平衡迭代规约和聚类使用层次结构)

原理:BIRCH是一种专为大型数据集设计的层次聚类方法。它使用特征树(CF Tree)来存储和概括数据,从而有效地减少内存使用和计算时间。

(BIRCH的实现依赖于特定的库函数,如sklearn-extra或pyclustering等,此处不展示代码。)

-- END --

关注“学姐带你玩AI”公众号,回复“深度聚类

领取深度聚类论文合集&可复现代码

往期精彩阅读

👉kaggle比赛baseline合集

👉经典论文推荐合集

👉人工智能必读书籍

👉本专科硕博学习经验

评论区留言参与讨论嗷

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/178292
 
216 次点击