吴恩达强化学习复盘(2)K-Means初始化|K的选择|算法优化

news2025/4/22 11:53:50

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 个样本 \{x^{(1)}, x^{(2)}, \cdots, x^{(m)}\},每个样本 x^{(i)} 是一个 n 维向量,要将这些样本划分为 K 个聚类。用 c^{(i)} 表示样本 x^{(i)}所属的聚类编号(1 \leq c^{(i)} \leq K),\mu_k表示第 k 个聚类的中心(也是一个 n 维向量)。那么,K-Means 算法的优化目标就是最小化畸变函数 J,其公式如下:


J(c, \mu) = \frac{1}{m} \sum_{i=1}^{m} \left\| x^{(i)} - \mu_{c^{(i)}} \right\|^2

其中:

  • \left\| x^{(i)} - \mu_{c^{(i)}} \right\|^2 表示样本 x^{(i)} 到其所属聚类中心\mu_{c^{(i)}} 的欧氏距离的平方。
  • \sum_{i=1}^{m} \left\| x^{(i)} - \mu_{c^{(i)}} \right\|^2 是所有样本到其所属聚类中心的距离平方和。
  • \frac{1}{m} 是为了取平均值,使得畸变函数的值与样本数量无关,便于比较不同数据集上的聚类效果。

优化步骤

K-Means 算法通过迭代的方式来逐步优化畸变函数 J,主要分为两个步骤:

分配步骤(Assignment Step)

固定聚类中心 \mu_1, \mu_2, \cdots, \mu_K,更新每个样本的所属聚类 c^{(i)},使得畸变函数 J 最小化。具体来说,对于每个样本 x^{(i)},将其分配到距离最近的聚类中心所属的聚类中,即:


c^{(i)} = \arg\min_{k} \left\| x^{(i)} - \mu_k \right\|^2

其中,\arg\min_{k} 表示使得后面的表达式取得最小值的 k 值。

更新步骤(Update Step)

固定每个样本的所属聚类 c^{(1)}, c^{(2)}, \cdots, c^{(m)},更新每个聚类的中心 \mu_k,使得畸变函数 J 最小化。具体来说,对于每个聚类 k,将其中心更新为该聚类中所有样本的均值,即:


\mu_k = \frac{\sum_{i: c^{(i)} = k} x^{(i)}}{\left| \{ i: c^{(i)} = k \} \right|}

其中,\sum_{i: c^{(i)} = k} x^{(i)} 表示所有属于聚类 k 的样本的总和,\left| \{ i: c^{(i)} = k \} \right| 表示属于聚类 k 的样本数量。

Python 代码示例

下面是一个简单的 Python 代码示例,用于更直观解释 K-Means 算法并优化畸变函数

import numpy as np

def 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):
            break

        centroids = new_centroids

    return 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)    

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

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

    相关文章

    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…

    示波器探头状态诊断与维护技术指南

    一、探头性能劣化特征分析 信号保真度下降 ・时域表现:上升沿时间偏离标称值15%以上(如1ns探头测得≥1.15ns) ・频域特性:-3dB带宽衰减超过探头标称值20%基准稳定性异常 ・直流偏置电压漂移量>5mV(预热30分…

    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风控来了,就要停服了? 你有没有觉得,对接多种音乐模型,让你很疲乏? 你有没有觉得,音乐模型,中文咬字不清楚,让你很苦恼? 别怕&#xff0…

    一键升级OpenSSH/OpenSSL修复安全漏洞

    在服务器安全运维过程中,我们经常面临这样的问题:收到高危漏洞通报(如最近的OpenSSH多个CVE漏洞),但Ubuntu系统无法通过apt直接升级到修复版本。这种情况下,传统方法需要手动编译源码,处理依赖关…

    健康养生,开启新生活

    在饮食上,应遵循 “均衡搭配、清淡少盐” 的原则。主食不要只吃精米白面,可适当加入燕麦、糙米等全谷物,为身体补充膳食纤维;每天保证一斤蔬菜半斤水果,深色蔬菜如菠菜、西兰花富含维生素与矿物质,水果则选…

    VLAN间通讯技术

    多臂路由 路由器使用多条物理线路,每条物理线路充当一个 VLAN 的网管 注意:路由器对端的交换机接口,需要设定 Access 类型,因为路由器的物理接口无法处理 VLAN 标签 。 单臂路由 使用 以太网子接口 (sub-interface) 实现。 …

    人工智能在慢病管理中的具体应用全集:从技术落地到场景创新

    一、AI 赋能慢病管理:技术驱动医疗革新 1.1 核心技术原理解析 在当今数字化时代,人工智能(AI)正以前所未有的态势渗透进医疗领域,尤其是在慢性病管理方面,展现出巨大的潜力和独特优势。其背后依托的机器学习、深度学习、自然语言处理(NLP)以及物联网(IoT)与可穿戴设…

    B+树节点与插入操作

    B树节点与插入操作 设计B树节点 在设计B树的数据结构时,我们首先需要定义节点的格式,这将帮助我们理解如何进行插入、删除以及分裂和合并操作。以下是对B树节点设计的详细说明。 节点格式概述 所有的B树节点大小相同,这是为了后续使用自由…

    线性回归之多项式升维

    文章目录 多项式升维简介简单案例实战案例多项式升维优缺点 多项式升维简介 多项式升维(Polynomial Expansion)是线性回归中一种常用的特征工程方法,它通过将原始特征进行多项式组合来扩展特征空间,从而让线性模型能够拟合非线性关…

    颠覆传统!毫秒级响应的跨平台文件同步革命,远程访问如本地操作般丝滑

    文章目录 前言1. 安装Docker2. Go File使用演示3. 安装cpolar内网穿透4. 配置Go File公网地址5. 配置Go File固定公网地址 前言 在这个信息爆炸的时代,谁不曾遭遇过类似的窘境呢?试想,当你正于办公室中埋首案牍时,手机突然弹出一…

    CrewAI Community Version(一)——初步了解以及QuickStart样例

    目录 1. CrewAI简介1.1 CrewAI Crews1.2 CrewAI Flows1.3 Crews和Flows的使用情景 2. CrewAI安装2.1 安装uv2.2 安装CrewAI CLI 3. 官网QuickStart样例3.1 创建CrewAI Crews项目3.2 项目结构3.3 .env3.4 智能体角色及其任务3.4.1 agents.yaml3.4.2 tasks.yaml 3.5 crew.py3.6 m…

    Nginx下搭建rtmp流媒体服务 并使用HLS或者OBS测试

    所需下载地址: 通过网盘分享的文件:rtmp 链接: https://pan.baidu.com/s/1t21J7cOzQR1ASLrsmrYshA?pwd0000 提取码: 0000 window: 解压 win目录下的 nginx-rtmp-module-1.2.2.zip和nginx 1.7.11.3 Gryphon.zip安装包,解压时选…