【问题标题】:How to sample data from the proximity of existing data?如何从现有数据的邻近度中采样数据?
【发布时间】:2021-12-02 18:40:03
【问题描述】:

我有如下的异或数据 -

x y z x ^ y ^ z
0 0 1 1
0 1 0 1
1 0 0 1
1 1 1 1

只保留使所有三个的异或等于 1 的那些。

我想在某个范围内随机均匀地围绕已有数据生成合成数据。上表可以认为是种子数据。期望表的示例如下:

x y z x ^ y ^ z
0.1 0.3 0.8 0.9
0.25 0.87 0.03 0.99
0.79 0.09 0.28 0.82
0.97 0.76 0.91 0.89

上表的采样范围为 0 到 0.3,值为 0,范围为 0.7 到 1,值为 1。

我想用 pytorch 来实现。

【问题讨论】:

  • 为什么1^1^1 = 1在第一个表的最后一行?
  • "^" 是异或运算。 1 xor 1 xor 1 = 0 xor 1 = 1 @Ivan

标签: python pytorch sampling data-generation


【解决方案1】:

对于这样的问题,您可以在不使用参考的情况下完全合成数据,因为它有一个简单的解决方案。对于零 (0-0.3),您可以使用 torch.rand 函数为 0-1 生成均匀随机数据并对其进行缩放。对于一个(0.7-1),你可以做同样的事情,只是抵消它:

N = 5
p = 0.5 #change this to bias your outputs
x_is_1 = torch.rand(N)>p #decide if x is going to be 1 or 0
y_is_1 = torch.rand(N)>p #decide if y is going to be 1 or 0 
not_all_0 = ~(x_is_1 & y_is_1) #get rid of the x ^ y ^ z = 0 elements
x_is_1,y_is_1 = x_is_1[not_all_0],y_is_1[not_all_0]
N = x_is_1.shape[0]
x = torch.rand(N) * 0.3
x = torch.where(x_is_1,x+0.7,x)
y = torch.rand(N) * 0.3
y = torch.where(y_is_1,y+0.7,y)
z = torch.logical_xor(x_is_1,y_is_1).float()
triple_xor = 1 - torch.rand(z.shape)*0.3
print(torch.stack([x,y,z,triple_xor]).T)  
       #x        y       z       x^y^z                                                                                                                                                                   
tensor([[0.2615, 0.7676, 1.0000, 0.8832],
    [0.9895, 0.0370, 1.0000, 0.9796],
    [0.1406, 0.9203, 1.0000, 0.9646],
    [0.1799, 0.9722, 1.0000, 0.9327]])

或者,为了将您的数据作为基础(对于更复杂的数据),有一种称为高斯噪声注入的预处理工具似乎是您所追求的。或者你可以定义一个函数并多次调用它。

def add_noise(x,y,z,triple_xor,range=0.3):
     def proc(dat,range):
        return torch.where(dat>0.5,torch.rand(dat.shape)*range+1-range,torch.rand(dat.shape)*range)
     return proc(x,range),proc(y,range),proc(z,range),proc(triple_xor,range)

gen_new_data = torch.cat([torch.stack(add_noise(x,y,z,triple_xor)).T for _ in range(5)])

【讨论】:

  • 非常感谢@jhso。这完美地工作。只是一件小事,我们可以完全将它作为张量传递,而不是分别传递 x、y、z 和 Triple_xor 吗?这样会更有效率。
  • 你可以单独使用 proc 函数,然后将 dat 作为 Nx4 大小的张量传递
猜你喜欢
  • 1970-01-01
  • 2014-12-28
  • 2010-09-06
  • 2012-10-23
  • 1970-01-01
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
相关资源
最近更新 更多