几种常见的聚类方法

       作为无监督学习的一个重要方法,聚类的思想就是把属性相似的样本归到一类。对于每一个数据点,我们可以把它归到一个特定的类,同时每个类之间的所有数据点在某种程度上有着共性,比如空间位置接近等特性。多用于数据挖掘、数据分析等一些领域。

       下面简单介绍一下几种比较常见的聚类算法。

K-means聚类

       K-means聚类方法大家应该都听说过,在各种机器学习书籍教程中也是无监督学习部分非常经典的例子。其核心主要为两个部分:其一是K,K在这里代表类的数目,我们要把数据聚为多少类。其二是means,表示在每一次计算聚类中心的时候采取的是计算平均值。

我们假设样本总数为n,K-means聚类法可以简单表示为一下几个步骤:

  1. 在样本中随机选取K个点,作为每一类的中心点。

  2. 计算剩下 n-K 个样本点到每个聚类中心的距离(距离有很多种,假设这里采用欧式距离)。对于每一个样本点,将它归到和他距离最近的聚类中心所属的类。

  3. 重新计算每个聚类中心的位置:步骤 2 中得到的结果是 n 个点都有自己所属的类,将每一个类内的所有点取平均值(这里假设是二维空间,即对 x 和 y 坐标分别取平均),计算出新的聚类中心。

  4. 重复步骤 2 和 3 的操作,直到所有的聚类中心不再改变。

       分析一下,算法本身的思想并不难。但是K值如何选择就见仁见智了,这里可以引入类内距离 J,每一类都会对应一个 J 值,其计算就是把类内所有点之间的距离累加起来。我们肯定希望 J 越小越好,因为小的类内间距代表这一类样本的相似程度更高(离得更近)。

       如果 K 很小,则聚类可能不彻底,即隔着很远的两波点也被聚为一类,会使 J 变得很大;相反的,过大的 K 虽然会降低类内间距 J ,但有时候分得过细会对数据的泛化性造成损害,没有必要弄这么多类。因此 K 的选择应该是具体问题具体分析。

       还有一个问题就是初始聚类中心的选择。不当的初始化会给算法的收敛带来更多的计算开销。试想一下,如果一开始把离得很近的 K 个点都设为聚类中心,那么算法的迭代次数会更多一些。

HAC层次凝聚聚类法

       HAC也是一种比较经典的聚类方法,其主要思想是先把每一个样本点归为一类,再通过计算类间的距离,来对最相似或者距离最近的类进行归并,合成位一个新的类。反复循环,直到满足特定的迭代条件即可。

HAC的核心思想主要分为如下几个步骤:

  1. 将每个样本点都视作一类,一共有n个类。

  2. 计算所有类之间两两的类间距离(类间距离计算方式多种多样,可以取最近、最远、找重心等等,这里不做详述),然后把距离最近的两个类进行合并,组成一个新的更大的类。

  3. 重复步骤 2 中的操作,直到达到特定的迭代条件(例如当前类的数目是初始时的 10% ,即 90% 的类都得到了合并;最小的类间距离大于预先设定的阈值等等),算法结束。

       和K-means算法中的 K 值选取一样,HAC中如何选择迭代的终止条件也是一个比较复杂的问题,需要根据一定的经验,并且具体问题具体分析。

最大最小距离聚类算法

       这种方法的核心思想是先计算出聚类中心,再把所有的样本点按照就近原则,归到离自身最近的聚类中心所对应的类。最大最小是指在所有的最小距离中选取最大的。其主要的算法步骤如下:

  1. 随机选择一个点,作为第一个类的聚类中心 Z1。

  2. 选择与步骤 1 中距离最远的样本点,作为第二个类的聚类中心 Z2。

  3. 逐个计算每个点到所有聚类中心的距离,并把所有的最短的距离记录下来。

  4. 在这些最短距离中挑选最大的值,如果这个最大值大于 λ ∣ ∣ Z 1 − Z 2 ∣ ∣ \lambda ||Z1-Z2|| λZ1Z2,其中 0 ≤ λ ≤ 1 0\leq \lambda \leq 1 0λ1,那么将这个最大距离所对应的另一个样本点作为新的聚类中心;否则整个算法结束。

  5. 重复步骤 3 和 4 的操作,直到 4 中不再出现新的聚类中心。

  6. 将所有的样本归到与他自身最近的聚类中心。

参考:

https://www.jianshu.com/p/4f032dccdcef

https://www.jianshu.com/p/bbac132b15a5

https://blog.youkuaiyun.com/u011511601/article/details/81951939

<think>好的,我现在需要帮助用户了解Python中常用的数据聚类方法,特别是KMeans、DBSCAN和层次聚类。用户已经提到了这三个方法,并且引用了相关资料,我需要结合这些资料和之前的回答来组织内容。 首先,我得确认用户的需求是什么。他们可能是在学习聚类算法,或者需要在实际项目中使用这些方法,所以需要原理、实现步骤、应用场景以及优缺。根据用户提供的引用,引用[1]和[2]提到了DBSCAN和KMeans的代码实例,引用[3]详细解释了KMeans的算法流程和初始化方法,引用[4]提到了手写算法的实现细节。这些资料可以帮助我补充代码示例和原理解释。 接下来,我需要回顾之前自己的回答,确保内容一致但不过于重复。之前的回答已经详细对比了三种方法的原理、参数调优、案例和常见问题。现在需要以更简洁的方式呈现,可能分为方法介绍、代码示例、应用场景和选择建议几个部分。 要注意用户可能对数学公式和代码实现感兴趣,所以需要包含必要的公式,比如KMeans的目标函数,DBSCAN的核心概念,以及层次聚类的合并策略。同时,根据用户提供的引用,添加具体的代码示例,如DBSCAN的Python实现和KMeans的初始化方法。 用户引用的资料中提到KMeans的初始化方法,如Forgy和随机划分,这需要在KMeans部分详细说明。同时,DBSCAN的地理应用案例和层次聚类的树状图分析也是重。需要确保这些内容都被涵盖。 另外,用户可能对如何选择算法感兴趣,所以需要总结一个选择指南,比如数据形状、是否需要处理噪声、是否需要层次结构等。结合引用中的信息,比如DBSCAN适合非球形数据和噪声处理,KMeans适合球形数据,层次聚类适合需要层次分析的场景。 还要注意使用正确的中文术语,避免翻译错误,比如“质心”、“密度可达”、“树状图”等。同时,按照用户的要求,行内公式用$...$,独立公式用$$...$$,并检查LaTeX语法是否正确。 最后,生成相关问题,确保问题覆盖不同方面,如算法比较、参数调优、应用场景等。这有助于用户进一步探索。 现在需要组织内容结构: 1. 方法概述:分别介绍三种方法的基本原理和特。 2. 代码示例:使用用户提供的引用中的代码,补充说明。 3. 应用场景:结合行业案例,如电商、交通、生物等。 4. 算法选择指南:根据数据类型和需求推荐方法。 5. 常见问题:如初始化、参数调优、处理噪声等。 在写作过程中,需要引用用户提供的资料,比如引用[1]中的DBSCAN代码,引用[3]中的KMeans初始化方法,引用[2]中的密度聚类效果对比。同时,确保回答结构清晰,逐步引导用户理解每个方法的核心概念和实现步骤。 需要特别注意避免直接复制之前的回答内容,而是整合引用资料和之前的知识,形成新的、更贴近用户当前问题的回答。例如,用户可能更关注实际应用,因此加强案例部分的说明,如使用KMeans进行客户分群,DBSCAN处理地理数据等。 最后,检查是否符合所有格式要求,如引用标识、代码块使用正确语法、中英文标正确使用等。确保回答真实可靠,参考了提供的引用资料,并且逻辑连贯,易于理解。</think>### Python数据聚类常用方法解析 #### 一、核心方法原理与实现 ##### 1. **K-Means聚类** - **数学原理**:通过迭代最小化目标函数 $$J = \sum_{i=1}^k \sum_{x \in C_i} \|x - \mu_i\|^2$$ 其中$\mu_i$为簇质心,算法流程包括: 1. 随机选择初始质心(常用Forgy方法或随机划分[^3]) 2. 将样本分配到最近质心 3. 更新质心为簇内均值 4. 重复直到收敛[^1][^3] - **代码示例**: ```python from sklearn.cluster import KMeans import numpy as np X = np.array([[1, 2], [1, 4], [5, 8], [8, 8]]) kmeans = KMeans(n_clusters=2, n_init=20).fit(X) # 增加初始化次数避免局部最优 print(kmeans.labels_) # 输出聚类标签 ``` - **特**: - 适合球形数据分布 - 需预先指定簇数$k$ - 对初始质心敏感,可能陷入局部最优[^1] ##### 2. **DBSCAN密度聚类** - **核心概念**: - **$\epsilon$-邻域**:半径$\epsilon$内的样本集合 - **核心**:邻域内样本数≥`min_samples`的 - **密度可达**:通过核心链连接的样本集合[^2][^4] - **代码示例**(含噪声识别): ```python from sklearn.cluster import DBSCAN X = np.array([[1, 2], [2, 2], [25, 80], [8, 7]]) dbscan = DBSCAN(eps=3, min_samples=2).fit(X) print(dbscan.labels_) # 输出标签,-1表示噪声 ``` - **特**: - 自动识别任意形状簇 - 可检测噪声 - 适合地理数据(需用Haversine距离[^1]) - 对参数$\epsilon$敏感,需通过k-距离图选择[^2] ##### 3. **层次聚类** - **合并策略**: | 方法 | 计算方式 | 适用场景 | |------------|------------------------------|------------------| | 单链接 | 最小簇间距(易形成链状簇) | 细长结构数据 | | 全链接 | 最大簇间距(生成紧凑簇) | 噪声较少数据 | | Ward方法 | 最小化合并后的方差增量 | 球形簇优化[^1] | - **代码示例**(树状图可视化): ```python from scipy.cluster.hierarchy import dendrogram, linkage import matplotlib.pyplot as plt Z = linkage(X, method='ward') plt.figure(figsize=(10, 5)) dendrogram(Z) plt.axhline(y=4, color='r', linestyle='--') # 根据高度切割簇 plt.show() ``` #### 二、应用场景对比 | 算法 | 典型场景 | 优势 | |--------------|---------------------------------------------|-------------------------------| | **K-Means** | 客户分群(RFM模型)、图像压缩 | 计算效率高,适合大数据量 | | **DBSCAN** | 交通热识别、异常检测(如信用卡欺诈[^4]) | 处理噪声,发现任意形状簇 | | **层次聚类** | 生物基因分类、文档主题聚类 | 可视化层次关系,无需预设簇数 | #### 三、算法选择指南 1. **数据形状** - 球形簇 → K-Means - 不规则形状 → DBSCAN - 需要层次分析 → 层次聚类[^2] 2. **参数要求** - 已知簇数 → K-Means - 未知簇数但能确定密度参数 → DBSCAN - 需要探索层次结构 → 层次聚类 3. **噪声处理** - 含噪声数据优先选择DBSCAN #### 四、常见问题解决方案 1. **K-Means初始化优化** ```python KMeans(init='k-means++') # 改进初始化方法,减少迭代次数 ``` 2. **DBSCAN参数选择** - 绘制k-距离图(k=min_samples-1),选择拐作为$\epsilon$[^2] ```python from sklearn.neighbors import NearestNeighbors nn = NearestNeighbors(n_neighbors=5).fit(X) distances, _ = nn.kneighbors(X) plt.plot(np.sort(distances[:,4])) # 观察拐 ``` 3. **层次聚类计算优化** ```python from sklearn.cluster import AgglomerativeClustering model = AgglomerativeClustering(n_clusters=3, linkage='ward') # 预设簇数加速计算 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值