如何使用PyTorch在现有XOR种子数据邻近范围采样生成合成数据
PyTorch实现XOR合成数据生成
实现逻辑很清晰,按以下步骤来:
- 提前定义4组满足
x^y^z=1的离散种子样本 - 遵循采样规则:原始值为0的特征从[0, 0.3]均匀采样,原始值为1的特征从[0.7, 1.0]均匀采样
- 生成样本后使用连续异或公式计算第四列结果,连续异或的离散兼容公式为
a ^ b = a + b - 2*a*b
完整实现代码
import torch def generate_xor_synthetic_data(num_samples: int) -> torch.Tensor: # 定义原始种子数据,前3列是x/y/z,第4列是离散异或结果 seed_data = torch.tensor([ [0, 0, 1, 1], [0, 1, 0, 1], [1, 0, 0, 1], [1, 1, 1, 1] ], dtype=torch.int8) # 定义采样范围 low_0, high_0 = 0.0, 0.3 low_1, high_1 = 0.7, 1.0 # 随机选择num_samples个种子模板 seed_indices = torch.randint(0, 4, size=(num_samples,)) selected_seeds = seed_data[seed_indices][:, :3] # 取x/y/z三列作为采样模板 # 按规则生成连续值 rand_mat = torch.rand_like(selected_seeds, dtype=torch.float32) samples = torch.where( selected_seeds == 0, low_0 + rand_mat * (high_0 - low_0), low_1 + rand_mat * (high_1 - low_1) ) # 计算连续三变量异或结果作为第四列 x, y, z = samples[:, 0], samples[:, 1], samples[:, 2] xor_xy = x + y - 2 * x * y xor_xyz = xor_xy + z - 2 * xor_xy * z xor_xyz = xor_xyz.unsqueeze(1) # 拼接得到完整样本 full_data = torch.concat([samples, xor_xyz], dim=1) return full_data # 测试:生成4个样本 if __name__ == "__main__": data = generate_xor_synthetic_data(4) # 保留两位小数打印,和示例格式对齐 print(torch.round(data * 100) / 100)
输出示例(随机生成结果会有差异,符合规则即可)
tensor([[0.1200, 0.2700, 0.8900, 0.8600], [0.0300, 0.7400, 0.1800, 0.9100], [0.9500, 0.0700, 0.2200, 0.8200], [0.8100, 0.9300, 0.7600, 0.8700]])
内容的提问来源于stack exchange,提问作者Ravi Raja
相关产品推荐
相关产品推荐

