
代码链接:https://github.com/ICDM-UESTC/TrustGeo
一、导入常用库和模块
from __future__ import print_function
from distutils.version import LooseVersion
from matplotlib.scale import LogisticTransform
import numpy as np
import torch
import warnings
import torch.nn as nn
import random
import matplotlib.pyplot as plt
import copy
这段代码首先包含一些导入语句,接着进行一些版本和警告的处理,最后导入了一些常用的库(numpy、torch、matplotlib),并定义了一些常用的模块(nn,plt)。
1、from __future__ import print_function:这是为了确保代码同时在Python 2和Python 3中都能正常运行。在Python 2中,print是一个语句,而在Python 3中,print()是一个函数。通过这个导入语句,可以在Python 2中使用Python 3风格的print函数。
2、from distutils.version import LooseVersion:导入LooseVersion类,用于比较版本号。
3、from matplotlib.scale import LogisticTransform:导入了matplotlib库中的LogisticTransform类。LogisticTransform是matplotlib中用于对坐标轴进行变换的一个类。
4、import numpy as np:导入NumPy库,并用np作为别名。NumPy是一个用于科学计算的库,提供了数组等高性能数学运算工具。
5、import torch::导入PyTorch库。PyTorch是一个深度学习框架,提供了张量计算和神经网络搭建等功能。
6、import warnings:导入warnings模块,用于处理警告。
7、import torch.nn as nn:导入PyTorch中的神经网络模块。
8、import random:导入Python的random模块,用于生成伪随机数。
9、import matplotlib.pyplot as plt:导入matplotlib库的pyplot模块,用于绘制图表。
10、import copy:导入Python的copy模块,用于复制对象。
二、warnings.filterwarnings(action='once')
设置了在使用warnings.filterwarnings时的参数。filterwarnings函数用于配置警告过滤器,以控制哪些警告会被触发,以及如何处理这些警告。
具体来说,action='once'表示警告信息只会被显示一次。这对于一些可能会频繁触发的警告而言是一种控制方式,以避免在控制台或日志中大量重复的警告信息。在第一次触发警告时,它会被显示,但在后续的同类警告中,将不再显示。
请注意,这个配置仅适用于在warnings模块中配置的警告,它并不会影响其他类型的警告或错误。
三、MaxMinLogRTTScaler类定义(NN模型)
class MaxMinLogRTTScaler():def __init__(self):self.min = 0.self.max = 1.def transform(self, data):data_o = np.array(data)data_o = np.log(data_o + 1)return (data_o - self.min) / (self.max - self.min)
这是一个最大最小归一化和对数变换的类,用于对输入数据进行预处理。这个类的实例可以用于对RTT(Round-Trip Time)等数据进行预处理,使其适用于某些需要输入在固定范围内的模型。
分为几个部分展开描述:
(一)__init__()
def __init__(self):self.min = 0.self.max = 1.
这是一个简单的类的初始化方法 __init__,主要功能是为类的实例对象设置初始属性值。
1、self.min = 0.: 创建一个实例变量 min 并将其设置为 0.,这里 0. 表示浮点型的零。
2、self.max = 1.: 创建一个实例变量 max 并将其设置为 1.,同样是浮点型的一。。
(二)transform()
def transform(self, data):data_o = np.array(data)data_o = np.log(data_o + 1)return (data_o - self.min) / (self.max - self.min)
这段代码的功能是将输入的数据进行对数转换,然后进行最小-最大归一化。这样的操作常用于将数据缩放到一个较小的范围,使其更适合训练或输入到某些机器学习模型中。
1、data_o = np.array(data):将输入的data转换为NumPy数组,并将结果存储在data_o中。
2、data_o = np.log(data_o + 1):对data_o中的每个元素取对数,这里使用的是自然对数(以e为底)。+ 1 是为了避免对0取对数。
3、return (data_o - self.min) / (self.max - self.min):对处理后的数据进行归一化操作。self.min和self.max是归一化的范围,这两个值可能是预先计算得到的或者是通过其他方式确定的。这里使用的是最小-最大归一化方法,即减去最小值然后除以范围(最大值减最小值)。最终,函数返回归一化后的结果。
四、MaxMinRTTScaler类定义(NN模型)
class MaxMinRTTScaler():def __init__(self):self.min = 0.self.max = 1.def transform(self, data):data_o = np.array(data)# data_o = np.log(data_o + 1)return (data_o - self.min) / (self.max - self.min)
这是一个用于进行最大-最小缩放(Max-Min Scaling)的类。这种缩放方法用于将数据缩放到指定的范围,通常是[0, 1]。
分为几个部分展开描述:
(一)__init__()
def __init__(self):self.min = 0.self.max = 1.
类的初始化方法,初始化了最大值和最小值,这里默认将数据缩放到[0, 1]的范围。
(二)transform()
def transform(self, data):data_o = np.array(data)# data_o = np.log(data_o + 1)return (data_o - self.min) / (self.max - self.min)
这是一个简单的数据转换函数,用于对输入数据进行归一化操作。整体功能是将输入数据进行归一化处理,确保数据在训练模型时具有统一的尺度。
1、data_o = np.array(data):将输入的数据 data 转换为NumPy数组,确保数据是数组形式。
2、# data_o = np.log(data_o + 1):这一行是被注释掉的代码。通常,对数据进行对数变换是为了减小数据的尺度差异,使其更符合某些模型的假设。但在这里被注释掉了,没有被使用。
3、return (data_o - self.min) / (self.max - self.min):对数据进行归一化操作。首先,从数据中减去最小值 self.min,然后除以数据范围(最大值 self.max 减去最小值 self.min)。这样可以将数据缩放到0到1的范围内。最终,函数返回归一化后的数据。
五、MaxMinLogScaler类定义(NN模型)
class MaxMinLogScaler():def __init__(self):self.min = 0.self.max = 1.def transform(self, data):data[data != 0] = -np.log(data[data != 0] + 1)max = torch.from_numpy(self.max).type_as(data).to(data.device) if torch.is_tensor(data) else self.maxmin = torch.from_numpy(self.min).type_as(data).to(data.device) if torch.is_tensor(data) else self.mindata[data != 0] = (data[data != 0] - min) / (max - min)return datadef inverse_transform(self, data):max = torch.from_numpy(self.max).type_as(data).to(data.device) if torch.is_tensor(data) else self.maxmin = torch.from_numpy(self.min).type_as(data).to(data.device) if torch.is_tensor(data) else self.mindata = data * (max - min) + minreturn np.exp(data)
这是一个实现最大最小对数缩放(Max-Min Log Scaling)的类,主要用于处理数据的缩放和反缩放。该类的目的是确保数据在缩放和反缩放时能够得到合适的转换,避免由于极端值或零值导致的不稳定情况。
分为几个部分展开描述:
(一)__init__()
def __init__(self):self.min = 0.self.max = 1.
初始化方法,设置缩放的最小值和最大值,默认为 0 和 1。
(二)transform()
def transform(self, data):data[data != 0] = -np.log(data[data != 0] + 1)max = torch.from_numpy(self.max).type_as(data).to(data.device) if torch.is_tensor(data) else self.maxmin = torch.from_numpy(self.min).type_as(data).to(data.device) if torch.is_tensor(data) else self.mindata[data != 0] = (data[data != 0] - min) / (max - min)return data
数据缩放方法。对于输入的数据 data,首先对非零元素取对数,然后进行最大最小缩放,将数据映射到 [0, 1] 的范围内。
1、data[data != 0] = -np.log(data[data != 0] + 1):对数据中非零元素取对数的操作。首先,data != 0 会生成一个布尔掩码,表示数据中非零的位置。然后,对这些非零的元素执行 -np.log(data[data != 0] + 1),将其取对数并取负值,最终将结果赋值给原数据中非零的位置。这个操作通常用于对数据进行对数缩放,可以使原始数据中的大数值范围缩小,便于模型训练。
2、max = torch.from_numpy(self.max).type_as(data).to(data.device) if torch.is_tensor(data) else self.max:将 self.max 转换为与输入数据 data 类型一致的张量,并移动到与输入数据相同的设备(GPU 或 CPU)。这里做了类型和设备的匹配以确保后续的操作在相同的环境下进行。
3、min = torch.from_numpy(self.min).type_as(data).to(data.device) if torch.is_tensor(data) else self.min:将 self.min 转换为与输入数据 data 类型一致的张量,并移动到与输入数据相同的设备。
4、data[data != 0] = (data[data != 0] - min) / (max - min):对数据中非零元素进行归一化操作。首先,data[data != 0] 会获取数据中非零元素的数组。然后,对这些非零元素执行归一化操作,减去最小值 min 并除以范围 (max - min)。最终,将归一化后的值赋值给原数据中非零的位置。
(三)inverse_transform()
def inverse_transform(self, data):max = torch.from_numpy(self.max).type_as(data).to(data.device) if torch.is_tensor(data) else self.maxmin = torch.from_numpy(self.min).type_as(data).to(data.device) if torch.is_tensor(data) else self.mindata = data * (max - min) + minreturn np.exp(data)
这段代码实现了一个反向变换(inverse transform)的函数,主要用于将经过某种归一化处理的数据反向还原到原始数据的范围。目的是将经过某种归一化处理的数据还原到原始的数值范围,以便进行后续的分析或应用。
1、max = torch.from_numpy(self.max).type_as(data).to(data.device) if torch.is_tensor(data) else self.max:将保存的最大值 self.max 转换为PyTorch张量,并确保其与输入数据 data 的数据类型一致。如果 data 是PyTorch张量,将张量移动到与 data 相