来源:投稿 作者:sunny
编辑:学姐
在数据科学领域,聚类分析是一种无监督学习方法,旨在将数据集划分为多个组或簇,使得同一簇内的数据点彼此相似,而不同簇间的数据点差异较大。
本文将详细介绍十大常用的聚类算法,阐述其基本原理,并提供相应的Python代码示例,帮助读者深入理解并实践这些算法。
1. K-means聚类
原理
:K-means算法是最常见的聚类算法之一,其目标是将数据点分组到K个簇中,使得簇内的点尽可能相似,而簇间的点尽可能不同。算法通过迭代优化簇中心的位置,以最小化簇内的平方误差总和。
步骤
:
-
-
-
-
重复步骤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. 层次聚类
原理
:层次聚类通过构建数据点之间的层次结构来进行聚类,可以是自底向上的凝聚方法或自顶向下的分裂方法。凝聚型层次聚类从每个点作为单独的簇开始,逐渐合并最近的簇;分裂型则相反。
步骤
(以凝聚型为例):
-
-
-
重复步骤2,直到所有数据点都合并到一个簇中或达到预定的簇数量。
Python代码
:
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
# 生成层次聚类的链接矩阵
Z = linkage(X, method='ward')
# 绘制树状图
plt.figure(figsize=(10, 5))
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Sample index')
plt.ylabel('Distance')
dendrogram(Z)
plt.show()
3. DBSCAN(基于密度的空间聚类)
原理
:DBSCAN是一种基于密度的聚类算法,能够识别任意形状的簇,同时对噪声和离群点具有较好的鲁棒性。它不需要事先指定簇的数量,能有效处理异常点。
步骤
:
-
-
-
为剩余的核心点创建簇,如果一个核心点在另一个核心点的邻域内,则将它们放在同一个簇中。
-
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等,此处不展示代码。)