当前位置: 首页 > article >正文

机器学习笔记:逆置换

1 介绍

  • 给定一个排列 p,它的逆置换(inverse permutation)是一个排列 invp,满足 invp[p[i]] = ip[invp[i]] = i 对所有 i 成立。

2 python实现

'''
计算一个排列的逆排列

给定一个排列 p,它的逆排列是一个排列 invp,满足 invp[p[i]] = i 和 p[invp[i]] = i 对所有 i 成立
'''
def invpermute(p):
    """
    inverse permutation
    """
    p = np.asarray(p)
    invp = np.empty_like(p)
    for i in range(p.size):
        invp[p[i]] = i
    #对于每个 i,设置 invp 在 p[i] 的位置上的值为 i
    return invp

3 举例

p = [2, 0, 1]
invp = invpermute(p)
invp
#[1, 2, 0]
  • invp的第p[0]个位置(第2个位置)值为0
  • invp的第p[1]个位置(第0个位置)值为1
  • invp的第p[2]个位置(第1个位置)值为2

反之亦可

  • p的第invp[0]个位置(第1个位置)值为0
  • p的第invp[1]个位置(第2个位置)值为1
  • p的第invp[2]个位置(第0个位置)值为2

4 部分应用

4.1 RNN

  • 在处理变长序列数据,特别是当我们使用循环神经网络(RNN)时,建议对序列按长度排序
    • RNN处理变长序列时,尽管每个序列的实际长度可能不同,但在单次批处理中,我们需要所有的序列都有相同的长度。为了实现这一点,我们通常会对短的序列进行填充,使其长度与批处理中最长的序列相同。
    • 当我们对序列按长度排序时,那些长度相近的序列会被分到同一个批处理中。这意味着我们不需要为很短的序列填充过多的无效数据。

4.1.1 举例

假设我们有如下序列:

seqs = ["apple", "banana", "cherry", "date", "fig"]

他们的长度分别为:

lengths = [5, 6, 6, 4, 3]

 为了高效地进行批处理,对这些序列按长度进行排序:

sorted_seqs = ["fig", "date", "apple", "banana", "cherry"]

这时,我们需要一个排列索引(按照长度排序后的索引结果)来跟踪这个排序操作:

idx = [4, 3, 0, 1, 2]
#排序后的第0个元素是原来的第4个元素,以此类推

在RNN处理后,我们得到的输出也是按这个顺序排序的。为了将输出恢复到与原始输入相同的顺序,我们需要使用逆排列:

invp = [2, 3, 4, 1, 0]
'''
invp的计算:
invp的第idx[0](4)个元素是0
invp的第idx[1](3)个元素是1
。。。
'''

使用这个逆排列,我们可以将输出重新排序,使其与原始输入的顺序相匹配。

比如RNN之后,得到的输出序列是

outputs = ["output_fig", "output_date", "output_apple", "output_banana", "output_cherry"]

那么 使用逆排列,我们可以将输出重新排序到原始输入的顺序:

original_order_outputs = [outputs[i] for i in invp]
# 返回:['output_apple', 'output_banana', 'output_cherry', 'output_date', 'output_fig']

这样,original_order_outputs 就和 seqs 的顺序一致了。

所以,通过使用逆置换,我们可以确保无论输入序列如何被排序或重排,我们总是可以使用逆置换来恢复原始的顺序。这在处理与序列关联的目标或标签时非常有用,因为我们需要确保输入和标签的顺序始终保持一致。


http://www.kler.cn/news/106779.html

相关文章:

  • 鸿蒙ArkUI-X跨端应用开发,一套代码构建多平台应用
  • Day38 Qchart绘制灰度直方图
  • C#序列化与反序列化详解
  • 04-流媒体-ffmpeg.c源码分析
  • Corel Products Keygen-X-FORCE 2023(Corel会声会影2023注册机)
  • 【计算机网络笔记】Cookie技术
  • B F C
  • 浏览器事件循环 (event loop)
  • Centos安装gitlabce
  • Go学习第十章——文件操作,Json和测试
  • CVE-2021-41773/42013 apache路径穿越漏洞
  • Unity - 导出的FBX模型,无法将 vector4 保存在 uv 中(使用 Unity Mesh 保存即可)
  • 【蓝桥每日一题]-前缀和与差分(保姆级教程 篇1)
  • 拷贝音频、视频、word等二进制文件的实现方法,不掉帧
  • 业务设计——分库分表下多种登录方式实现【用户名、邮箱、手机号】
  • [17]JAVAEE-HTTP协议
  • 存储器概述
  • calcite 校验层总结
  • 【深蓝学院】手写VIO第8章--相机与IMU时间戳同步--笔记
  • asp.net学生考试报名管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
  • fio performance test
  • 设计模式(2)-创建型模式
  • 一些k8s集群操作命令
  • 【httpd】 Apache http服务器目录显示不全解决
  • 【0基础学Java第一课】-- 初始Java
  • 读高性能MySQL(第4版)笔记21_读后总结与感想兼导读
  • 如何查看所有员工电脑访问网站记录?
  • 优咔科技创新连接方案助力高质量5G车联服务
  • Windows-Oracle19c 安装详解-含Navicate远程连接配置 - 同时连接Oracle11g和Oracle19c
  • Spark UI中Shuffle dataSize 和shuffle bytes written 指标区别