【字节跳动】数据挖掘面试题0007:Kmeans原理,何时停止迭代

文章大纲

      • K-means 原理与迭代停止条件
      • ⚙️ 一、K-Means核心思想
      • 🔁 二、迭代步骤详解
        • 关键数学操作
      • ⏹️ 三、何时停止迭代?
        • Kmeans 算法实现代码
      • ⚠️ 四、面试常见扩展问题
        • 1. K值如何选择?
        • 2. 初始质心影响结果吗?
        • 3. 算法缺陷与改进
      • 💎 五、总结与面试回答要点

K-means 原理与迭代停止条件

以下是针对数据挖掘面试题中K-Means原理及迭代停止条件的清晰解析,结合算法本质与面试考点整理,便于你快速掌握核心要点。


⚙️ 一、K-Means核心思想

K-Means是无监督聚类算法,目标是将n个数据点划分为k个簇(cluster),使得簇内距离最小化,簇间距离最大化。其迭代过程是EM(Expectation-Maximization)算法的特例,分两步交替进行:

    1. E步(分配点):固定质心,将每个点分配到最近的质心所属簇。
    1. M步(更新质心):固定簇分配,根据簇内点重新计算质心位置。

💡 通俗比喻
假设有k个班主任(质心)在教室随机站位,学生(数据点)选择最近的班主任排队。
班主任随后走到队伍中心点,学生重新排队。重复此过程直到班主任不再移动。
在这里插入图片描述


🔁 二、迭代步骤详解

以下流程图展示单次迭代过程:
在这里插入图片描述

关键数学操作
  • 距离计算:常用欧式距离 ∥ x i − μ j ∥ 2 \|x_i - \mu_j\|^2 xiμj2,决定点所属簇。
  • 质心更新:质心 μ j \mu_j μj = 1 ∣ C j ∣ ∑ x i ∈ C j x i \frac{1}{|C_j|} \sum_{x_i \in C_j} x_i Cj1xiCjxi,即簇内所有点的均值。

⏹️ 三、何时停止迭代?

停止条件决定算法收敛时机,常见以下四类

停止条件类型判断标准应用场景代码参数示例
1. 质心变化量≤阈值新旧质心距离 < ε(如 ε=1e-4)精确收敛要求高时tol=0.0001
2. 簇分配不再变化无点改变所属簇需稳定分类结果时无显式参数,自动检测
3. 目标函数收敛SSE(簇内平方和)下降量 < δ(如 δ=0.01)关注聚类质量优化时通过SSE监控
4. 达到最大迭代次数迭代次数 ≥ max_iter(如 300)防止无限循环/耗时敏感场景max_iter=100
  • Kmeans 算法停止迭代的条件通常有以下几种:
    • 质心不再变化:新计算的质心与上一次的质心完全相同(或差异小于某个极小阈值),说明聚类已经收敛。
    • 达到最大迭代次数:设置一个最大迭代次数(如 100 次),避免算法陷入无限循环。
    • 簇分配不再变化:所有数据点的簇分配在两次迭代之间没有改变。

📌 注意

  • 条件1~3满足任一即停止,条件4是 强制终止 的保底策略
  • 条件1与2不等价:质心微小移动可能不引起重新分配,但SSE仍在优化。
Kmeans 算法实现代码
import numpy as np
import matplotlib.pyplot as pltdef kmeans(X, K, max_iterations=100):"""K-means聚类算法实现参数:X: 输入数据,形状为(n_samples, n_features)K: 聚类的数量max_iterations: 最大迭代次数返回:centroids: 最终的质心坐标,形状为(K, n_features)labels: 每个数据点的聚类标签,形状为(n_samples,)"""# 1. 随机初始化质心:从输入数据中随机选择K个点作为初始质心# replace=False# 表示抽样时不允许重复选择同一个元素,确保每次选择的索引都是唯一的。centroids = X[np.random.choice(len(X), K, replace=False)]for iteration in range(max_iterations):# 2. 分配数据点到最近的质心# 计算每个数据点到每个质心的欧氏距离# np.linalg.norm:计算向量的范数(默认是欧氏范数,即平方和开根号)distances = np.array([np.linalg.norm(X - centroid, axis=1) for centroid in centroids])# 为每个数据点分配最近质心的索引作为聚类标签# NumPy 中用于查找数组中最小值索引的函数调用,在 Kmeans 算法中用于将每个数据点分配到最近的质心。labels = np.argmin(distances, axis=0)# 3. 更新质心:计算每个簇内所有点的平均值作为新质心new_centroids = np.array([X[labels == k].mean(axis=0) for k in range(K)])# 检查停止条件:如果新旧质心之间的差异小于阈值,则认为算法收敛# np.allclose(centroids, new_centroids) 是 NumPy 中用于比较两个数组是否几乎相等的函数,在 Kmeans 算法中用于判断聚类是否收敛。if np.allclose(centroids, new_centroids):print(f"Converged after {iteration+1} iterations")breakcentroids = new_centroidsreturn centroids, labels# 生成示例数据:创建3个不同的高斯分布数据集
np.random.seed(42)  # 设置随机种子,确保结果可重现
X = np.vstack([np.random.normal([0, 0], 1, size=(100, 2)),    # 第一个簇:均值[0,0],标准差1np.random.normal([5, 5], 1, size=(100, 2)),    # 第二个簇:均值[5,5],标准差1np.random.normal([10, 0], 1, size=(100, 2))    # 第三个簇:均值[10,0],标准差1
])# 运行Kmeans算法,将数据聚为3类
K = 3
centroids, labels = kmeans(X, K)# 可视化聚类结果
plt.figure(figsize=(8, 6))
# 绘制数据点,使用不同颜色表示不同的簇
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.6)
# 绘制最终的质心位置,使用红色X标记
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=200, marker='X')
plt.title('Kmeans Clustering Results')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

在这里插入图片描述

在这里插入图片描述


⚠️ 四、面试常见扩展问题

1. K值如何选择?
  • 肘部法则(Elbow Method):绘制K-SSE曲线,选SSE骤降点。
  • 轮廓系数(Silhouette Score):衡量簇内紧密度与簇间分离度,接近1表示聚类合理。
2. 初始质心影响结果吗?
  • 随机初始化可能导致局部最优。
  • 改进方案:K-Means++,通过概率分布选择分散的初始质心。
3. 算法缺陷与改进
  • 缺陷对异常值敏感、假设簇为球形分布、依赖K值预设
  • 改进
    • 异常值处理:离群点检测(如DBSCAN)
    • 非球形簇:谱聚类或核K-Means。

💎 五、总结与面试回答要点

  • 原理EM框架下的交替优化(分配点 → 更新质心)
  • 停止条件质心稳定/簇分配不变/SSE收敛/达到最大迭代次数
  • 考点延伸
    • 结合RFM模型解释K-Means应用(用户分层场景)。
    • 时间复杂度: O ( K ⋅ n ⋅ d ) O(K \cdot n \cdot d) O(Knd)(n样本数,d特征数,K簇数)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87347.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

209、长度最小的子数组

题目&#xff1a; 解答&#xff1a; 滑动窗口&#xff0c;左右指针指向窗口两端&#xff0c;窗口为[left,right]&#xff0c;leftright时窗口只包含一个元素。 窗口内元素和sum>target时&#xff0c;left,推出左侧一个元素;sum<target时&#xff0c;right&#xff0c;加…

关机精灵——自动化与便利性

文章目录 背景目标实现下载 背景 自动化与便利性&#xff1a; 让电脑在用户无需值守或干预的情况下&#xff0c;在特定时间点&#xff08;倒计时结束&#xff09;或任务完成后自动关闭。节能与环保&#xff1a; 避免电脑在完成工作后或无人使用时继续空耗电力。时间管理与健康…

L2CAP协议详解:分段重组、QoS控制与多协议复用设计(面试宝典)

本文系统解析L2CAP协议的知识图谱&#xff0c;掌握面试核心考点&#xff0c;并通过真题演练提升实战能力。建议配合协议分析工具进行抓包实践&#xff0c;加深对协议机制的理解。 一、L2CAP 在蓝牙协议栈中的核心定位 L2CAP&#xff08;Logical Link Control and Adaptation P…

微软服务器安全问题

微软云服务器安全深度解析&#xff1a;挑战、应对与未来展望——构建韧性“安全之盾”的持续博弈&#xff01; 在当今数字化时代&#xff0c;云计算已成为众多企业和组织运行业务的核心基础设施和“数字生命线”&#xff0c;而微软云&#xff08;Azure&#xff09;作为全球领先…

后台管理系统的诞生 - 利用AI 1天完成整个后台管理系统的微服务后端+前端

AI创作系列(11)&#xff1a;后台管理系统的诞生 - 利用AI 1天完成整个后台管理系统的微服务后端前端 真实记录&#xff1a;我决定为海狸IM添加一个后台管理系统。从早上开始&#xff0c;到晚上结束&#xff0c;仅仅1天时间&#xff0c;我就完成了整个后台管理系统的微服务后端和…

开发自动驾驶系统所需工具

硬件开发平台 传感器系统 环境感知工具包括&#xff1a; 激光雷达&#xff1a;通过发射激光脉冲并接收反射光来测量距离&#xff0c;构建点云数据以描绘周围环境的三维结构。例如&#xff0c;Velodyne的VLP-16激光雷达每秒可发射约30万次激光脉冲&#xff0c;生成高密度的点…

Node.js特训专栏-实战进阶:12. 数据库事务处理与并发控制

🔥 欢迎来到 Node.js 实战专栏!在这里,每一行代码都是解锁高性能应用的钥匙,让我们一起开启 Node.js 的奇妙开发之旅! Node.js 特训专栏主页 专栏内容规划详情 数据库事务处理与并发控制:原理、实践与性能优化 一、事务基础:ACID特性与实现原理 1.1 ACID特性详解 事…

计算机网络(五)数据链路层 MAC和ARP协议

目录一、链路二、MAC地址三、ARP协议ARP工作流程​&#xff1a;​一、链路链路&#xff1a;一个结点到相邻结点的物理线路数据链路&#xff1a;在链路的基础上增加一些必要的软件&#xff08;协议的实现&#xff09;和硬件&#xff08;网络适配器&#xff09;。网络中的主机、路…

DVWA SQL Injection 漏洞分析与利用

前言 Level: Low 漏洞分析 复现步骤 防御措施 Level: Medium 漏洞分析 mysql_real_escape_string()核心作用 示例对比 复现步骤 防御措施 Level: High 漏洞分析 复现步骤 防御措施 Level: Impossible 安全措施分析 防护要点 测试验证 自动化工具使用&#x…

RabbitMQ:消息队列的轻量级王者

&#x1f680; 一句话定位 RabbitMQ是分布式系统的"消息快递员"&#xff0c;负责在系统间可靠传递信息&#xff0c;让服务解耦更高效。 &#x1f31f; 核心应用场景 1. 异步解耦 场景&#xff1a;用户注册后发短信/邮件 用法&#xff1a;注册服务发消息 → Rabbit…

Android系统默认赋予浏览器权限以及Android恶意覆盖导致谷歌浏览器授权失败的解决办法

Android系统默认赋予浏览器权限以及Android恶意覆盖导致谷歌浏览器授权失败的解决办法 一、Android系统默认赋予浏览器权限 只要是设计到默认赋权&#xff0c;就在framework下找这个类&#xff1a;base/services/core/java/com/android/server/pm/permission/DefaultPermissi…

矩阵的秩 线性代数

定义和求法 关于秩的几个重要式子 例题 给出秩&#xff0c;那我们就有三个知识点&#xff0c;一个是用定义&#xff0c;一个是用求法&#xff0c;一个是重要式子。 题目没什么好翻译的&#xff0c;基本就是赤裸裸的跟你坦白了直说了。 接下来就是解法了。用定义的话就是说这个…

【大模型】基于MCP的mysql 服务构建及使用(python语言)

前言 ​ 在之前使用dify来编排AI智能体&#xff0c;有这样的一个场景&#xff0c;希望智能体能自动读取数据库数据&#xff0c;获得统计数据&#xff08;问数&#xff09;&#xff0c;最终生成报告。 ​ 当时实现思路是&#xff0c;通过知识库告诉大模型相关表的字段定义&…

OA退位,如何打造安全便捷的跨网文件传输与即时通讯平台?

随着医院信息化建设深入推进&#xff0c;OA 系统在日常流程审批和文件流转中扮演着不可或缺的角色。然而&#xff0c;面对“内网⇄外网”强隔离的安全要求&#xff0c;OA 在跨域传输上仍然存在审批延迟、人工干预、病毒风险等痛点。 一、OA 在跨网传输中的 “ 最后一公里 ” 难…

LlamaIndex的多轮对话引擎使用说明

一、背景 LlamaIndex提供2种交互引擎&#xff1a;查询引擎和聊天引擎。&#xff08;详情请看这里&#xff09;查询引擎默认没有上下文信息&#xff0c;也就是说默认是单轮对话。 在RAG系统中&#xff0c;单轮对话/单次查询的场景较少&#xff0c;而多轮对话则是最常见的场景&…

【CSS-14.1-全局样式表common.css】构建高效可维护的 common.css:现代前端CSS架构指南

在前端开发中&#xff0c;CSS管理一直是项目可维护性的关键挑战。据统计&#xff0c;约35%的样式问题源于缺乏统一的CSS架构规范。common.css&#xff08;或称全局样式表&#xff09;作为项目的基础样式层&#xff0c;能够有效解决以下问题&#xff1a; 样式碎片化&#xff1a…

laravel基础:php artisan make:model Flight --all 详解

在 Laravel 中执行命令: php artisan make:model Flight --all这个命令会为你创建与模型 Flight 相关的一整套文件结构。Laravel 的 Artisan 命令行工具是一个强大的代码生成器,可以帮助你快速生成常见的应用组件。我们来详细解析一下这个命令的各个部分以及它产生的效果。 …

poi java 删除word的空白页

开发的时候遇到的问题&#xff0c;特此记录一下 使用Apache POI&#xff08;Java库&#xff09;删除Word文档中的空白页时&#xff0c;需针对不同场景处理。以下是具体实现方法和代码示例&#xff1a; 基础删除&#xff08;段落/分页符&#xff09;‌ 通过删除多余段落标记或…

获取Android应用日志教程

ADB&#xff0c;全称为Android Debug Bridge&#xff0c;是Android开发中一个重要的命令行工具。它用于与Android设备进行通信&#xff0c;提供了多种功能来帮助开发者进行调试和应用管理。 一、环境准备 1.PC下载附件中的安装包。 2.在设备上启用开发者选项和 USB 调试 在安卓…

【Axum】Rust Web 高效构建:Axum 框架从入门到精通指南

目录 一、环境准备与项目创建1.1 安装 Rust 工具链1.2 创建项目并添加依赖 二、Axum 核心架构解析三、项目结构设计四、核心代码实现4.1 应用入口 (src/main.rs)4.2 数据模型 (src/models.rs)4.3 路由配置 (src/routes.rs)4.4 认证服务 (src/services/auth.rs)4.5 用户处理器 (…