SNode 2 Vec DL
SNode 2 Vec DL
Requirement library
BFS adalah singkatan dari "Breadth-First Search" (Pencarian Lebar). BFS adalah salah satu algoritma
yang digunakan dalam pemrograman dan teori graf untuk melakukan pencarian atau traversal
(penelusuran) pada struktur data graf.
BFS beroperasi dengan mengunjungi simpul (node) pada tingkat atau kedalaman tertentu sebelum
melanjutkan ke simpul-simpul yang berada pada tingkat atau kedalaman berikutnya. Dalam BFS,
pencarian dimulai dari akhir awal (start node), kemudian semua akhirat yang terhubung langsung ke
akhir awal dikunjungi terlebih dahulu. Setelah itu, simpul-simpul tersebut diberi label "terlihat"
(dikunjungi) dan dimasukkan ke dalam antrian. Proses ini diulangi untuk semua simpul yang ada
dalam antrian, sehingga menghasilkan penjelajahan secara "lebar" dari simpul-simpul graf.
Sedangkan DFS adalah singkatan dari "Depth-First Search" (Pencarian Kedalaman). DFS adalah salah
satu algoritma yang digunakan dalam pemrograman dan teori graf untuk melakukan pencarian atau
traversal (penelusuran) pada struktur data graf.
DFS bekerja dengan penjelajahan secara mendalam ke simpul-simpul yang terhubung langsung
dengan simpul awal (start node) terlebih dahulu. Jika masih ada simpul yang belum dikunjungi pada
jalur yang sedang dijelajahi, maka simpul tersebut menjadi prioritas dan dilakukan penjelajahan lebih
dalam ke simpul-simpul yang terhubung langsung dengan simpul tersebut. Proses ini dilakukan
secara rekursif atau menggunakan tumpukan (stack).
DFS akan terus bergerak ke simpul berikutnya hingga mencapai simpul akhir atau tidak ada lagi
simpul yang dapat dijangkau dari simpul yang sedang diperiksa. Jika tidak ada simpul yang belum
dikunjungi pada jalur saat ini, maka kembalilah ke simpul sebelumnya dan coba jalur lain yang belum
dijelajahi.
DFS biasanya digunakan untuk mencari jalur atau rute di graf, seperti mencari jalur terpendek atau
mencari siklus. Selain itu, DFS juga berguna dalam menemukan komponen yang terhubung dalam
grafik, pencarian dalam pohon (tree traversal), dan banyak aplikasi lainnya.
Perbedaan utama antara BFS dan DFS adalah cara penjelajahan simpul. Penelusuran BFS unik secara
lebar, sedangkan penelusuran DFS unik secara mendalam.
1. Import data
import networkx as nx
import numpy as np
from tqdm.auto import tqdm
import pickle
import time
np.random.seed(999)
edgelist_path = '../data/'socfb-American75'.edgelist'
graph = nx.read_edgelist(edgelist_path, nodetype=int)
distance_map = {}
distances = np.zeros((len(nodes), ))
save_path = '../outputs/distance_map_'+graph_name+'_'+str(time.time())
+'.pickle'
pickle.dump(distance_map, open(save_path, 'wb'))
print('distance_map saved at', save_path)
"""
for each distance get the corresponding node embeddings and combine by
averaging them.
this cell has a bug which causes emd_dist_pair to store some duplicate
items. These duplicates are dropped later.
"""
from tqdm.auto import tqdm
emd_dist_pair = []
for landmark in tqdm(list(distance_map.keys())):
node_distances = distance_map[landmark]
emd_dist_pair.extend([((emd_map[node]+emd_map[landmark])/2,
distance) for node, distance in enumerate(node_distances, 1) if node !=
landmark and distance != np.inf])
seed_random = 9999
np.random.seed(seed_random)
torch.backends.cudnn.deterministic = True
if torch.cuda.is_available():
torch.cuda.manual_seed_all(seed_random)
4. normalisai data
scaler = StandardScaler()
# scaler = MinMaxScaler(feature_range=(0, 1))
x_train = scaler.fit_transform(x_train)
x_cv = scaler.transform(x_cv)
x_test = scaler.transform(x_test)
pickle.dump((x_train, y_train),
open('../outputs/train_xy_no_sampling_stdScale.pk', 'wb'))
pickle.dump((x_cv, y_cv),
open('../outputs/val_xy_no_sampling_stdScale.pk', 'wb'))
pickle.dump((x_test, y_test),
open('../outputs/test_xy_no_sampling_stdScale.pk', 'wb'))
5. Train NN
seed_random = 9999
# max_idx = np.argmax(counts)
# max_value = counts[max_idx]
# majority_class = values[max_idx]
x = int(counts[2]*0.7)
y = int(0.7 * x)
minority_samples = int(0.7*x)
oversample_dict = {1:minority_samples, 4:minority_samples,
5:minority_samples, 6:minority_samples, 7:minority_samples}
over_sampler = RandomOverSampler(sampling_strategy=oversample_dict,
random_state=seed_random) # ,n_jobs=15, k_neighbors= 5
x_train, y_train = over_sampler.fit_resample(x_train,
y_train.astype(np.int))
print('Frequency of distance values after oversampling',
np.unique(y_train, return_counts=True))
pickle.dump((x_train, y_train),
open('../outputs/train_xy_combine_sampling.pk', 'wb'))
x_train.shape, y_train.shape
6. Pytorch Model
torch.manual_seed(9999)
def get_model():
"""
creates a PyTorch model. Change the 'params' dict above to
modify the neural net configuration.
"""
model = torch.nn.Sequential(
torch.nn.Linear(params['input_size'],
params['hidden_units_1']),
torch.nn.BatchNorm1d(params['hidden_units_1']),
# torch.nn.Dropout(p=params['do_1']),
torch.nn.ReLU(),
torch.nn.Linear(params['hidden_units_1'],
params['hidden_units_2']),
torch.nn.BatchNorm1d(params['hidden_units_2']),
# torch.nn.Dropout(p=params['do_2']),
torch.nn.ReLU(),
torch.nn.Linear(params['hidden_units_2'],
params['hidden_units_3']),
torch.nn.BatchNorm1d(params['hidden_units_3']),
# torch.nn.Dropout(p=params['do_3']),
torch.nn.ReLU(),
torch.nn.Linear(params['hidden_units_3'],
params['output_size']),
torch.nn.ReLU(),
# torch.nn.Softplus(),
)
model.to(device)
return model
model = get_model()
summary(model, input_size=(params['input_size'], ))
sys.stdout = old_stdout
model_summary = buffer.getvalue()
print('model-summary\n', model_summary)
# later this 'model-summary' string can be written to tensorboard
lr_reduce_patience = 20
lr_reduce_factor = 0.1
loss_fn = poisson_loss
# optimizer = torch.optim.SGD(model.parameters(), lr=params['lr'],
momentum=0.9, dampening=0, weight_decay=0, nesterov=True)
optimizer = torch.optim.RMSprop(model.parameters(), lr=params['lr'],
alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)
if params['lr_sched'] == 'reduce_lr_plateau':
lr_sched = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer,
mode='min', factor=lr_reduce_factor, patience=lr_reduce_patience,
verbose=True, threshold=0.00001, threshold_mode='rel', cooldown=0,
min_lr=1e-9, eps=1e-08)
elif params['lr_sched'] == 'clr':
lr_sched = torch.optim.lr_scheduler.CyclicLR(optimizer,
params['min_lr'], params['max_lr'], step_size_up=8*len(train_dl),
step_size_down=None, mode=params['lr_sched_mode'], last_epoch=-1,
gamma=params['gamma'])
wfw
import torch
from torch.utils import data as torch_data
trainset = torch_data.TensorDataset(torch.as_tensor(x_train,
dtype=torch.float, device=device),
torch.as_tensor(y_train, dtype=torch.float, device=device))
train_dl = torch_data.DataLoader(trainset,
batch_size=params['batch_size'], drop_last=True)
val_dl =
torch_data.DataLoader(torch_data.TensorDataset(torch.as_tensor(x_cv,
dtype=torch.float, device=device),
torch.as_tensor(y_cv, dtype=torch.float, device=device)),
batch_size=params['batch_size'], drop_last=True)
test_dl =
torch_data.DataLoader(torch_data.TensorDataset(torch.as_tensor(x_test,
dtype=torch.float, device=device),
torch.as_tensor(y_test, dtype=torch.float, device=device)),
batch_size=params['batch_size'], drop_last=True)
7. train
train
running_loss += loss.item()
last_loss = loss.item()
if not isinstance(lr_sched,
torch.optim.lr_scheduler.ReduceLROnPlateau):
lr_sched.step()
if epoch % 10 == 0:
torch.save(best_model.state_dict(),
checkpoint_path+'/model_cp.pt')
torch.save(optimizer.state_dict(),
checkpoint_path+'/optim_cp.pt')
torch.save(lr_sched.state_dict(),
checkpoint_path+'/sched_cp.pt')
writer.add_text('checkpoint saved', 'at epoch='+str(epoch))
print("epoch:{} -> train_loss={},val_loss={} - {}".
format(epoch, round(train_loss, 5), round(val_loss, 5),
seconds_to_minutes(time.time()-stime)))
print('Finished Training')