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

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.mrgr.cn/news/53586.html

相关文章:

  • 【厦门大学附属第一医院(互联网医院)-注册安全分析报告-无验证方式导致安全隐患】
  • 大模型量化感知训练 LLM-QAT
  • 深度学习框架-Keras的常用内置数据集总结
  • 妇女、商业与法律(WBL)(1971-2023年)
  • 理解ADC:信噪比SNR的天花板是什么?附带介绍一下ENOB
  • C++——定义一个复数类Complex,重载运算符“+”,使之能用于复数的加法。参加运算的两个操作数可以都是类对象,也可以一个是整数,其顺序任意。
  • 反欺诈与数字信任:保障数字经济安全的关键
  • 衡石分析平台系统分析人员手册-应用空间
  • 【微知】RDMA IB verbs中的ABI是什么?作用是什么?(application binary interface、规范、兼容)
  • PCDN 技术如何优化网络延迟(壹)
  • 机械视觉光源选型
  • 解决mac ssh端终端只有黑白颜色的问题
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-17
  • C++——有两个矩阵a和b,均为2行3列。求两个矩阵之和。重载运算符“+”,使之能用于矩阵相加。(如c=a+b)
  • 动销方案在合作伙伴场地执行,好处多多!
  • S7-1500 通过PN/PN Coupler 通信
  • Python | Leetcode Python题解之第493题翻转对
  • UniHttp 框架,请求http接口
  • 文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于AGCN-LSTM模型的海上风电场功率概率预测 》
  • 15分钟学Go 第8天:控制结构 - 循环