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

【机器学习基础】机器学习入门核心算法:K均值(K-Means)

在这里插入图片描述

机器学习入门核心算法:K均值(K-Means)

    • 1. 算法逻辑
    • 2. 算法原理与数学推导
        • 2.1 目标函数
        • 2.2 数学推导
        • 2.3 时间复杂度
    • 3. 模型评估
        • 内部评估指标
        • 外部评估指标(需真实标签)
    • 4. 应用案例
        • 4.1 客户细分
        • 4.2 图像压缩
        • 4.3 文档聚类
    • 5. 面试题及答案
    • 6. 优缺点分析
        • **优点**:
        • **缺点**:
    • 7. 数学证明:为什么均值最小化WCSS?

1. 算法逻辑

K均值是一种无监督聚类算法,核心目标是将n个数据点划分为k个簇(cluster),使得同一簇内数据点相似度高,不同簇间差异大。算法流程如下:

graph TDA[初始化K个质心] --> B[分配数据点到最近质心]B --> C[重新计算质心位置]C --> D{质心是否变化?}D -- 是 --> BD -- 否 --> E[输出聚类结果]

2. 算法原理与数学推导

2.1 目标函数

最小化簇内平方和(Within-Cluster Sum of Squares, WCSS):
J = ∑ i = 1 k ∑ x ∈ C i ∥ x − μ i ∥ 2 J = \sum_{i=1}^k \sum_{x \in C_i} \|x - \mu_i\|^2 J=i=1kxCixμi2
其中:

  • C i C_i Ci 表示第i个簇
  • μ i \mu_i μi 表示第i个簇的质心
  • ∥ x − μ i ∥ \|x - \mu_i\| xμi 表示欧氏距离
2.2 数学推导

步骤1:初始化质心
随机选择k个数据点作为初始质心:
μ 1 ( 0 ) , μ 2 ( 0 ) , . . . , μ k ( 0 ) 其中 μ j ( 0 ) ∈ R d \mu_1^{(0)}, \mu_2^{(0)}, ..., \mu_k^{(0)} \quad \text{其中} \mu_j^{(0)} \in \mathbb{R}^d μ1(0),μ2(0),...,μk(0)其中μj(0)Rd

步骤2:分配数据点
对每个数据点 x i x_i xi,计算到所有质心的距离,分配到最近质心的簇:
C j ( t ) = { x i : ∥ x i − μ j ( t ) ∥ 2 ≤ ∥ x i − μ l ( t ) ∥ 2 ∀ l } C_j^{(t)} = \{ x_i : \|x_i - \mu_j^{(t)}\|^2 \leq \|x_i - \mu_l^{(t)}\|^2 \ \forall l \} Cj(t)={xi:xiμj(t)2xiμl(t)2 l}

步骤3:更新质心
重新计算每个簇的均值作为新质心:
μ j ( t + 1 ) = 1 ∣ C j ( t ) ∣ ∑ x i ∈ C j ( t ) x i \mu_j^{(t+1)} = \frac{1}{|C_j^{(t)}|} \sum_{x_i \in C_j^{(t)}} x_i μj(t+1)=Cj(t)1xiCj(t)xi

步骤4:收敛条件
当满足以下任一条件时停止迭代:
∥ μ j ( t + 1 ) − μ j ( t ) ∥ < ϵ 或 J ( t ) − J ( t + 1 ) < δ \|\mu_j^{(t+1)} - \mu_j^{(t)}\| < \epsilon \quad \text{或} \quad J^{(t)} - J^{(t+1)} < \delta μj(t+1)μj(t)<ϵJ(t)J(t+1)<δ

2.3 时间复杂度
  • 每次迭代: O ( k n d ) O(knd) O(knd)
  • 总复杂度: O ( t k n d ) O(tknd) O(tknd)
    其中k=簇数,n=样本数,d=特征维度,t=迭代次数

3. 模型评估

内部评估指标
  1. 轮廓系数(Silhouette Coefficient)
    s ( i ) = b ( i ) − a ( i ) max ⁡ { a ( i ) , b ( i ) } s(i) = \frac{b(i) - a(i)}{\max\{a(i), b(i)\}} s(i)=max{a(i),b(i)}b(i)a(i)

    • a ( i ) a(i) a(i):样本i到同簇其他点的平均距离
    • b ( i ) b(i) b(i):样本i到最近其他簇的平均距离
    • 取值范围:[-1, 1],越大越好
  2. 戴维森堡丁指数(Davies-Bouldin Index)
    D B = 1 k ∑ i = 1 k max ⁡ j ≠ i ( σ i + σ j d ( μ i , μ j ) ) DB = \frac{1}{k} \sum_{i=1}^k \max_{j \neq i} \left( \frac{\sigma_i + \sigma_j}{d(\mu_i, \mu_j)} \right) DB=k1i=1kj=imax(d(μi,μj)σi+σj)

    • σ i \sigma_i σi:簇i内平均距离
    • d ( μ i , μ j ) d(\mu_i, \mu_j) d(μi,μj):簇中心距离
    • 取值越小越好
外部评估指标(需真实标签)
  • 调整兰德指数(Adjusted Rand Index)
  • Fowlkes-Mallows 指数
  • 互信息(Mutual Information)

4. 应用案例

4.1 客户细分
  • 场景:电商用户行为分析
  • 特征:购买频率、客单价、浏览时长
  • 结果:识别高价值客户群(K=5),营销转化率提升23%
4.2 图像压缩
  • 原理:将像素颜色聚类为K种代表色
  • 步骤
    1. 将图像视为RGB点集(n=像素数,d=3)
    2. 设置K=256(256色图像)
    3. 用簇中心颜色代替原始像素
  • 效果:文件大小减少85%且视觉质量可接受
4.3 文档聚类
  • 场景:新闻主题分类
  • 特征:TF-IDF向量(d≈10,000)
  • 挑战:高维稀疏数据需先降维(PCA/t-SNE)

5. 面试题及答案

Q1:K均值对初始质心敏感,如何改进?
A:采用K-means++初始化:

  1. 随机选第一个质心
  2. 后续质心以概率 D ( x ) 2 / ∑ D ( x ) 2 D(x)^2 / \sum D(x)^2 D(x)2/D(x)2选择
    D ( x ) D(x) D(x)为点到最近质心的距离)

Q2:如何确定最佳K值?
A:常用方法:

  • 肘部法则(Elbow Method):绘制K与WCSS曲线,选拐点
    from sklearn.cluster import KMeans
    distortions = []
    for k in range(1,10):kmeans = KMeans(n_clusters=k)kmeans.fit(X)distortions.append(kmeans.inertia_)
    
  • 轮廓系数法:选择使平均轮廓系数最大的K

Q3:K均值能否处理非凸数据?
A:不能。K均值假设簇是凸形且各向同性。解决方案:

  • 使用谱聚类(Spectral Clustering)
  • 或DBSCAN等基于密度的算法

6. 优缺点分析

优点
  1. 简单高效:时间复杂度线性增长,适合大规模数据
  2. 可解释性强:簇中心代表原型特征
  3. 易于实现:核心代码仅需10行
    def k_means(X, k):centroids = X[np.random.choice(len(X), k)]while True:labels = np.argmin(np.linalg.norm(X[:,None]-centroids, axis=2), axis=1)new_centroids = np.array([X[labels==j].mean(0) for j in range(k)])if np.allclose(centroids, new_centroids): breakcentroids = new_centroidsreturn labels, centroids
    
缺点
  1. 需预先指定K值:实际应用中K常未知
  2. 对异常值敏感:均值易受极端值影响
  3. 仅适用于数值数据:需对类别变量编码
  4. 局部最优问题:不同初始化可能产生不同结果
  5. 假设各向同性:在细长簇或流形数据上效果差

7. 数学证明:为什么均值最小化WCSS?

给定簇 C j C_j Cj,优化目标:
min ⁡ μ j ∑ x i ∈ C j ∥ x i − μ j ∥ 2 \min_{\mu_j} \sum_{x_i \in C_j} \|x_i - \mu_j\|^2 μjminxiCjxiμj2
求导并令导数为零:
∂ ∂ μ j ∑ ∥ x i − μ j ∥ 2 = − 2 ∑ ( x i − μ j ) = 0 \frac{\partial}{\partial \mu_j} \sum \|x_i - \mu_j\|^2 = -2 \sum (x_i - \mu_j) = 0 μjxiμj2=2(xiμj)=0
解得:
μ j = 1 ∣ C j ∣ ∑ x i \mu_j = \frac{1}{|C_j|} \sum x_i μj=Cj1xi
证毕:均值是簇内平方和的最优解。


💡 关键洞察:K均值本质是期望最大化(EM)算法的特例:

  • E步:固定质心,分配数据点(期望)
  • M步:固定分配,更新质心(最大化)

实际应用时建议:

  1. 数据标准化:消除量纲影响
  2. 多次运行:取最佳结果(n_init=10
  3. 结合PCA降维:处理高维数据
  4. 对分类型数据用K-mode变种
http://www.xdnf.cn/news/9783.html

相关文章:

  • Spring Boot测试框架全面解析
  • 甘特图 dhtmlxGantt.js UA实例
  • SpringMVC核心原理与前后端数据交互机制详解
  • MultipartEntityBuilder上传文件解决中文名乱码
  • openEuler安装MySql8(tar包模式)
  • 阿里通义实验室突破空间音频新纪元!OmniAudio让360°全景视频“声”临其境
  • 核心知识点:惯性导航(Inertial Navigation)
  • 【python深度学习】Day 39 图像数据与显存
  • 在 Ubuntu 服务器上 下载 Clash 文件使用代理
  • Opencv实用操作5 图像腐蚀膨胀
  • 将 Figma 设计稿通过编码一比一还原成 App 界面
  • 远程调用 | OpenFeign+LoadBalanced的使用
  • LocalResolver使用
  • 2025年全国青少年信息素养大赛 scratch图形化编程挑战赛 小低组初赛 内部集训模拟题解析
  • Python使用MD5码加密手机号等敏感信息
  • UI自动化测试的革新,新一代AI工具MidScene.js实测!
  • leetcode450.删除二叉搜索树中的节点:迭代法巧用中间节点应对多场景删除
  • wechat-003-学习笔记
  • 服务器密码安全运维解决新思路:凭据管理SMS+双因素SLA认证结合的方案
  • 3d GIS数据来源与编辑工具
  • OpenAI o3安全危机:AI“抗命”背后的技术暗战与产业变局
  • 使用微软最近开源的WSL在Windows上优雅的运行Linux
  • 【笔记】Trae+Andrioid Studio+Kotlin开发安卓WebView应用
  • 位集合(STL bitset)简介
  • Starrocks 物化视图的实现以及在刷新期间能否读数据
  • 分布式不同数据的一致性模型
  • Java开发经验——阿里巴巴编码规范实践解析8
  • RK3568DAYU开发板-平台驱动开发--UART
  • 传输层协议TCP(上)
  • 【Linux】线程概念