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

article/2025/8/26 12:20:50

在这里插入图片描述

机器学习入门核心算法: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.hkcw.cn/article/QBWoCscwwR.shtml

相关文章

力扣热题100之二叉树的最大深度

题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 代码 方法一&#xff1a;递归 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightN…

【C++编程】C++学习笔记【更新ing】

C学习笔记 作者&#xff1a;齐花Guyc(CAUC) 文章目录 C学习笔记Chapter.1 面向对象编程&#xff08;OOP&#xff09;1.类&#xff08;class&#xff09;2.对象&#xff08;object&#xff09;3.封装&#xff08;Encapsulation&#xff09;4.继承&#xff08;Inheritance&#…

华为OD机试真题——矩形相交的面积(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

STM32F407VET6学习笔记7:Bootloader跳转APP程序

boot跳转APP的程序 目录 Flash分区设定&#xff1a; 工程文件地址设置&#xff1a; Bootloader工程文件&#xff1a; 测试的APP程序工程文件&#xff1a; Bootloader跳转程序&#xff1a; APP程序&#xff1a; Flash分区设定&#xff1a; 参考手册的分区&#xff1a; 工程文件…

5.29 打卡

DAY 39 图像数据与显存 知识点回顾 图像数据的格式&#xff1a;灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 作业&#xff1a;今日代码较少&#xff0c;理解内容即可 # 打印一张彩色图像…

关于scrapy在pycharm中run可以运行,但是debug不行的问题

关于scrapy在pycharm中run模式可以运行&#xff0c;但是debug模式不行的问题 文章目录 关于scrapy在pycharm中run模式可以运行&#xff0c;但是debug模式不行的问题查了下原因 点击run就可以运行&#xff0c;但是debug就是运行不了 一点击debug就报这个错&#xff0c;也不知道啥…

第7讲、Odoo 18 源码深度分析

Odoo 作为全球知名的开源 ERP 系统&#xff0c;其底层架构由众多核心 Python 文件共同支撑。本文将围绕 Odoo 18 版本中 的 api.py、exceptions.py、fields.py、http.py、loglevels.py、models.py、netsvc.py、release.py、sql_db.py 等关键文件&#xff0c;进行源码结构与实现…

【春秋云镜】CVE-2022-26965 靶场writeup

知识点 网站的主题或者模块位置一般是可以上传文件的&#xff0c;不过一般为压缩包形式主题或者模块可以上github上找到和cms匹配的源码主题被解压后会放到加入到对应的文件夹中&#xff0c;而且还会自动执行对应的info.php文件(需要主题和cms配套才行)我这里取巧了&#xff0…

JUC多线程核心知识点深度解析

最近正在复习Java八股&#xff0c;所以会将一些热门的八股问题&#xff0c;结合ai与自身理解写成博客便于记忆 本文将从以上10个经典面试问题来做juc多线程的解析 一、线程状态与流转机制 1. 六种线程状态&#xff08;Java定义&#xff09; public enum State {NEW, …

设计模式学习笔记

设计模式 一&#xff1a;分类&#xff1a; 创建型模式 用于描述“怎样创建对象”&#xff0c;它的主要特点是“将对象的创建与使用分离”。GoF&#xff08;四人组&#xff09;书中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。 结构型模式 用于描述如何将…

【地图】腾讯地图页面卡顿问题解决

目录 背景问题排查解决1. 页面是否使用 keep-alive 进行路由缓存2. 离开地图页面时&#xff0c;是否将地图清除 总结 背景 有的电脑没有显卡会出现如下问题&#xff1a; 系统打开有地图的页面&#xff0c;CPU 占用直线飙升到100%下不来&#xff0c;切到非地图页面&#xff0c;C…

一起看 I/O | Android 性能相关最新动态

作者 / Ben Weiss 过去几年来&#xff0c;我们一直致力于让性能提升工作变得更易上手、回报更高。我们将在本文中分享这一领域的最新发展动态。为您介绍基准配置文件、Android Studio 中的工具改进、库&#xff0c;以及我们如何让这项技术更好地在后台为您服务。此外&#xff0…

iPhone批量删除照片的方法

对于每一个iPhone用户来说&#xff0c;照片管理是一项日常而重要的任务。随着时间的积累&#xff0c;无数的照片快速填满了我们的存储空间&#xff0c;从美丽的风景到重要的家庭聚会&#xff0c;每一张照片都记录着我们生活中的瞬间。然而&#xff0c;当存储空间即将耗尽时&…

Gradle Kotlin 规范插件用于模块化结构 - 共享构建逻辑

Gradle Kotlin 规范插件用于模块化结构 - 共享构建逻辑 我们中的许多人都遇到过Groovy的困难&#xff0c;并习惯于将其转换为Kotlin DSL。 然后&#xff0c;作为Android工程师&#xff0c;在完全使用Kotlin编写的项目上工作是纯粹的喜悦。 我们假设采用基于功能的模块化应用程…

Gradle开发手册-高级篇之多模块项目创建

在进阶篇中详细讲解了gradle配置相关的详细内容。但是是基于单module的配置,在实际开发时基本全是多module类型的项目。所以本章我们就系统学习下如何构建多模块项目(父-子)以及相关的task内容。 基础篇:从概念以及广度上介绍下gradle的核心内容,并构建一个简单的java项目;…

Gradle的版本差异导致无法编译:Could not initialize class com.android.build.gradle.internal.TaskManager

运行项目报错:Could not initialize class com.android.build.gradle.internal.TaskManager 我这边的原因是少了SDK的包和JDK版本不对。 我们先区分下gradle version与gradle plugin version。如果对此不了解&#xff0c;经常会由于Gradle的版本号问题造成项目无法编译&#xf…

Gradle版本目录(Version Catalog)

Gradle版本目录(Version Catalog) “版本目录是一份依赖项列表&#xff0c;以依赖坐标表示&#xff0c;用户在构建脚本中声明依赖项时可以从中选择。” 我们可以使用版本目录将所有依赖项声明及其版本号保存在单个位置。这样&#xff0c;我们可以轻松地在模块和项目之间共享依…

android开发之NDK配置开发

1、打开项目后&#xff0c;一次点击Tools>SDK Manager 2、点击SDK Tools标签页 3、选中NDK&#xff08;Side by Side&#xff09;和CMake复选框 4、点击OK 此时系统会显示一个对话框&#xff0c;告诉你NDK软件包占用了多少磁盘空间 5、点击OK 6、安装完成后&#xff0c;点击…

如何在没有计算机的情况下将联系人从 iPhone 传输到安卓

如果您正在考虑从 iPhone 迁移到Android &#xff0c;您可能想知道如何在不丢失任何重要信息的情况下转移联系人。您可能还想避免使用电脑进行此过程。幸运的是&#xff0c;有几种方法可以教您如何在不使用电脑的情况下将联系人从 iPhone 迁移到Android &#xff0c;而且这些方…

如何将数据从 iPhone 传输到 vivo 的 4 种方法

在运行不同操作系统的 iPhone 和 Vivo 之间传输数据时&#xff0c;需要谨慎。廉价或不安全的在线解决方案可能会失败&#xff0c;并使您的个人数据面临风险。避免被“免费”和“快速”服务的承诺所诱惑&#xff0c;因为这可能会危及您的数据。 在本文中&#xff0c;我们整理了…