打乱序列部份顺序

给定一个序列 < 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
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值