1、概要
本篇学习AI人工智能机器学习之聚类分析,以KMeans、AgglomerativeClustering、DBSCAN为例,从代码层面讲述机器学习中的聚类分析。
2、聚类分析 - 简介
聚类分析是一种无监督学习的方法,用于将数据集中的样本划分为不同的组(簇),使得同一组中的样本相似度较高,而不同组之间的样本相似度较低。
sklearn.cluster提供了多种聚类算法
- K均值聚类(K-Means Clustering),最常用的聚类算法之一,通过迭代找到 K 个簇的中心,并将样本分配给离其最近的中心,从而形成 K 个簇。
- 层次聚类(Agglomerative Clustering),通过构建一个树形结构(树状图)来表示数据的聚类过程,生成不同层次的聚类结果。
- DBSCAN(基于密度的聚类),通过测量数据点的密度来识别簇,能够发现任意形状的簇,并且可以有效处理噪声。
本篇,以三个示例讲述聚类分析使用方法:
- 示例1:对数据集进行K均值聚类分析
- 示例2:对数据集进行层次聚类分析
- 示例3:对数据集进行基于密度的聚类分析
本篇相关资料代码参见:AI人工智能机器学习相关知识资源及使用的示例代码
3、聚类分析
3.1、安装依赖
python安装机器学习库: pip install scikit-learn
3.2、示例1: 对数据集进行K均值聚类分析
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score# 生成样本数据
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)# 创建 KMeans 模型
kmeans = KMeans(n_clusters=4, init='k-means++', max_iter=300, n_init='auto')
kmeans.fit(X)# 获取聚类结果
y_kmeans = kmeans.predict(X)# 评估聚类效果 - 轮廓系数(Silhouette Score):衡量样本与其聚类的相似性。值范围在 [-1, 1] 之间,值越大表示聚类效果越好。
score = silhouette_score(X, y_kmeans)
print(f"Silhouette Score: {score:.3f}")# 可视化结果
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='o')
plt.title("K-Means Clustering")
plt.show()
运行上述代码的输出:
Silhouette Score: 0.682
参数释义:
- n_clusters:指定要形成的簇的数量。
- init:初始化簇中心的方法,常用的有 ‘k-means++’(默认)和 ‘random’。
- max_iter:最大迭代次数。
- n_init:运行算法的次数,选择最佳结果。
3.3、示例2:对数据集进行层次聚类分析
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import AgglomerativeClustering
from sklearn.metrics import silhouette_score# 生成样本数据
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)# 创建层次聚类模型
agg_clustering = AgglomerativeClustering(n_clusters=4, metric='euclidean', linkage='ward',)
y_agg = agg_clustering.fit_predict(X)# 评估聚类效果 - 轮廓系数(Silhouette Score):衡量样本与其聚类的相似性。值范围在 [-1, 1] 之间,值越大表示聚类效果越好。
score = silhouette_score(X, y_kmeans)
print(f"Silhouette Score: {score:.3f}")# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=y_agg, s=50, cmap='viridis')
plt.title("Agglomerative Clustering")
plt.show()
运行上述代码的输出:
Silhouette Score: 0.682
参数释义:
- n_clusters:指定要形成的簇的数量。
- metric:计算样本之间距离的方式,常用的有 ‘euclidean’(欧氏距离)和 ‘manhattan’(曼哈顿距离)。
- linkage:聚类的连接方式,常用的有 ‘ward’(默认)、‘complete’、‘average’ 和 ‘single’。
3.4、示例3:对数据集进行基于密度的聚类分析
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import DBSCAN
from sklearn.metrics import silhouette_score# 生成样本数据
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)# 创建 DBSCAN 模型
dbscan = DBSCAN(eps=0.5, min_samples=5)
y_dbscan = dbscan.fit_predict(X)# 评估聚类效果 - 轮廓系数(Silhouette Score):衡量样本与其聚类的相似性。值范围在 [-1, 1] 之间,值越大表示聚类效果越好。
score = silhouette_score(X, y_kmeans)
print(f"Silhouette Score: {score:.3f}")# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=y_dbscan, s=50, cmap='viridis')
plt.title("DBSCAN Clustering")
plt.show()
运行上述代码的输出:
Silhouette Score: 0.682
参数释义:
- eps:指定形成簇的最大距离(邻域的半径)。
- min_samples:形成一个簇所需的最小样本数。
4、 总结
本篇以KMeans、AgglomerativeClustering、DBSCAN为例,从代码层面讲述机器学习中的聚类分析,同时使用轮廓系数评估了聚类效果。每种算法都有其独特的优缺点,适用于不同类型的数据集。在实际应用中,选择合适的聚类算法和优化参数是获得良好聚类效果的关键。通过可视化和评估指标,可以更好地理解聚类结果的质量。