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

【聚类】K-means++

K-means++

文章目录

  • K-means++
    • 1. 算法介绍
    • 2. 公式及原理
    • 3. 伪代码

1. 算法介绍

  • 背景与目标
    k-means++ 是 David Arthur 和 Sergei Vassilvitskii 于2007年提出的改进 k-means 初始化方法,其核心目标是:

    在保证聚类质量的前提下,通过更合理地选择初始簇心,减少 k-means 对随机初始化的敏感性,加快收敛并降低陷入次优解的风险。

  • 应用场景

    • 所有使用 k-means 聚类但对初始化鲁棒性和收敛速度有较高要求的场景
    • 大规模数据聚类预处理,减少多次重启的计算成本
  • 核心思路

    1. 第一簇心:随机从样本集中任选一个点;
    2. 后续簇心:对于每个样本点,计算其与已有簇心的最小距离平方 D ( x ) 2 D(x)^2 D(x)2
    3. 概率采样:按权重 D ( x ) 2 D(x)^2 D(x)2 对样本进行加权随机抽样,选出下一个簇心;
    4. 重复:直到选出 K K K 个簇心,再执行标准 k-means 算法。

2. 公式及原理

设已选出的簇心集合为 { μ 1 , … , μ c } \{\mu_1,\dots,\mu_c\} {μ1,,μc},对任意样本点 x \mathbf{x} x

  1. 最小距离平方

    D ( x ) 2 = min ⁡ 1 ≤ i ≤ c ∥ x − μ i ∥ 2 . D(\mathbf{x})^2 = \min_{1\le i\le c}\|\mathbf{x}-\mu_i\|^2. D(x)2=1icminxμi2.

  2. 采样概率
    对所有样本归一化后,样本 x \mathbf{x} x 被选为下一个簇心的概率为:

    P ( x ) = D ( x ) 2 ∑ x ′ D ( x ′ ) 2 . P(\mathbf{x}) = \frac{D(\mathbf{x})^2}{\sum_{x'}D(x')^2}. P(x)=xD(x)2D(x)2.

  3. 加速变体
    实际实现中可用“距离二分桶”或近似方法快速更新 D ( x ) D(x) D(x),以降低每次选点的计算开销。


3. 伪代码

# 输入
#   X: 数据矩阵,形状 (n, d)
#   K: 簇的个数
# 输出
#   centroids: 初始簇心列表,长度 Kfunction kmeans_pp_init(X, K):n, d ← shape(X)centroids ← empty list# 1) 随机选第一个簇心idx0 ← random_integer(1, n)centroids.append(X[idx0])# 2) 依次选取剩余 K-1 个簇心for c in 2…K:# 2.1) 计算每个样本到最近已有簇心的距离平方D_sq ← array of length nfor i in 1…n:D_sq[i] ← min_{μ ∈ centroids} ‖X[i] - μ‖²# 2.2) 按 D_sq 权重进行随机抽样sum_D ← sum(D_sq)probs ← D_sq / sum_D     # 归一化概率idx ← sample_index_with_probability(probs)centroids.append(X[idx])return centroids# 后续可将 centroids 传入标准 KMeans 进行迭代
  • 时间复杂度

    • 每次选新簇心计算距离: O ( n c d ) O(n\,c\,d) O(ncd),总计选取 K 个簇心约 O ( n K d ) O(n\,K\,d) O(nKd)
    • 相比随机初始化,多了这一步但通常能显著减少后续迭代次数。
  • 注意事项

    • 随机数种子可固定以保证可复现;
    • 对极大规模数据可结合分层抽样或局部敏感哈希加速采样。
http://www.xdnf.cn/news/531001.html

相关文章:

  • Spring Cloud初探之spring cloud gateway实现转发、鉴权及负载均衡(六)
  • spring中yml配置上下文与tomcat等外部容器不一致问题
  • Yocto和Buildroot功能和区别
  • 数据库连接池技术与 Druid 连接工具类实现
  • w~自动驾驶合集1
  • 腾讯云Mysql实现远程链接
  • idea2024 不知道安装了什么插件,界面都是中文的了,不习惯,怎么修改各个选项改回英文
  • 文件字节流
  • LLM笔记(九)KV缓存(2)
  • RK3568解码1080P视频时遇到系统崩溃内核挂掉的解决方案
  • C语言:在操作系统中,链表有什么应用?
  • 安全强化的Linux
  • RLᵛ_ Better Test-Time Scaling by Unifying LLM Reasoners With Verifiers
  • 【TTS回顾】Bert-VITS2深度解析:融合BERT的多语言语音合成模型
  • 详细总结和讲解redis的基本命令
  • JavaScript 性能优化实战指南
  • Unity3D HUD UI性能优化方案
  • 卓力达手撕垫片:精密制造的创新解决方案与多领域应用
  • Unreal Engine: Windows 下打包 AirSim项目 为 Linux 平台项目
  • 【成品设计】STM32和UCOS-II的项目
  • 软考教材重点内容 信息安全工程师 25章 移动安全 26章 大数据安全
  • Flask 与 Django 服务器部署
  • 【成品设计】基于STM32的的宠物看护系统
  • 论文阅读--Logical quantum processor based on reconfigurable atom arrays
  • ModbusTCP转 Profinet网关:热收缩包装机智能化改造核心方案
  • 深入理解 Redisson 看门狗机制:保障分布式锁自动续期
  • chirpstack v4版本 全流程部署[ubuntu+docker]
  • Linux 移植 Docker 详解
  • LeetCode 925. 长按键入 java题解
  • MIME类型详解及应用案例