以下是上述内容的翻译:
从代码来看,异常数据集(绕路和转换)是由训练数据生成的,而不是测试数据。以下是 process_datasets
方法中的相关部分:
# 将训练数据中的正常轨迹进行转换
train_converted = {}
for idx, traj in enumerate(train_data):
train_converted[idx] = self.convert_trajectory(traj)
# 从训练数据中生成异常点
detour_data = {}
switch_data = {}
num_outliers = int(len(train_data) * 0.1) # 10%的异常点
for i in range(num_outliers):
orig_traj = train_data[i] # 从训练数据中获取轨迹
detour_traj = self.generate_detour(orig_traj)
switch_traj = self.generate_switch(orig_traj)
detour_data[i] = self.convert_trajectory(detour_traj)
switch_data[i] = self.convert_trajectory(switch_traj)
具体来看:
- 异常点的数量是训练数据总量的10%(
num_outliers = int(len(train_data) * 0.1)
)。 - 每个异常点是从训练数据中选取的一条轨迹(
orig_traj = train_data[i]
)。 - 然后,分别为该训练轨迹生成绕路版本和转换版本。
- 测试数据是独立的,未被用于生成异常点。
如果您希望了解代码为何设计成这样,或者需要进一步解析异常生成过程的其他方面,请告诉我!
以下是上述内容的翻译:
绕路生成(generate_detour
方法):
def generate_detour(self, traj, detour_factor=2):
if len(traj) < 3:
return traj
start = traj[0] # 保留原始起点
end = traj[-1] # 保留原始终点
num_extra_points = int(len(traj) * detour_factor) # 生成比原路径更多的点
min_val = min(start, end)
max_val = max(start, end)
# 在起点和终点之间生成随机点
detour_points = []
for _ in range(num_extra_points):
new_point = np.random.randint(min_val, max_val + 1)
detour_points.append(new_point)
return [start] + sorted(detour_points) + [end]
绕路生成方法通过以下方式生成一条更长的路径:
- 保留原始的起点和终点;
- 在起点和终点之间添加随机点(默认生成的点数量是原路径点数量的两倍,由
detour_factor
控制); - 将这些点排序,从而形成一条看起来合理的路径。
转换生成(generate_switch
方法):
def generate_switch(self, traj, switch_ratio=0.3):
if len(traj) < 4:
return traj
# 随机选择一段路径进行修改(默认占原路径的30%)
switch_length = int(len(traj) * switch_ratio)
switch_start = np.random.randint(1, len(traj) - switch_length - 1)
switch_end = switch_start + switch_length
# 通过对原始点添加随机偏移量生成新点
new_segment = []
for _ in range(switch_length):
orig_point = traj[switch_start + len(new_segment)]
offset = np.random.randint(-100, 101) # 随机偏移量在-100到100之间
new_point = max(0, orig_point + offset)
new_segment.append(new_point)
return traj[:switch_start] + new_segment + traj[switch_end:]
转换生成方法通过以下步骤修改路径的一部分:
- 随机选择一段路径(默认长度为原路径的30%);
- 用随机偏移量替换该路径段中的点;
- 保留路径的起始和结束部分不变。
测试数据处理:
代码并不生成人工测试数据,而是:
-
从CSV文件加载真实的测试数据:
test_data = self.load_porto_data(test_path)
-
将测试路径转换为所需格式:
test_converted = {} for idx, traj in enumerate(test_data): test_converted[idx] = self.convert_trajectory(traj)
-
将其保存到
test.pickle
文件:with open(os.path.join(self.output_dir, 'test.pickle'), 'wb') as f: pickle.dump(test_converted, f)
需要注意的是,人工异常生成(绕路和转换生成)仅应用于训练数据,以创建带标签的异常示例;测试数据保持其原始来源数据的完整性,没有被修改。
如果您需要更详细的解释,可以告诉我!
标签:数据,self,detour,traj,switch,生成,data From: https://www.cnblogs.com/GraphL/p/18611102