吴恩达强化学习复盘(2)K-Means初始化|K的选择|算法优化
K-Means初始化
K-Means 算法的第一步是随机选择位置作为初始聚类中心(new one through newk),但如何进行随机猜测是需要探讨的问题。一般需要多次尝试初始猜测,以期望找到更好的聚类结果。
K 值选择及初始聚类中心选取方法
- K 值选择原则:运行 K-Means 算法时,通常应选择类的数量 K 小于训练示例数量 M。因为若 K 大于 M,将没有足够的训练样本保证每个类中心至少有一个训练样本。例如之前的例子中 K 等于 2,M 等于 30。
- 初始聚类中心选取:最常用的选择聚类中心的方法是从训练样例中随机选取 K 个训练样本,将这些样本的位置作为初始聚类中心。如在一个训练集中随机选两个样本,分别设置为两个类的中心(假设 K = 2)。之前视频中采用的随机点初始化类中心的方法与这里不同,这里介绍的从训练样本中选取的方法更为常用。
随机初始化对聚类结果的影响
不同的随机初始化可能导致不同的聚类结果。在一个有三个簇的数据集示例中,一种随机初始化可能得到较好的聚类结果,将数据很好地聚成三个不同的簇;但另一种初始化可能导致较差的结果,陷入局部最优。例如,若在某组点中初始化两个类中心,在另一组点中初始化一个类中心,运行 K-Means 后得到的聚类效果不佳,此时算法试图最小化的畸变函数(成本函数 J)陷入了局部最小值。不同的随机初始化还可能产生其他不理想的局部最优聚类情况。
多次随机初始化优化策略
- 策略原理:为了增加找到全局最优或更好局部最优的机会,可以多次运行 K-Means 算法,每次使用不同的随机初始化。例如运行三次 K-Means 算法得到三个不同的聚类结果,通过计算这三个结果对应的成本函数 J,选择成本函数 J 最小的那个聚类结果,因为该结果中聚类中心到对应类中样本的距离平方和相对较小,即畸变最小。
- 具体算法步骤:若要进行 100 次随机初始化,需按如下步骤操作。首先,使用从训练样本中选取 K 个样本作为初始聚类中心的方法,进行 100 次随机初始化;然后,基于每次的随机初始化运行 K-Means 算法直至收敛,得到相应的类分配和聚类中心;最后,计算每次运行得到的结果的成本函数,选择成本最低的那组聚类结果作为最终结果。
- 运行次数建议:实际应用中,运行次数通常在 50 到 1000 次之间。运行次数超过 1000 次计算成本会过高,且收益递减;而尝试至少 50 或 100 次随机初始化,往往能比仅进行一次随机初始化获得更好的结果,更有可能避免陷入较差的局部最小值,找到更好的聚类效果。作者在使用 K-Means 算法时,几乎总是采用多个随机初始化的方法,因为这样能更好地最小化畸变成本函数,为聚类找到更好的聚类中心选择。
K值的选择
K 值选择的模糊性
K-Means 算法需要输入一个参数 K,即期望找到的类(簇)的数量。然而,在很多聚类问题中,确定合适的 K 值是比较困难的,因为对于同一个数据集,不同的人可能会认为存在不同数量的类,且都有其合理性。这是因为聚类属于无监督学习算法,没有特定的标签作为正确答案来指导聚类,数据本身也往往无法明确指示其中包含的类的数量。例如,对于某一数据集,很难确定它是包含两个、四个还是三个簇。
选择 K 值的方法 —— 肘部法
- 方法原理:学术文献中有一些自动选择聚类数的技术,其中一种常见的方法是肘部法(elbow method)。该方法通过使用不同的 K 值运行 K-Means 算法,然后绘制畸变函数(成本函数 J)关于簇数 K 的函数曲线。当簇数较少(如只有一个簇)时,成本函数 J 的畸变值较高,随着簇数增加,畸变值会下降。
- 判断依据:肘部法的核心是观察曲线是否存在一个 “肘部”,即曲线在某点之前下降速度较快,之后下降速度变慢。如果出现这样的 “肘部”,则可以选择 “肘部” 对应的 K 值作为合适的聚类数。例如,若曲线显示在达到三个聚类之前,成本函数下降迅速,之后下降变缓,那么可以选择 K = 3。但作者个人很少使用这种方法,因为在许多应用中,成本函数曲线往往是平滑递减的,没有明显的 “肘部”。
错误的 K 值选择方法
选择 K 值以最小化成本函数 J 不是一个可行的方法。因为增加类的数量几乎总是会使成本函数 J 降低,这样会导致几乎总是选择最大可能的 K 值,无法得到有意义的聚类结果。
实际应用中 K 值的选择
- 依据下游目的选择:在实际应用中,通常是为了实现某个后续或下游的目的而运行 K-Means 算法进行聚类。因此,建议根据 K-Means 算法在实现该下游目的时的表现来评估和选择 K 值。
- T 恤尺寸示例:以 T 恤尺寸为例,在数据集上运行 K-Means 算法可以找到不同数量的簇,如三个簇可对应小、中、大三种 T 恤尺码,五个簇可对应特小、小、中、特大、大等尺码。选择三个簇还是五个簇,需要综合考虑 T 恤业务中的各种因素,如 T 恤的合身程度(更多尺码可能使合身度更好)和制造与运输成本(制造和运输更多种类的 T 恤成本更高)。通过运行 K-Means 算法得到不同 K 值(如 K = 3 和 K = 5)的聚类结果,权衡这些因素来决定对 T 恤业务最有意义的 K 值。
- 图像压缩应用:在程序练习中,K-Means 算法可应用于图像压缩。在这种应用中,存在压缩图像质量(图像看起来的好坏程度)和压缩程度(图像大小)之间的权衡。可以根据这种权衡,手动决定基于期望的图像质量和压缩大小的最佳 K 值。
成本函数的优化
监督学习算法提出一个成本函数,然后使用梯度下降法(Greater Descent)或其他方法来优化该成本函数。作为非监督算法的K-Means 同样在优化一个特定的成本函数,尽管其优化算法不是梯度下降法。K-Means 算法的核心目标是最小化样本点到其所属聚类中心的距离平方和,这个距离平方和也就是畸变函数(distortion function),它是 K-Means 算法的优化目标。
优化公式的定义
假设我们有 m 个样本 ,每个样本
是一个 n 维向量,要将这些样本划分为 K 个聚类。用
表示样本
所属的聚类编号(
),
表示第 k 个聚类的中心(也是一个 n 维向量)。那么,K-Means 算法的优化目标就是最小化畸变函数 J,其公式如下:
其中:
表示样本
到其所属聚类中心
的欧氏距离的平方。
是所有样本到其所属聚类中心的距离平方和。
是为了取平均值,使得畸变函数的值与样本数量无关,便于比较不同数据集上的聚类效果。
优化步骤
K-Means 算法通过迭代的方式来逐步优化畸变函数 J,主要分为两个步骤:
分配步骤(Assignment Step)
固定聚类中心 ,更新每个样本的所属聚类
,使得畸变函数 J 最小化。具体来说,对于每个样本
,将其分配到距离最近的聚类中心所属的聚类中,即:
其中, 表示使得后面的表达式取得最小值的 k 值。
更新步骤(Update Step)
固定每个样本的所属聚类 ,更新每个聚类的中心
,使得畸变函数 J 最小化。具体来说,对于每个聚类 k,将其中心更新为该聚类中所有样本的均值,即:
其中, 表示所有属于聚类 k 的样本的总和,
表示属于聚类 k 的样本数量。
Python 代码示例
下面是一个简单的 Python 代码示例,用于更直观解释 K-Means 算法并优化畸变函数
import numpy as npdef kmeans(X, K, max_iterations=100):# 随机初始化聚类中心indices = np.random.choice(len(X), K, replace=False)centroids = X[indices]for _ in range(max_iterations):# 分配步骤distances = np.array([np.linalg.norm(X - centroid, axis=1) for centroid in centroids])labels = np.argmin(distances, axis=0)# 更新步骤new_centroids = np.array([X[labels == k].mean(axis=0) for k in range(K)])# 判断是否收敛if np.allclose(centroids, new_centroids):breakcentroids = new_centroidsreturn labels, centroids# 示例数据
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
K = 2# 运行K-Means算法
labels, centroids = kmeans(X, K)
print("聚类标签:", labels)
print("聚类中心:", centroids)
相关文章:
吴恩达强化学习复盘(2)K-Means初始化|K的选择|算法优化
K-Means初始化 K-Means 算法的第一步是随机选择位置作为初始聚类中心(new one through newk),但如何进行随机猜测是需要探讨的问题。一般需要多次尝试初始猜测,以期望找到更好的聚类结果。 K 值选择及初始聚类中心选取方法 K 值…...
SQL优化案例分享 | PawSQL 近日推出 Lateral Join 重写优化算法
一、Lateral 查询语法介绍 Lateral 查询是SQL中的一种连接方式,它允许FROM子句中的子查询引用同一FROM子句中前面的表的列。虽然这种特性提供了强大的表达能力,但在某些场景下可能导致性能问题。PawSQL优化器近日实现了一种针对特定类型Lateral Join的重…...
电子电器架构 ---软件定义汽车的电子/电气(E/E)架构
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...
ONLYOFFICE协作空间3.1发布:虚拟数据房间中基于角色的表单填写、房间模板、改进访客管理等
全新升级的 ONLYOFFICE 协作空间有着约 40 项新功能和改进,将您的文档协作和管理体验提升到全新高度。阅读本文,了解所有优化功能。 关于 ONLYOFFICE ONLYOFFICE 是一个国际开源项目,专注于高级和安全的文档处理,可提供文本文档、…...
Docker如何更换镜像源提高拉取速度
在国内,由于网络政策和限制,直接访问DockerHub速度很慢,尤其是在拉取大型镜像时。为了解决这个问题,常用的方法就是更换镜像源。本文将详细介绍如何更换Docker镜像源,并提供当前可用的镜像源。 换源方法 方法1&#x…...
深入理解 HTML5 Web SQL 数据库:用法、现状与替代方案
一、引言 在 Web 开发的领域中,客户端存储一直是一个关键的话题。HTML5 带来了多种客户端存储的解决方案,其中 Web SQL 数据库曾经是一个备受关注的选项。尽管如今它已被废弃,但了解其原理、使用方法以及为何被替代,对于 Web 开发者来说仍然具有重要的意义。本文将深入探讨…...
【C++教程】C++中为什么优先使用 cout/cin流
在 C 中,优先使用 cout/cin 流而非 C 风格的 printf/scanf,主要出于以下设计理念和实际优势: 1. 类型安全(Type Safety) cout/cin 是类型安全的 流操作符(<< 和 >>)通过运算符重载自…...
示波器探头状态诊断与维护技术指南
一、探头性能劣化特征分析 信号保真度下降 ・时域表现:上升沿时间偏离标称值15%以上(如1ns探头测得≥1.15ns) ・频域特性:-3dB带宽衰减超过探头标称值20%基准稳定性异常 ・直流偏置电压漂移量>5mV(预热30分…...
【 Git 全局忽略文件完全指南:配置、规则与最佳实践】
Git 全局忽略文件完全指南:配置、规则与最佳实践 前言 在软件开发过程中,我们经常遇到一些不需要被版本控制系统追踪的文件,例如IDE配置文件、编译生成的中间文件、日志文件等。虽然可以在每个项目中创建.gitignore文件,但对于开…...
FreeRTOS互斥信号量解决优先级翻转实战教程
FreeRTOS互斥信号量解决优先级翻转实战教程 大家好!今天我们来深入探讨FreeRTOS中的优先级翻转问题,并通过互斥信号量来解决这个问题。上一篇文章我们已经了解了优先级翻转的现象,今天我们将动手实践,通过代码对比来直观感受互斥…...
第一篇:从哲学到管理——实践论与矛盾论如何重塑企业思维
引言:当革命哲学照亮现代商业 1937年,毛泽东在战火中写就的《实践论》《矛盾论》,为中国共产党提供了认识世界的方法论。今天,这两部著作正成为企业破解管理困局的“思维操作系统”: 战略模糊:据Gartner统…...
14.电容的高频特性在EMC设计中的应用
电容的高频特性在EMC设计中的应用 1. 电容自谐振频率特性对EMC的作用2. 退耦电容的选型3. Y电容选型注意事项4. 储能电容与电压跌落的瞬时中断5. 穿心电容对EMC滤波的作用 1. 电容自谐振频率特性对EMC的作用 电容的高频特性等效模型如下: 其自谐振成因如下&#x…...
网络编程4
day4 一、Modbus 1.分类 (1).Modbus RTU: 运行在串口上的协议,采用二进制表现形式以及紧凑型数据结构,通信效率高,应用广泛。(2).Modbus ASCII: 运行在串口上的协议,采用ASCII码传输,并且利用特殊字符作为其字节的开始…...
Java 性能优化:如何利用 APM 工具提升系统性能?
Java 性能优化:如何利用 APM 工具提升系统性能? 在当今竞争激烈的软件开发领域,系统性能至关重要。随着应用规模的扩大和用户需求的增加,性能问题逐渐凸显,这不仅影响用户体验,还可能导致业务损失。而 APM…...
AI音乐解决方案:1分钟可切换suno、udio、luno、kuka等多种模型,suno风控秒切换 | AI Music API
你有没有觉得,suno风控来了,就要停服了? 你有没有觉得,对接多种音乐模型,让你很疲乏? 你有没有觉得,音乐模型,中文咬字不清楚,让你很苦恼? 别怕࿰…...
一键升级OpenSSH/OpenSSL修复安全漏洞
在服务器安全运维过程中,我们经常面临这样的问题:收到高危漏洞通报(如最近的OpenSSH多个CVE漏洞),但Ubuntu系统无法通过apt直接升级到修复版本。这种情况下,传统方法需要手动编译源码,处理依赖关…...
健康养生,开启新生活
在饮食上,应遵循 “均衡搭配、清淡少盐” 的原则。主食不要只吃精米白面,可适当加入燕麦、糙米等全谷物,为身体补充膳食纤维;每天保证一斤蔬菜半斤水果,深色蔬菜如菠菜、西兰花富含维生素与矿物质,水果则选…...
VLAN间通讯技术
多臂路由 路由器使用多条物理线路,每条物理线路充当一个 VLAN 的网管 注意:路由器对端的交换机接口,需要设定 Access 类型,因为路由器的物理接口无法处理 VLAN 标签 。 单臂路由 使用 以太网子接口 (sub-interface) 实现。 …...
利用Stream和OpenAI构建基于RAG的AI客服聊天机器人
利用Stream和OpenAI构建基于RAG的AI客服聊天机器人 尽管大语言模型经过海量数据训练,但其领域专业知识仍有限。这一局限使其在需要特定数据的客服聊天机器人等应用中表现欠佳。 检索增强生成(RAG)通过让大语言模型访问外部知识源来生成更精准的响应,有效解决了这一问题。…...
Easysearch Rollup 相比 OpenSearch Rollup 的优势分析
背景 在处理时序数据时,Rollup 功能通过数据聚合显著降低存储成本,并提升查询性能。Easysearch 与 OpenSearch 均提供了 Rollup 能力,但在多个关键维度上,Easysearch Rollup 展现出更优的表现。本文将从查询体验、索引管理、聚合…...
如何远程访问家中服务器-FRP内网穿透详细
💡 本文会带给你 如何远程访问家中服务器FRP自动运行的方法一、准备工作 准备一台具备公网 IP 的服务器(如阿里云、腾讯云等云服务器,要求不高,几十块一年服务的轻型服务就行),用于部署 FRP 服务端(frps)。 家中电脑(内网设备),用于运行 FRP 客户端(frpc)。 下…...
EMIF详解
一、EMIF的基本定义 EMIF(External Memory Interface,外部存储器接口) 是嵌入式处理器(如DSP、FPGA、SoC)用于连接外部存储器的专用硬件接口模块,负责管理处理器与存储器之间的地址/数据总线、控制信号及时…...
人工智能在慢病管理中的具体应用全集:从技术落地到场景创新
一、AI 赋能慢病管理:技术驱动医疗革新 1.1 核心技术原理解析 在当今数字化时代,人工智能(AI)正以前所未有的态势渗透进医疗领域,尤其是在慢性病管理方面,展现出巨大的潜力和独特优势。其背后依托的机器学习、深度学习、自然语言处理(NLP)以及物联网(IoT)与可穿戴设…...
B+树节点与插入操作
B树节点与插入操作 设计B树节点 在设计B树的数据结构时,我们首先需要定义节点的格式,这将帮助我们理解如何进行插入、删除以及分裂和合并操作。以下是对B树节点设计的详细说明。 节点格式概述 所有的B树节点大小相同,这是为了后续使用自由…...
4.20刷题记录(单调栈)
第一部分:简单介绍 单调栈我的理解是在栈中存储数字出现的位置,然后通过遍历比较当前栈顶元素与当前元素的大小关系,从而确定逻辑相关顺序。 第二部分:真题讲解 (1)739. 每日温度 - 力扣(Lee…...
线性回归之多项式升维
文章目录 多项式升维简介简单案例实战案例多项式升维优缺点 多项式升维简介 多项式升维(Polynomial Expansion)是线性回归中一种常用的特征工程方法,它通过将原始特征进行多项式组合来扩展特征空间,从而让线性模型能够拟合非线性关…...
【上位机——MFC】运行时类信息机制
运行时类信息机制的使用 类必须派生自CObject类内必须添加声明宏DECLARE_DYNAMIC(theClass)3.类外必须添加实现宏 IMPLEMENT_DYNAMIC(theClass,baseClass) 具备上述三个条件后,CObject::IsKindOf函数就可以正确判断对象是否属于某个类。 代码示例 #include <…...
POSIX多线程,解锁高性能编程
在计算机编程的广阔领域中,POSIX 标准就像是一把通用的钥匙,开启了跨平台编程的大门。POSIX,即 Portable Operating System Interface(可移植操作系统接口) ,是 IEEE 为了规范各种 UNIX 操作系统提供的 API…...
利用TCP+多进程技术实现私聊信息
服务器: import socket from multiprocessing import Process from threading import Threaduser_dic {}def send_recv(client_conn, client_addr):while 1:# 接收客户端发送的消息res client_conn.recv(1024).decode("utf-8")print("客户端发送…...
颠覆传统!毫秒级响应的跨平台文件同步革命,远程访问如本地操作般丝滑
文章目录 前言1. 安装Docker2. Go File使用演示3. 安装cpolar内网穿透4. 配置Go File公网地址5. 配置Go File固定公网地址 前言 在这个信息爆炸的时代,谁不曾遭遇过类似的窘境呢?试想,当你正于办公室中埋首案牍时,手机突然弹出一…...
