学习日记_20241110_聚类方法(K-Means)
前言
提醒:
文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。
其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展及意见建议,欢迎评论区讨论交流。
文章目录
- 前言
- 聚类算法
- 经典应用场景
- K-Means 聚类
- 简单实例(函数库实现)
- 数学表达
- K-Means 算法步骤
- 数学优化目标
- 收敛性
- 优点
- 缺点
- 手动实现
- 代码分析
聚类算法
聚类算法在各种领域中有广泛的应用,主要用于发现数据中的自然分组和模式。以下是一些常见的应用场景以及每种算法的优缺点:
经典应用场景
-
市场细分:根据消费者的行为和特征,将他们分成不同的群体,以便进行有针对性的营销。
-
图像分割: 将图像划分为多个区域或对象,以便进行进一步的分析或处理。
-
社交网络分析:识别社交网络中的社区结构。
-
文档分类:自动将文档分组到不同的主题或类别中。
-
异常检测识别数据中的异常点或异常行为。
-
基因表达分析:在生物信息学中,根据基因表达模式对基因进行聚类。
K-Means 聚类
- K-Means 聚类
- 优点:
- 算法简单,容易实现。
- 计算速度快,适用于大规模数据集。
- 缺点:
- 需要预先指定簇的数量 K K K。
- 对于初始中心点选择敏感。
- 只能找到球状簇,无法处理非凸形状的簇。
- 对噪声和异常值敏感。
简单实例(函数库实现)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# 生成数据
X = np.random.rand(100, 2)
# K-Means 聚类
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
labels = kmeans.labels_
# 可视化
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], color='red')
plt.title('K-Means Clustering')
plt.show()
X数据分布:
代码运行结果:
数学表达
K-Means 聚类是一种常用的无监督学习算法,目的是将数据分为 K K K 个簇,以最小化簇内数据点与簇中心的方差之和。下面是对
K-Means 聚类算法的详细介绍,包括其数学公式和步骤。K-Means 算法步骤
初始化
从数据集中随机选择 K K K 个点作为初始簇中心(质心),记作 { μ 1 , μ 2 , … , μ K } \{\mu_1, \mu_2, \ldots, \mu_K\} {μ1,μ2,…,μK}。
分配数据点
对于每个数据点 x i \mathbf{x}_i xi,计算其与每个簇中心的距离,将其分配到距离最近的簇中。通常采用欧氏距离作为距离度量:
assign x i to cluster j = arg min k ∥ x i − μ k ∥ 2 \text{assign } \mathbf{x}_i \text{ to cluster } j = \arg\min_{k} \|\mathbf{x}_i - \mu_k\|^2 assign xi to cluster j=argkmin∥xi−μk∥2
更新簇中心
对于每个簇 j j j,计算簇中所有数据点的均值作为新的簇中心:
μ j = 1 N j ∑ x i ∈ C j x i \mu_j = \frac{1}{N_j} \sum_{\mathbf{x}_i \in C_j} \mathbf{x}_i μj=Nj1xi∈Cj∑xi
其中 C j C_j Cj 表示簇 j j j 中的所有数据点, N j N_j Nj 是簇 j j j 中的点的数量。
重复
重复步骤 2 和步骤 3,直到簇中心不再发生变化或达到预设的迭代次数。
数学优化目标
K-Means 聚类的目标是最小化所有数据点到其所属簇中心的距离平方和。其优化目标函数为:
J = ∑ j = 1 K ∑ x i ∈ C j ∥ x i − μ j ∥ 2 J = \sum_{j=1}^{K} \sum_{\mathbf{x}_i \in C_j} \|\mathbf{x}_i - \mu_j\|^2 J=j=1∑Kxi∈Cj∑∥xi−μj∥2
这里, J J J 是代价函数,表示簇内平方误差和。
收敛性
K-Means 算法通过交替优化分配和更新步骤最终收敛,因为每一步都使得代价函数 J J J单调递减。然而,算法可能收敛到局部最小值,因此初始化方式对最终结果有较大影响。
优点
- 实现简单,计算速度快。
- 在簇形状是凸的、簇的大小相似的情况下效果较好。
缺点
- 选择 K K K 值比较困难,通常需要通过经验或使用评估指标(如肘部法则、轮廓系数)来选择。
- 对初始值敏感,可能导致收敛到局部最优。
- 适用于凸形簇,对于不同大小和密度的簇效果不好。
- 对噪声和孤立点敏感。
K-Means 聚类是一种简单有效的聚类方法,广泛应用于各种实际问题,但在使用中需注意其局限性和对参数选择的要求。
手动实现
import numpy as npdef initialize_centroids(X, K):# 从数据集中随机选择K个样本作为初始质心indices = np.random.choice(X.shape[0], K, replace=False)centroids = X[indices]return centroidsdef assign_clusters(X, centroids):# 计算每个样本到每个质心的距离,并将样本分配到最近的质心distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))return np.argmin(distances, axis=0)def update_centroids(X, labels, K):# 根据分配结果更新质心为每个簇中所有样本的均值centroids = np.array([X[labels == k].mean(axis=0) for k in range(K)])return centroidsdef kmeans(X, K, max_iters=100, tol=1e-4):# 初始化质心centroids = initialize_centroids(X, K)for i in range(max_iters):# 分配样本到最近的质心labels = assign_clusters(X, centroids)# 计算新的质心new_centroids = update_centroids(X, labels, K)# 检查质心是否收敛if np.all(np.abs(new_centroids - centroids) < tol):breakcentroids = new_centroidsreturn labels, centroids
# 示例用法
if __name__ == "__main__":# 生成一些测试数据X = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], [8.0, 8.0], [1.0, 0.6], [9.0, 11.0],[8.0, 2.0], [10.0, 2.0], [9.0, 3.0]])# 设定簇的数量K = 3# 运行K-Means算法labels, centroids = kmeans(X, K)print("Cluster labels:", labels)print("Centroids:", centroids)
代码分析
1.
np.random.choice(X.shape[0], K, replace=False)
numpy.random.choice(a, size=None, replace=True, p=None)
np.random.choice是 NumPy 库中的一个函数,用于从给定的一维数组中生成随机样本。它可以指定样本的数量、是否允许重复选择等参数。
2.np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))
centroids[:, np.newaxis]: 使用np.newaxis将centroids的形状从(K, n_features)变为(K, 1, n_features),这样做是为了实现广播(broadcasting),以便在后续计算中能够对每个质心与每个样本进行逐元素运算。X - centroids[:, np.newaxis]:这个操作会创建一个形状为(K, n_samples, n_features)的数组,表示每个质心与每个样本之间的差值。.sum(axis=2):这个操作会对最后一个维度(特征维度)进行求和,结果是一个形状为(K, n_samples)的数组,表示每个样本与每个质心之间的特征平方和。
np.argmin(distances, axis=0)
np.argmin是一个NumPy函数,用于找到数组中最小值的索引。axis=0表示沿着第一个轴(即行)查找最小值。这意味着对每个样本(每列)比较所有质心的距离,找到最小值对应的质心索引。
相关文章:
学习日记_20241110_聚类方法(K-Means)
前言 提醒: 文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。 其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展…...
解决Oracle DECODE函数字符串截断问题的深度剖析20241113
解决Oracle DECODE函数字符串截断问题的深度剖析 在使用Oracle数据库进行开发时,开发者可能会遇到一些令人困惑的问题。其中,在使用DECODE函数时,返回的字符串被截断就是一个典型的案例。本文将以学生管理系统为背景,深入探讨这个…...
开源模型应用落地-语音转文本-whisper模型-AIGC应用探索(二)
一、前言 语音转文本技术具有重要价值。它能提高信息记录和处理的效率,使人们可以快速将语音内容转换为可编辑、可存储的文本形式,方便后续查阅和分析。在教育领域,可帮助学生更好地记录课堂重点;在办公场景中,能简化会议记录工作。同时,该技术也为残障人士提供了便利,让…...
PHP框架 单一入口和多入口以及优缺点
在PHP框架中,单一入口和多入口是两种不同的应用架构设计方式,以下是关于这两者及其优缺点的详细解释: 一、单一入口 定义: 单一入口(Single Entry Point)指的是应用程序通过一个统一的文件(通…...
PhpSpreadsheet导出图片
PhpSpreadsheet导出图片 //导出public function pdf($ids){$jzInfo $this->model->where(id,$ids)->find();try {//巡检人员$staff_ids \app\admin\model\inspection\Plan::where(id,$jzInfo[plan_id])->value(staff_id);$staff_names \app\admin\model\inspect…...
AI 提示词(Prompt)入门 十:最佳实践|详细询问,提供细节!
1、原则解释 当与 ChatGPT 交流时,提供具体和详细的信息非常重要。 这样做可以帮助 ChatGPT 更准确地理解你的需求和上下文,从而生成更相关和有用的回答 明确的信息可以包括具体的问题背景、相关领域的说明、你所期望的答案类型等。 2、如何实践 明…...
web应用安全和信息泄露预防
文章目录 1:spring actuator导致的信息泄露1.1、Endpoint配置启用检测1.2、信息泄露复现1.3、防御 2:服务端口的合理使用3:弱口令(密码)管理4:服务端攻击4.1、短信业务,文件上传等资源型接口1、…...
《人工智能深度学习的基本路线图》
《人工智能深度学习的基本路线图》 基础准备阶段 数学基础: 线性代数:深度学习中大量涉及矩阵运算、向量空间等概念,线性代数是理解和处理这些的基础。例如,神经网络中的权重矩阵、输入向量的运算等都依赖于线性代数知识。学习内容…...
基于Java Springboot宠物猫售卖管理系统
一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据库:…...
力扣-Hot100-链表其三【算法学习day.36】
前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴&am…...
iOS逆向入门:使用theos注入第三方依赖库
背景 theos是一个跨平台的软件开发框架,常用于管理,开发和部署iOS项目,同时也是开发iOS越狱插件的主要工具。和MonkeyDev不同的是,它不依赖于xcode,可以在多个操作系统上运行。一个完整的iOS越狱开发流程包括…...
JavaScript 原型
JavaScript 的原型(Prototype)是其面向对象编程模型的核心概念之一,它决定了对象如何继承属性和方法。通过理解 JavaScript 的原型,你可以更好地理解对象之间的关系以及如何扩展对象功能。 核心概念 [[Prototype]](内部…...
力扣 LeetCode 20. 有效的括号(Day5:栈与队列)
解题思路: 使用栈 只有三种情况 1. ( [ { } ] ( ( 左括号多了 -> 最后栈中经过抵消会剩下括号 2. [ { ( ] } ] 括号不匹配 -> return false 3. [ { } ] ( ) ) ) 右括号多了 -> 未遍历完时,栈提前为空,…...
git使用及上线流程(仅为我工作中常用)
推荐软件或者直接终端 ⚠️注意:在确保远程和本地分支都可使用的情况下 git常见使用命令 ls---查看所有目录 pwd---本机密码 cd 目录名---进入目录 Touch ---创建文本文件 git status---查看状态 git branch---查看分支 git pull---拉取远程最新代码 git checkou…...
React Native 全栈开发实战班 - 打包发布之热更新
在完成 React Native 应用的开发与性能优化后,下一步就是将应用打包并发布到各大应用市场,如 Apple App Store 和 Google Play Store。本章节已经详细介绍了打包与发布的流程,包括 Android 和 iOS 平台的配置、打包步骤、签名配置以及发布到应…...
2024年11月16日 星期六 重新整理Go技术
今日格言 坚持每天进步一点点~ 一个人也可以是一个团队~ 学习全栈开发, 做自己喜欢的产品~~ 简介 大家好, 我是张大鹏, 今天是2024年11月16日星期六, 很高兴在这里给大家分享技术. 今天又是休息的一天, 做了很多的思考, 整理了自己掌握的技术, 比如Java, Python, Golang,…...
力扣第 55 题 跳跃游戏
力扣第 55 题 跳跃游戏(Jump Game)。题目要求判断一个非负整数数组中,是否能够从第一个位置跳跃到最后一个位置。每个元素表示从当前位置最多可以跳跃的步数。 解题思路 我们可以用 贪心算法 来解决这个问题。贪心的核心思想是始终维护当前…...
Golang | Leetcode Golang题解之第564题寻找最近的回文数
题目: 题解: func nearestPalindromic(n string) string {m : len(n)candidates : []int{int(math.Pow10(m-1)) - 1, int(math.Pow10(m)) 1}selfPrefix, _ : strconv.Atoi(n[:(m1)/2])for _, x : range []int{selfPrefix - 1, selfPrefix, selfPrefix …...
Spring Boot汽车资讯:科技与速度的交响
3系统分析 3.1可行性分析 通过对本汽车资讯网站实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本汽车资讯网站采用SSM框架,JAVA作为开发语言&#…...
从 IDC 到云原生:稳定性提升 100%,成本下降 50%,热联集团的数字化转型与未来展望
作者:金峰(项良)、朱永林、赵世振(寰奕) 公司简介 杭州热联集团股份有限公司成立于 1997 年 10 月,是隶属杭州市实业投资集团的国有控股公司。公司专业从事国际、国内钢铁贸易黑色大宗商品及产业服务&…...
半导体技术评估:如何判断新技术从概念到产品的“露点”
1. 开篇:从“露点”看半导体行业的虚实迷雾 大家好,我是Don Scansen。在半导体行业摸爬滚打了二十多年,从设计、验证到失效分析,几乎把产业链的各个环节都趟了一遍。今天,我想借这个新开的专栏,和大家聊聊一…...
004、TinyML技术栈全景图:从模型到部署
004 TinyML技术栈全景图:从模型到部署 去年冬天调试一个智能门磁项目,板子是STM32L4,Flash只有256KB。模型在PC上跑F1值0.97,烧进去直接死机——不是推理结果不对,是内存分配直接溢出。我盯着map文件看了三个小时,最后发现是TensorFlow Lite Micro的arena大小设错了,多…...
从协议到代码:用Python仿真5G NR下行同步全流程(含PBCH解码与MIB解析)
从协议到代码:用Python仿真5G NR下行同步全流程(含PBCH解码与MIB解析) 在通信系统设计中,下行同步是终端接入网络的第一步关键操作。5G新空口(NR)技术引入了更复杂的同步信号结构,这对算法工程师和研究人员提出了更高要…...
OpenAccess十年:EDA互操作性标准如何重塑芯片设计流程
1. 从愿景到现实:OpenAccess十年之路的深度复盘十年前,也就是2002年的12月,当Si2(硅集成倡议组织)首次向联盟成员发布OpenAccess 2.0时,恐怕没有多少人能预料到,这个源于半导体巨头内部需求的“…...
用Wireshark抓包实战解析USB控制传输:从SETUP包到ACK的完整流程
用Wireshark实战拆解USB控制传输:从设备枚举到数据交互的深度解析 当你第一次插入USB设备时,主机和设备之间究竟发生了什么?那些看似神秘的SETUP令牌包、DATA0数据包背后隐藏着怎样的通信逻辑?本文将带你用Wireshark这个"网络…...
MILCOM 2011技术风向:软件定义无线电、GaN与宽带测试的军用射频演进
1. 展会现场直击:MILCOM 2011的技术脉搏作为一名在射频微波和测试测量领域摸爬滚打了十几年的工程师,我对MILCOM(军事通信会议)这类展会总有一种特殊的感情。它不像那些消费电子展那样光鲜亮丽,人头攒动,但…...
别再只点保存了!QGIS工程文件.QGZ和.QGS到底怎么选?附XML结构详解
QGIS工程文件格式深度解析:.QGZ与.QGS的选择策略与XML实战指南 当你在QGIS中完成一幅精心设计的地图,点击保存按钮时,系统弹出的格式选择对话框可能让你陷入短暂的犹豫——该选择.QGZ还是.QGS?这个看似简单的选择背后,…...
艾尔登法环黑夜君临修改器2026.5.11最新中文汉化版免费下载 转存后自动更新 (看到请立即转存 资源随时失效)
在《艾尔登法环》的庞大世界观下,一款名为《艾尔登法环:黑夜君临》(ELDEN RING NIGHTREIGN)的衍生作品于 2025 年正式登场。它并非单纯的续作或大型 DLC,而是一款基于原作设定、专注于多人协作生存与浓缩化 RPG 体验的…...
测水位·报雨情·预洪水:水文监测站
水文监测站采用先进平面阵列雷达微波探测技术,设备悬空架设、非接触式采集河道水体数据。通过高精度雷达天线持续发射微波信号,穿透空气介质触达水面后反射回波,系统精准测算信号传播时长与多普勒频移变化,结合设备自带角度校准功…...
STM32H750调试KSZ8863翻车实录:从F4经验到H7的坑,硬件配置避雷指南
STM32H7与KSZ8863实战避坑指南:从F4经验到H7的硬件设计差异 调试以太网PHY芯片KSZ8863时,许多工程师会带着STM32F4的成功经验直接迁移到STM32H7平台,结果往往遭遇意想不到的硬件兼容性问题。本文将深入剖析两个平台在RMII接口设计上的关键差…...


