70、聚类算法:从K均值到混合模型与谱聚类

聚类算法:从K均值到混合模型与谱聚类

1. K均值聚类

1.1 K-means++算法

K均值算法用于优化非凸目标,因此需要谨慎初始化。简单的做法是随机选择K个数据点作为初始的簇中心$\mu_k$ 。为了改进这一方法,可以多次重启算法,即从不同的随机起点多次运行算法,然后选择最优解,但这种方法速度较慢。

更好的方法是顺序选择中心以覆盖数据。首先随机均匀选择一个初始点,后续每个点从剩余点中选择,其被选中的概率与其到最近簇中心的距离的平方成正比。在第t次迭代时,选择下一个簇中心$x_n$的概率为:
$p(\mu_t = x_n) = \frac{D_{t - 1}(x_n)^2}{\sum_{n’ = 1}^{N} D_{t - 1}(x_{n’})^2}$
其中,$D_t(x) = \min_{k = 1}^{t - 1} ||x - \mu_k||_2^2$ 是$x$到最近现有质心的距离。这种方法也被称为最远点聚类或K-means++,能保证重构误差比最优值差不超过$O(\log K)$ 。

1.2 K-中心点算法

K-中心点算法是K均值的一种变体,它通过选择数据示例$x_n \in X$来估计每个簇中心$\mu_k$ ,该示例与该簇中所有其他点的平均差异最小,这样的点被称为中心点。与K均值不同,K均值通过对分配到簇中的点$x_n \in R^D$求平均值来计算中心,而K-中心点对离群值更鲁棒,并且可以应用于非$R^D$空间的数据,其输入是$N \times N$的成对距离矩阵$D(n, n’)$ ,而非$N \times D$的特征矩阵。

1.2.1 PAM方法

解决K-中心点问题的经典算法是围绕中心点划分(PAM)方法。在每次迭代中,遍历所有K个中心点。对于每个中心点$m$ ,考虑每个非中心点$o$ ,交换$m$和$o$ ,并重新计算成本(所有点到其中心点的距离之和)。如果成本降低,则保留这次交换。该算法的运行时间为$O(K(N - K)^2I)$ ,其中$I$是迭代次数。

1.2.2 Voronoi迭代方法

这是一种更简单、更快的方法。在每次迭代中有两个步骤,类似于K均值:
1. 对于每个簇$k$ ,查看当前分配到该簇的所有点$S_k = {n : z_n = k}$ ,然后将$m_k$设置为该集合的中心点的索引(需要检查所有$|S_k|$个候选点,并选择与$S_k$中所有其他点的距离之和最小的点)。
2. 对于每个点$n$ ,将其分配到最近的中心点,即$z_n = \arg\min_k D(n, k)$ 。

以下是K-中心点算法的伪代码:

1. 初始化$m_{1:K}$为从$\{1, \ldots, N\}$中随机选取的大小为K的子集;
2. 重复
3.     对于$n = 1:N$,$z_n = \arg\min_k d(n, m_k)$;
4.     对于$k = 1:K$,$m_k \leftarrow \arg\min_{n:z_n = k} \sum_{n':z_{n'} = k} d(n, n')$;
5. 直到收敛;

1.3 加速技巧

K均值聚类的时间复杂度为$O(NKI)$ ,可以使用各种技巧来降低常数因子。例如,利用三角形不等式跟踪输入与质心之间距离的上下界,以消除一些冗余计算;还可以使用小批量近似方法,虽然可能会导致损失略有增加,但速度会显著提高。

1.4 选择簇的数量K

1.4.1 最小化失真

基于监督学习的经验,自然的选择是选择使验证集上重构误差最小的$K$值,重构误差定义为:
$err(D_{valid}, K) = \frac{1}{|D_{valid}|} \sum_{n \in D_{valid}} ||x_n - \hat{x}_n||_2^2$
其中,$\hat{x}_n = decode(encode(x_n))$是$x_n$的重构。然而,这种方法并不适用,因为K均值模型是一种退化的密度模型,随着$K$的增加,重构误差会单调递减,无法通过验证集上的重构误差来选择最佳的无监督模型。

1.4.2 最大化边际似然

可以使用适当的概率模型(如高斯混合模型GMM),通过数据的对数边际似然(LML)进行模型选择。可以使用BIC分数近似LML,其形式为:
$BIC(K) = \log p(D|\hat{\theta}_k) - D_K \log(N)$
其中,$D_K$是具有K个簇的模型中的参数数量,$\hat{\theta}_K$是最大似然估计。BIC通常呈现U形曲线,当有足够的簇覆盖分布的真实模式时,贝叶斯奥卡姆剃刀原理会起作用,开始惩罚过于复杂的模型。

1.4.3 轮廓系数

轮廓系数是一种常用的启发式方法,适用于球形(非细长)簇。实例$i$的轮廓系数定义为$sc(i) = \frac{b_i - a_i}{\max(a_i, b_i)}$ ,其中$a_i$是实例$i$到其所在簇中其他实例的平均距离,$b_i$是实例$i$到下一个最近簇中其他实例的平均距离。轮廓系数的取值范围为-1到+1,值为+1表示实例与其所在簇的所有成员接近,且远离其他簇;值为0表示实例接近簇边界;值为-1表示实例可能被错误分类。聚类$K$的轮廓分数定义为所有实例的轮廓系数的平均值。

1.4.4 逐步增加混合成分的数量

可以从一个较小的$K$值开始,在每次训练后,将混合权重最高的簇拆分为两个,新的质心是原始质心的随机扰动,新的分数是旧分数的一半。如果新簇的分数太小或方差太窄,则将其移除,直到达到所需的簇数量。

1.4.5 稀疏估计方法

选择一个较大的$K$值,然后使用某种促进稀疏性的先验或推理方法来消除不需要的混合成分,如变分贝叶斯。

1.5 选择簇数量方法对比

方法 原理 优缺点
最小化失真 选择使验证集重构误差最小的K值 不适用,重构误差随K单调递减
最大化边际似然 使用对数边际似然或BIC分数进行模型选择 需要合适的概率模型,能有效惩罚复杂模型
轮廓系数 计算实例的轮廓系数并求平均值 适用于球形簇,可直观判断簇的质量
逐步增加混合成分数量 从小K值开始逐步拆分簇 可动态调整簇的数量
稀疏估计方法 选择大K值并消除不需要的成分 可自动筛选有效成分

1.6 K均值聚类流程

graph LR
    A[初始化簇中心] --> B[分配点到最近的簇]
    B --> C[更新簇中心]
    C --> D{是否收敛}
    D -- 否 --> B
    D -- 是 --> E[输出聚类结果]

2. 使用混合模型进行聚类

2.1 高斯混合模型(GMM)

高斯混合模型(GMM)的形式为:
$p(x|\theta) = \sum_{k = 1}^{K} \pi_k N(x|\mu_k, \Sigma_k)$
如果知道模型参数$\theta = (\pi, {\mu_k, \Sigma_k})$ ,可以使用贝叶斯规则计算数据点$x_n$属于簇$k$的责任(后验成员概率):
$r_{nk} \triangleq p(z_n = k|x_n, \theta) = \frac{p(z_n = k|\theta)p(x_n|z_n = k, \theta)}{\sum_{k’ = 1}^{K} p(z_n = k’|\theta)p(x_n|z_n = k’, \theta)}$
给定责任,可以计算最可能的簇分配:
$\hat{z} n = \arg\max_k r {nk} = \arg\max_k [\log p(x_n|z_n = k, \theta) + \log p(z_n = k|\theta)]$
这被称为硬聚类。

2.1.1 K均值是EM算法的特殊情况

可以使用EM算法估计GMM的参数,K均值算法是EM算法的一种特殊情况。在K均值中,假设所有簇具有相同的球形形状,即固定$\Sigma_k = I$和$\pi_k = 1/K$ ,并在E步用硬簇分配近似软责任。这样,M步中的加权最大似然估计问题就简化为K均值的更新公式。

2.1.2 不可识别性和标签切换问题

在混合模型中,可以自由交换标签而不改变似然,这被称为标签切换问题,是参数不可识别性的一个例子。这会给参数的后验推断带来问题。例如,使用HMC拟合具有$K = 2$个成分的GMM时,均值的后验分布可能是双峰的,反映了数据有两种同样好的解释。

为了打破对称性,可以对中心添加排序约束,如$\mu_1 < \mu_2$ ,可以通过在目标函数中添加惩罚或势函数来实现。更一般的方法是对参数应用变换以确保可识别性,即从提议中采样参数$\theta$ ,然后在计算对数联合之前对其应用可逆变换$\theta’ = f(\theta)$ ,并考虑变量变换的影响。

2.1.3 贝叶斯模型选择

确保可识别性后,可以使用贝叶斯模型比较技术选择簇的数量$K$ 。可以通过计算WAIC分数(对数边际似然的近似)来比较不同$K$值的GMM模型。例如,对某个数据集拟合不同$K$值的GMM模型,计算其WAIC分数,发现$K = 6$的模型得分显著高于其他模型,$K = 5$的模型次之。

2.2 伯努利混合模型

可以使用伯努利混合模型对二进制数据进行聚类,模型形式为:
$p(y|z = k, \theta) = \prod_{d = 1}^{D} Ber(y_d|\mu_{dk}) = \prod_{d = 1}^{D} \mu_{dk}^{y_d}(1 - \mu_{dk})^{1 - y_d}$
其中,$\mu_{dk}$是簇$k$中第$d$位为1的概率。可以使用EM、SGD、MCMC等方法拟合该模型。例如,对二值化的MNIST数字数据进行聚类,可视化估计的簇均值$\hat{\mu}_k$ 。

2.3 混合模型聚类流程

graph LR
    A[初始化模型参数] --> B[E步:计算责任]
    B --> C[M步:更新参数]
    C --> D{是否收敛}
    D -- 否 --> B
    D -- 是 --> E[输出聚类结果]

3. 谱聚类

谱聚类是一种基于成对相似性矩阵特征值分析的聚类方法。它利用特征向量为每个数据点导出特征向量,然后使用基于特征的聚类方法(如K均值)进行聚类。

3.1 谱聚类步骤

  1. 计算数据点之间的成对相似性矩阵。
  2. 对相似性矩阵进行特征值分解,得到特征向量。
  3. 选择合适的特征向量作为新的特征表示。
  4. 使用K均值等聚类方法对新的特征表示进行聚类。

3.2 谱聚类与其他方法对比

方法 适用数据类型 对簇形状的要求 计算复杂度
K均值聚类 数值数据 球形簇 $O(NKI)$
高斯混合模型 数值数据 较灵活,可适应不同形状的簇 较高,与模型参数数量有关
伯努利混合模型 二进制数据 无特殊要求 与模型参数数量有关
谱聚类 任意数据,通过相似性矩阵定义 较灵活,可处理非凸簇 与特征值分解复杂度有关

3.3 谱聚类流程

graph LR
    A[计算相似性矩阵] --> B[特征值分解]
    B --> C[选择特征向量]
    C --> D[使用K均值等聚类]
    D --> E[输出聚类结果]

综上所述,不同的聚类方法适用于不同的数据类型和聚类需求。K均值聚类简单高效,但对簇的形状有一定要求;混合模型可以处理更复杂的簇形状,但计算复杂度较高;谱聚类则可以处理非凸簇,具有较强的灵活性。在实际应用中,需要根据具体情况选择合适的聚类方法,并合理选择簇的数量。

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值