代码链接:https://github.com/ICDM-UESTC/ExGeo
└── ExGeo
├── datasets # 包含3个大规模的真实街道IP地理位置数据集。
│ |── New_York # 从纽约市收集的街道级IP地理定位数据集,包括91,808个IP地址。
│ |── Los_Angeles # 从洛杉矶收集的街道级IP地理定位数据集,包括92,804个IP地址。
│ |── Shanghai # 收集自上海的街道级IP地理定位数据集,包括126,258个IP地址。
├── lib # 包含模型(model)实现文件
│ |── layers.py # 注意力机制的代码。
│ |── model.py # ExGeo的核心源代码。
│ |── sublayers.py # layer.py的支持文件。
│ |── utils.py # 辅助函数
├── asset # 包含运行模型时保存的检查点和日志
│ |── log # 包含运行模型时保存的日志
│ |── model # 包含运行模型时保存的检查点├── generateidx.py # 生成target nodes和landmark nodes的idx(索引)
├── preprocess.py # 预处理数据集并为模型运行执行IP聚类
├── main.py # 运行模型进行训练和测试
├── test.py #加载检查点,然后测试
└── README.md
一、导入各种模块和数据库
# Load data and IP clustering
import math
import random
import pandas as pd
import numpy as np
import argparse
from sklearn import preprocessing
from lib.utils import MaxMinScaler
from tqdm import tqdm
加载数据和IP聚类,这些导入语句是为了引入在后续代码中可能会使用到的数学、随机数、数据处理等工具和库。
该部分实现和RIPGeo的(一)preprocess.py中的一样,不同之处在于:
多了一行
1、from tqdm import tqdm:它导入了
tqdm
模块中的tqdm
类。tqdm
是一个用于在循环中添加进度条的工具,方便用户实时查看代码的执行进度,以帮助在循环中可视化地显示代码的执行进度,从而更好地了解代码的运行情况。
二、使用argparse
库创建了一个命令行解析器
parser = argparse.ArgumentParser()
parser.add_argument('--dataset', type=str, default='Shanghai', choices=["Shanghai", "New_York", "Los_Angeles"],
help='which dataset to use')
parser.add_argument('--train_test_ratio', type=float, default=0.8, help='landmark ratio')
parser.add_argument('--lm_ratio', type=float, default=0.7, help='landmark ratio')
parser.add_argument('--seed', type=int, default=1234)
# parser.add_argument('--seed', type=int, default=2022)
opt = parser.parse_args()
print("Dataset: ", opt.dataset)
该部分实现和RIPGeo的(一)preprocess.py中的一样,不同之处在于:
默认的数据集变成了shanghai。
1、parser.add_argument('--dataset', type=str, default='Shanghai', choices=["Shanghai", "New_York", "Los_Angeles"], help='which dataset to use')
三、get_XY()
def get_XY(dataset):
data_path = "./datasets/{}/data.csv".format(dataset)
ip_path = './datasets/{}/ip.csv'.format(dataset)
trace_path = './datasets/{}/last_traceroute.csv'.format(dataset)
data_origin = pd.read_csv(data_path, encoding='gbk', low_memory=False)
ip_origin = pd.read_csv(ip_path, encoding='gbk', low_memory=False)
trace_origin = pd.read_csv(trace_path, encoding='gbk', low_memory=False)
data = pd.concat([data_origin, ip_origin, trace_origin], axis=1)
data.fillna({"isp": '0'}, inplace=True)
# labels
Y = data[['longitude', 'latitude']]
Y = np.array(Y)
# features
if dataset == "Shanghai": # Shanghai,27+8+16, 共51维,其中8+16=24维为traceroute相关measurment
# classification features
X_class = data[['orgname', 'asname', 'address', 'isp']]
scaler = preprocessing.OneHotEncoder(sparse=False)
X_class = scaler.fit_transform(X_class)
X_class1 = data['isp']
X_class1 = preprocessing.LabelEncoder().fit_transform(X_class1)
X_class1 = preprocessing.MinMaxScaler().fit_transform(np.array(X_class1).reshape((-1, 1)))
X_2 = data[['ip_split1', 'ip_split2', 'ip_split3', 'ip_split4']]
X_2 = preprocessing.MinMaxScaler().fit_transform(np.array(X_2))
X_3 = data['asnumber']
X_3 = preprocessing.LabelEncoder().fit_transform(X_3)
X_3 = preprocessing.MinMaxScaler().fit_transform(np.array(X_3).reshape(-1, 1))
X_4 = data[['aiwen_ping_delay_time', 'vp806_ping_delay_time', 'vp808_ping_delay_time', 'vp813_ping_delay_time']]
delay_scaler = MaxMinScaler()
delay_scaler.fit(X_4)
X_4 = delay_scaler.transform(X_4)
X_5 = data[['aiwen_tr_steps', 'vp806_tr_steps', 'vp808_tr_steps', 'vp813_tr_steps']]
step_scaler = MaxMinScaler()
step_scaler.fit(X_5)
X_5 = step_scaler.transform(X_5)
X_6 = data[
['aiwen_last1_delay', 'aiwen_last2_delay_total', 'aiwen_last3_delay_total', 'aiwen_last4_delay_total',
'vp806_last1_delay', 'vp806_last2_delay_total', 'vp806_last3_delay_total', 'vp806_last4_delay_total',
'vp808_last1_delay', 'vp808_last2_delay_total', 'vp808_last3_delay_total', 'vp808_last4_delay_total',
'vp813_last1_delay', 'vp813_last2_delay_total', 'vp813_last3_delay_total', 'vp813_last4_delay_total']]
X_6 = np.array(X_6)
X_6[X_6 <= 0] = 0
X_6 = preprocessing.MinMaxScaler().fit_transform(X_6)
X = np.concatenate([X_class1, X_class, X_2, X_3, X_4, X_5, X_6], axis=1)
# without isp
# X = np.concatenate([X_class, X_2, X_3, X_4, X_5, X_6], axis=1)
elif dataset == "New_York" or "Los_Angeles": # New_York or Los_Angeles, 6+8+16, 共30维, 其中8+16=24维为tracerout相关measurment
X_class = data['isp']
X_class = preprocessing.LabelEncoder().fit_transform(X_class)
X_class = preprocessing.MinMaxScaler().fit_transform(np.array(X_class).reshape((-1, 1)))
X_2 = data[['ip_split1', 'ip_split2', 'ip_split3', 'ip_split4']]
X_2 = preprocessin