当前位置: 首页 > article >正文

Python无监督学习中的聚类:K均值与层次聚类实现详解

📘 Python无监督学习中的聚类:K均值与层次聚类实现详解

无监督学习是一类强大的算法,能够在没有标签的数据集中发现结构与模式。聚类作为无监督学习的重要组成部分,在各类数据分析任务中广泛应用。本文将深入讲解聚类算法中的两种常见方法:K均值聚类和层次聚类,结合Python代码详细介绍它们的实现与应用,帮助理解不同聚类方法的优劣与使用场景。

目录

  1. 🔗 聚类的核心思想与应用场景
  2. 📊 K均值聚类:快速高效的聚类方法
  3. 🔝 层次聚类:基于层次结构的灵活聚类
  4. 🆚 K均值与层次聚类的比较
  5. 🚀 实践:如何选择合适的聚类方法
  6. 🌐 拓展:结合轮廓系数评估聚类效果

1. 🔗 聚类的核心思想与应用场景

聚类是一种将数据划分为多个组(或称为簇)的技术,每个簇内的数据点具有较高的相似性,而簇间的数据点则差异较大。聚类的核心目标是寻找数据的潜在模式和结构,而不依赖于标签信息。

应用场景:

  • 市场细分:根据顾客的购买行为,将其划分为不同的细分市场,便于进行精准营销。
  • 图像分割:将图像分割为多个区域,用于图像处理与分析。
  • 异常检测:通过聚类发现异常数据点,这些数据点通常位于簇的边界之外。

2. 📊 K均值聚类:快速高效的聚类方法

K均值聚类是最常用的聚类算法之一。它通过不断迭代来将数据集分成K个簇,并使得每个簇的中心与其成员数据点之间的距离最小化。K均值算法的主要步骤包括:

  1. 随机选择K个初始中心点(即质心)。
  2. 将每个数据点分配给距离最近的质心。
  3. 重新计算每个簇的质心。
  4. 重复步骤2和3,直到质心不再发生显著变化。

📌 实现K均值聚类

在Python中,使用KMeans类可以轻松实现K均值聚类。以下代码展示了如何应用K均值对二维数据进行聚类,并可视化结果。

# 导入相关库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

# 生成示例数据
X, y = make_blobs(n_samples=300, centers=4, random_state=42, cluster_std=0.60)

# 创建K均值聚类模型,设定K=4
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.75)
plt.title("K均值聚类结果")
plt.show()

🎯 K均值的特点:

  • 效率高:K均值算法的时间复杂度较低,能够在较大数据集上快速运行。
  • 易于实现:K均值算法简单直观,并且能够在多数任务中表现良好。
  • 局限性:K均值依赖于初始质心的选择,容易陷入局部最优解;此外,K的值需要预先设定,不适用于所有数据集。

代码中,使用make_blobs生成了一个包含4个簇的模拟数据集,并通过KMeans类对数据进行聚类。最终,我们使用Matplotlib可视化了聚类结果,其中红色点表示每个簇的质心。

3. 🔝 层次聚类:基于层次结构的灵活聚类

层次聚类是一种通过创建簇的嵌套层次来进行聚类的算法,分为自底向上(凝聚型)自顶向下(分裂型)两种方法。自底向上的层次聚类开始时将每个数据点视为一个单独的簇,逐渐合并相似簇,直到达到指定的簇数或某一停止条件。它能够生成一棵聚类树,称为树状图

📌 实现层次聚类

在Python中,可以使用AgglomerativeClustering类实现凝聚型层次聚类,并利用dendrogram函数可视化树状图。

# 导入相关库
import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import make_blobs

# 生成示例数据
X, y = make_blobs(n_samples=300, centers=4, random_state=42, cluster_std=0.60)

# 使用凝聚层次聚类
agg_clustering = AgglomerativeClustering(n_clusters=4)
y_agg = agg_clustering.fit_predict(X)

# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_agg, cmap='viridis')
plt.title("层次聚类结果")
plt.show()

# 计算层次聚类的树状图数据
linked = linkage(X, 'ward')

# 绘制树状图
plt.figure(figsize=(10, 7))
dendrogram(linked, orientation='top', distance_sort='descending', show_leaf_counts=True)
plt.title("层次聚类树状图")
plt.show()

🎯 层次聚类的特点:

  • 无需预设簇数:层次聚类不需要预先设定K值,能够自动生成簇的层次结构。
  • 结果直观:树状图能够清晰展示数据的聚类层次,便于理解和分析。
  • 计算代价高:层次聚类的时间复杂度较高,在大数据集上表现不如K均值高效。

通过AgglomerativeClustering实现了层次聚类,代码中的dendrogram函数生成了对应的树状图,从图中可以清楚地看到聚类的层次结构。在实际应用中,层次聚类非常适合于数据点较少的场景,或需要对聚类结果进行深入分析的任务。

4. 🆚 K均值与层次聚类的比较

K均值和层次聚类在应用场景和算法特点上各具优势,以下是两者的比较:

特点K均值聚类层次聚类
计算复杂度低,适合大数据集高,适合小数据集
需要预设簇数是,需要预设K值否,可生成层次结构
簇的形状适用于球状簇能处理复杂的簇形
对噪声和异常点的敏感性对异常点敏感相对不敏感
结果可解释性结果较简单树状图提供丰富的解释性

在选择聚类方法时,需要考虑数据集的大小、簇的形状、计算资源以及对聚类结果的要求等因素。K均值在大规模数据上的表现优异,而层次聚类则提供了更多分析层次和解释性。

5. 🚀 实践:如何选择合适的聚类方法

选择聚类方法时,应从以下几个维度进行考量:

  1. 数据规模:K均值算法适合大规模数据集,层次聚类更适合小规模数据集。
  2. 簇的形状:如果簇的形状复杂且非球形,层次聚类往往能给出更合理的划分结果。
  3. 簇数的确定:如果聚类数未知或希望获取层次结构信息,层次聚类是更好的选择;而K均值需要预设K值。
  4. 计算资源:K均值算法在大数据集上的速度优势明显,适合资源有限的情况。

6. 🌐 拓展:结合轮廓系数评估聚类效果

为了客观评估聚类结果的质量,可以

使用轮廓系数。轮廓系数通过比较每个数据点与簇内其他点的距离与其与最近簇的距离,给出聚类效果的度量。

📌 实现轮廓系数评估

from sklearn.metrics import silhouette_score

# K均值聚类模型
kmeans = KMeans(n_clusters=4)
kmeans_labels = kmeans.fit_predict(X)

# 计算K均值的轮廓系数
kmeans_silhouette = silhouette_score(X, kmeans_labels)
print(f"K均值轮廓系数: {kmeans_silhouette}")

# 层次聚类模型
agg_clustering = AgglomerativeClustering(n_clusters=4)
agg_labels = agg_clustering.fit_predict(X)

# 计算层次聚类的轮廓系数
agg_silhouette = silhouette_score(X, agg_labels)
print(f"层次聚类轮廓系数: {agg_silhouette}")

通过计算轮廓系数,可以量化聚类的紧密程度与分离度,从而辅助选择最佳的聚类方法。


http://www.kler.cn/news/357055.html

相关文章:

  • 1.Node.js环境搭建(windows)
  • Python基础:20、Python基础综合案例
  • 如何使用python网络爬虫批量获取公共资源数据?
  • 六、存储过程和触发器及视图和临时表
  • 低代码模式即将下线;工作流上线消息节点、支持配置卡片样式
  • 计算机组成原理之磁盘存储器
  • 【分布式微服务云原生】《Redis 的高效之道:线程模型、IO 模型与 Reactor 模型全解析》
  • VB.NET 让窗体绘图持久化,类似VB6 ME.AutoRedraw=True
  • 2.5 windows xp,ReactOS系统快速系统调用的实现
  • 【Linux】冯诺依曼体系结构 OS的概念
  • 图论|图的构造、图的遍历方式、DFS98. 所有可达路径;海岛数量 岛屿最大面积 101. 孤岛的总面积
  • 引进Menu菜单与新增验证上传图片功能--系统篇
  • 编写一个通用的i2c控制器驱动框架
  • Xcode使用Instruments的dsym还原符号堆栈问题
  • 智慧农业案例 (三)- 蔬菜智能温室
  • 高级Sql 技巧
  • Qt优秀开源项目之二十四:EXCEL读写利器QXlsx
  • 电脑端百度网页两个好用的功能
  • 百亿数据量下的多表查询优化策略
  • Android上的AES加密