打乱序列部份顺序

本文介绍了一种改进的方法来在Python中打乱数据序列,以在noisylabel中更有效地模拟噪声对标签的影响。原始的shuffle方法可能导致部分元素位置不变,作者提出使用随机排列和偏移确保至少有预定比例的元素被正确打乱。
部署运行你感兴趣的模型镜像

给定一个序列 < x 1 , … , x n > <x_1,\dots,x_n> <x1,,xn>,想打乱其中 p( p ∈ [ 0 , 1 ] p\in[0,1] p[0,1])比例位置的顺序。这在 noisy label 中用到,如 [1] 中的 PrecompDataset 就用打乱顺序的方式模拟 noisy pair,而 [1] 用的打乱方式简单用 numpy.random.shuffle,可能会导致打乱不彻底,即一些元素还在原来的位置,如:

import numpy as np
b = np.arange(5) # [0, 1, 2, 3, 4]
np.random.shuffle(b)
print(b) # [0, 4, 2, 3, 1],其中 0、2、3 还在原位

以致实际被打乱的位置可能不足 p%,为保证足有 p% 的乱序,可如此写:

import numpy as np

# 示例数据
n = 7 # 数据量
x = np.arange(n * 5).reshape(n, 5) # 二维数据
x_orig = x.copy()
print("original:", x)

p = 0.4 # 乱序比例
noise_length = int(p * n) # 乱序数量
pos_to_shuffle = np.random.permutation(n)[:noise_length] # 随机选 noise_length 个要打乱的位置
# 打乱这些下标:加一个随机偏移
meta_index = np.arange(noise_length) # pos_to_shuffle 的下标
rnd_shift = np.random.randint(1, noise_length) # 随机偏移:[1, noise_length)
# print(rnd_shift)
shuffled_pos = pos_to_shuffle[(meta_index + rnd_shift) % noise_length]
# print(pos_to_shuffle, shuffled_pos)
assert (pos_to_shuffle != shuffled_pos).all()
# 用乱序下标打乱数据
x[pos_to_shuffle] = x[shuffled_pos]
print("shuffled:", x)

# 验证 noise rate 如期
assert (x_orig[:, 0] != x[:, 0]).sum() == noise_length
real_p = round((x_orig[:, 0] != x[:, 0]).sum() / n, 6)
assert real_p > 0
exp_p = round(noise_length / n, 6)
print("real p:", real_p, " v.s. expected p:", exp_p)

References

  1. xu5zhao/BiCro

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 随机打乱 List 的顺序Python 中,可以通过 `random` 模块中的 `shuffle()` 方法来随机打乱列表中元素的顺序。以下是具体实现方式: #### 使用 `random.shuffle()` 打乱列表 `random.shuffle()` 是一种原地算法,它会直接修改原始列表的内容,而不会创建新的列表。 ```python import random my_list = [1, 2, 3, 4, 5] random.shuffle(my_list) print(my_list) ``` 上述代码展示了如何利用 `random.shuffle()` 来随机打乱列表 `[1, 2, 3, 4, 5]` 的顺序[^1]。 #### 结合种子值固定随机结果 如果需要每次都生成相同的随机排列,可以使用 `random.seed()` 设置固定的种子值。这样即使多次运行程序,也会得到一致的结果。 ```python import random random.seed(42) # 设定种子值 my_list = [1, 2, 3, 4, 5] random.shuffle(my_list) print(my_list) ``` 此代码片段说明了当设置相同种子值时,无论调用多少次 `shuffle()` 方法,最终产生的序列都是完全一样的[^3]。 #### 对复杂数据结构进行随机化处理 对于更复杂的场景,比如由多个列表组合而成的数据结构(例如通过 `zip()` 合并两个列表),也可以应用同样的逻辑对其进行整体上的重新排序。 ```python import random list1 = [1, 2, 3] list2 = ['a', 'b', 'c'] result = list(zip(list1, list2)) random.shuffle(result) unzipped_result = zip(*result) print("Shuffled pairs:", result) print("Unzipped first elements:", list(unzipped_result)[0]) print("Unzipped second elements:", list(unzipped_result)[1]) ``` 这段脚本演示了怎样先将两组独立数组配对成元组形式后再统一混洗它们之间的关联关系[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值