如何从现有数据的接近度中抽取数据?

How to sample data from the proximity of existing data?

我有如下异或数据 -

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

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

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

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

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

我想用pytorch实现这个。

对于这样的问题,您可以在不使用参考的情况下完全综合数据,因为它有一个简单的解决方案。对于零 (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)])