如何从现有数据的接近度中抽取数据?
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)])
我有如下异或数据 -
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)])