代码链接: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.max
min = torch.from_numpy(self.min).type_as(data).to(data.device) if torch.is_tensor(data) else self.min
data[data != 0] = (data[data != 0] - min) / (max - min)
return data
def inverse_transform(self, data):
max = torch.from_numpy(self.max).type_as(data).to(data.device) if torch.is_tensor(data) else self.max
min = torch.from_numpy(self.min).type_as(data).to(data.device) if torch.is_tensor(data) else self.min
data = data * (max - min) + min
return 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.max
min = torch.from_numpy(self.min).type_as(data).to(data.device) if torch.is_tensor(data) else self.min
data[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.max
min = torch.from_numpy(self.min).type_as(data).to(data.device) if torch.is_tensor(data) else self.min
data = data * (max - min) + min
return 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
相