不同数据场景下的聚类算法

标签: | 发表时间:2025-05-26 13:57 | 作者:
出处:https://www.cnblogs.com

在数据分析和机器学习领域, 聚类是一种非常重要的无监督学习方法,它可以帮助我们发现数据中的内在结构,将相似的数据点分组到一起。

本文将介绍几种常见的 聚类算法,包括 原型聚类(如 k-均值、学习向量量化、高斯混合聚类)、 密度聚类(DBSCAN)和 层次聚类(AGNES)。

通过浅显易懂的方式介绍它们的原理,探讨它们的适用场景,并通过代码演示如何使用这些算法。

1. 原型聚类:以"中心点"代表群体

1.1. k-均值聚类

k-均值聚类K-Means Clustering)是一种非常直观的聚类方法。

它的目标是将数据划分为$ k $个簇,每个簇由一个 “中心点”(质心)代表。

算法的步骤如下:

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

k-均值聚类适用于数据分布较为均匀且簇形状较为规则的场景。

例如,对用户群体进行市场细分,或者对图像中的像素进行颜色聚类。

基于 scikit-learn的代码示例如下:

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

# 生成模拟数据
X, _ = make_blobs(n_samples=300, centers=4, random_state=42)

# 使用 KMeans 聚类
kmeans = KMeans(n_clusters=4, random_state=42)
kmeans.fit(X)
labels = kmeans.labels_
centroids = kmeans.cluster_centers_

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], s=300, c='red', marker='X')
plt.title("K-Means 聚类")
plt.show()

1.2. 学习向量量化

LVQLearning Vector Quantization) 是一种受神经网络启发的聚类方法。

它使用一组 “原型向量”来代表每个簇,算法通过迭代调整这些原型向量的位置,使其更接近属于该簇的数据点,远离其他簇的数据点。

LVQ核心思想是通过学习来优化原型向量的位置。

LVQ适用于数据点分布较为密集且簇边界较为清晰的场景,它在 图像识别模式分类中表现良好。

虽然 scikit-learn没有直接提供 LVQ的实现,但我们可以使用 sklvq库来实现。

安装方式: pip install sklvq

代码示例如下:

      from sklvq import GLVQ  # 使用 GLVQ(Generalized Learning Vector Quantization)
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

# 生成模拟数据
X, y = make_blobs(n_samples=300, centers=4, random_state=42)

# 使用 GLVQ 聚类
glvq = GLVQ(random_state=42)
glvq.fit(X, y)

# 获取聚类结果
labels = glvq.predict(X)

# 获取中心点(原型向量)
prototypes = glvq.prototypes_

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap="viridis")
plt.scatter(
    prototypes[:, 0], prototypes[:, 1], s=300, c="red", marker="X", label="Prototypes"
)
plt.title("广义学习向量量化 (GLVQ)")
plt.show()

1.3. 高斯混合聚类

高斯混合聚类Gaussian Mixture Clustering)假设数据是由多个高斯分布的混合生成的。

每个高斯分布代表一个 ,算法通过估计每个高斯分布的 参数均值协方差矩阵权重)来确定簇的形状和位置。

高斯混合聚类比** k-均值**更灵活,因为它可以捕捉到簇的形状和大小的变化。

高斯混合聚类适用于簇形状不规则或数据分布较为复杂的情况。

例如,对金融数据中的异常交易进行聚类分析。

代码示例如下:

      from sklearn.mixture import GaussianMixture
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

# 生成模拟数据
X, _ = make_blobs(n_samples=300, centers=4, random_state=42)

# 使用高斯混合聚类
gmm = GaussianMixture(n_components=4, random_state=42)
gmm.fit(X)
labels = gmm.predict(X)

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.title("高斯混合聚类")
plt.show()

2. 密度聚类:发现任意形状的簇

DBSCANDensity-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法。

它的 核心思想是:如果一个点的邻域内有足够的点(即密度足够高),那么这些点可以被划分为同一个簇。

DBSCAN 使用两个参数:

  • eps:邻域半径,用于定义 “足够近”的范围。
  • min_samples:核心点的邻域内必须包含的最小点数。

DBSCAN的优点是可以发现任意形状的簇,并且能够识别噪声点。

DBSCAN适用于数据分布不均匀、簇形状复杂且存在噪声的场景。

例如,对地理数据中的热点区域进行分析。

代码示例如下:

      from sklearn.cluster import DBSCAN
from sklearn.datasets import make_moons
import matplotlib.pyplot as plt

# 生成模拟数据
X, _ = make_moons(n_samples=300, noise=0.05, random_state=42)

# 使用 DBSCAN 聚类
dbscan = DBSCAN(eps=0.2, min_samples=5)
labels = dbscan.fit_predict(X)

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

3. 层次聚类:构建数据家族树

AGNESAgglomerative Nesting)是一种自底向上的层次聚类算法。

它从每个数据点作为一个单独的簇开始,然后逐步合并距离最近的簇,直到达到预设的簇数量或满足其他停止条件。

AGNES的关键在于如何定义簇之间的距离,常见的方法包括 单链接法全链接法平均链接法

AGNES适用于需要逐步分析数据层次结构的场景,例如生物分类学或文档聚类。

代码示例如下:

      from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

# 生成模拟数据
X, _ = make_blobs(n_samples=300, centers=4, random_state=42)

# 使用 AGNES 聚类
agnes = AgglomerativeClustering(n_clusters=4)
labels = agnes.fit_predict(X)

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

4. 聚类算法对比

常用的几种聚类算法的对比如下:

算法类型 优点 局限性 典型应用场景
K-Means 计算效率高 需预设K值 客户分群、图像压缩
GMM 处理椭圆分布 计算复杂度较高 异常检测、语音识别
DBSCAN 发现任意形状 参数敏感 地理数据、离群点检测
AGNES 可视化层次结构 计算复杂度O(n³) 生物分类、文档聚类

5. 总结

聚类算法的选择取决于数据的特性、问题的需求以及对结果的解释性要求。

k-均值简单高效,但对簇形状有较强假设; DBSCAN能够处理复杂形状和噪声; 层次聚类则提供了数据的层次结构。

在实际应用中,我们通常需要尝试多种算法,并根据具体问题选择最适合的聚类方法。

相关 [数据 聚类 算法] 推荐:

不同数据场景下的聚类算法

- -
聚类是一种非常重要的无监督学习方法,它可以帮助我们发现数据中的内在结构,将相似的数据点分组到一起. 原型聚类(如 k-均值、学习向量量化、高斯混合聚类)、. 密度聚类(DBSCAN)和. 通过浅显易懂的方式介绍它们的原理,探讨它们的适用场景,并通过代码演示如何使用这些算法. 原型聚类:以"中心点"代表群体.

聚类算法之DBSCAN

- - 标点符
K-Means算法和 Mean Shift算法都是基于距离的聚类算法,基于距离的聚类算法的聚类结果是球状的簇,当数据集中的聚类结果是非球状结构时,基于距离的聚类算法的聚类效果并不好. 与基于距离的聚类算法不同的是,基于密度的聚类算法可以发现任意形状的聚类. 在基于密度的聚类算法中,通过在数据集中寻找被低密度区域分离的高密度区域,将分离出的高密度区域作为一个独立的类别.

k-medoids聚类算法实现

- - 简单之美
k-medoids聚类算法,即k-中心聚类算法,它是基于k-means聚类算法的改进. 我们知道,k-means算法执行过程,首先需要随机选择初始质心,只有第一次随机选择的初始质心才是实际待聚类点集中的点,而后续将非质心点指派到对应的质心点后,重新计算得到的质心并非是待聚类点集中的点,而且如果某些非质心点是离群点的话,导致重新计算得到的质心可能偏离整个簇,为了解决这个问题,提出了改进的k-medoids聚类算法.

Weka聚类算法的两个实现算法

- - 行业应用 - ITeye博客
在这里将使用Weka自带的K-means以及EM算法对同一份数据进行聚类. 目前使用的是自带的数据集. 我也不太清楚这样聚类的效果如何 sigh.... K-Means K-均值算法. // 目前没有使用到,但是在3.7.10的版本之中可以指定距离算法. // 初始化聚类器 (加载算法). 在上面的算法之中,使用的是SimpleKMeans这个类.

TensorFlow实战之K-Means聚类算法实践

- - SegmentFault 最新的文章
Google 最近开源了它的第二代人工智能与数值计算库TensorFlow. TensorFlow由Google大脑团队开发,并且能够灵活地运行在多个平台上——包括GPU平台与移动设备中. TensorFlow的核心就是使用所谓的数据流,可以参考Wikipedia上的有关于 Genetic Programming 的相关知识,譬如:.

微软亚研院的AIOps底层算法: KPI快速聚类

- - 运维派
智能运维中存在海量时序数据(KPI)需要监控、检测异常、关联, 而AIOps的一个底层算法就是把大规模时序数据快速准确地聚类成有限的若干类别,从而大大降低后续数据分析与挖掘工作的开销.  其应用场景包括自动适配异常检测算法、辅助标注、辅助构建故障传播链等.  本文介绍的案例是由微软亚洲研究院发表在数据库领域顶级会议VLDB 2015的文章《 Yading: Fast Clustering of Large-Scale Time Series Data》.

用户地理位置的聚类算法实现—基于DBSCAN和Kmeans的混合算法

- - CSDN博客综合推荐文章
聚类的目标是使同一类对象的相似度尽可能地大;不同类对象之间的相似度尽可能地小. 目前聚类的方法很多,根据基本思想的不同,大致可以将聚类算法分为五大类:层次聚类算法、分割聚类算法、基于约束的聚类算法、机器学习中的聚类算法和用于高维度的聚类算法. 以下实现主要选取了基于划分的Kmeans算法和基于密度的DBSCAN算法来处理.

数据挖掘 - 分类算法比较

- - IBM developerWorks 中国 : 文档库
随着计算能力、存储、网络的高速发展,人类积累的数据量正以指数速度增长. 对于这些数据,人们迫切希望从中提取出隐藏其中的有用信息,更需要发现更深层次的规律,对决策,商务应用提供更有效的支持. 为了满足这种需求,数据挖掘技术的得到了长足的发展,而分类在数据挖掘中是一项非常重要的任务,目前在商业上应用最多.

NoSQL数据库的分布式算法

- - NoSQLFan
本文英文原文发表于知名技术博客《 Highly Scalable Blog》,对NoSQL数据库中的 分布式算法和思想进行了详细的讲解. 文章很长,由@ 可观 进行翻译投稿. 英文原文:《 Distributed Algorithms in NoSQL Databases》. 译文地址:《 NoSQL数据库的分布式算法》.

大数据量的算法面试题

- - 编程 - 编程语言 - ITeye博客
作者:July、youwang、yanxionglu. 时间:二零一一年三月二十六日. 说明:本文分为俩部分,第一部分为10道海量数据处理的面试题,第二部分为10个海量数据处理的方法总结. 出处:http://blog.csdn.net/v_JULY_v. 第一部分、十道海量数据处理面试题. 1、海量日志数据,提取出某日访问百度次数最多的那个IP.