Browse Source

Update the RPG experiment.

v0.2.x
jajupmochi 5 years ago
parent
commit
924f028c0c
1 changed files with 163 additions and 28 deletions
  1. +163
    -28
      gklearn/preimage/experiments/xp_random_preimage_generation.py

+ 163
- 28
gklearn/preimage/experiments/xp_random_preimage_generation.py View File

@@ -9,6 +9,7 @@ import multiprocessing
import numpy as np import numpy as np
import networkx as nx import networkx as nx
import os import os
from gklearn.utils.graphfiles import saveGXL
from gklearn.preimage import RandomPreimageGenerator from gklearn.preimage import RandomPreimageGenerator
from gklearn.utils import Dataset from gklearn.utils import Dataset


@@ -16,7 +17,7 @@ from gklearn.utils import Dataset
dir_root = '../results/xp_random_preimage_generation/' dir_root = '../results/xp_random_preimage_generation/'




def xp_random_preimage_generation():
def xp_random_preimage_generation(kernel_name):
""" """
Experiment similar to the one in Bakir's paper. A test to check if RandomPreimageGenerator class works correctly. Experiment similar to the one in Bakir's paper. A test to check if RandomPreimageGenerator class works correctly.


@@ -40,15 +41,26 @@ def xp_random_preimage_generation():
'alphas': None, 'alphas': None,
'parallel': True, 'parallel': True,
'verbose': 2} 'verbose': 2}
kernel_options = {'name': 'PathUpToH',
'depth': 2, #
'k_func': 'MinMax', #
'compute_method': 'trie',
'parallel': 'imap_unordered',
# 'parallel': None,
'n_jobs': multiprocessing.cpu_count(),
'normalize': True,
'verbose': 0}
if kernel_name == 'PathUpToH':
kernel_options = {'name': 'PathUpToH',
'depth': 2, #
'k_func': 'MinMax', #
'compute_method': 'trie',
'parallel': 'imap_unordered',
# 'parallel': None,
'n_jobs': multiprocessing.cpu_count(),
'normalize': True,
'verbose': 0}
elif kernel_name == 'Marginalized':
kernel_options = {'name': 'Marginalized',
'p_quit': 0.8, #
'n_iteration': 7, #
'remove_totters': False,
'parallel': 'imap_unordered',
# 'parallel': None,
'n_jobs': multiprocessing.cpu_count(),
'normalize': True,
'verbose': 0}
edge_required = True edge_required = True
irrelevant_labels = {'edge_labels': ['label_0']} irrelevant_labels = {'edge_labels': ['label_0']}
cut_range = None cut_range = None
@@ -74,25 +86,30 @@ def xp_random_preimage_generation():
if cut_range is not None: if cut_range is not None:
dataset_all.cut_graphs(cut_range) dataset_all.cut_graphs(cut_range)
# add two "random" graphs.
g1 = nx.Graph()
g1.add_nodes_from(range(0, 16), label_0='0')
g1.add_nodes_from(range(16, 25), label_0='1')
g1.add_node(25, label_0='2')
g1.add_nodes_from([26, 27], label_0='3')
g1.add_edges_from([(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (10, 11), (11, 12), (5, 0), (4, 9), (12, 3), (10, 13), (13, 14), (14, 15), (15, 8), (0, 16), (1, 17), (2, 18), (12, 19), (11, 20), (13, 21), (15, 22), (7, 23), (6, 24), (14, 25), (25, 26), (25, 27)])
g2 = nx.Graph()
g2.add_nodes_from(range(0, 12), label_0='0')
g2.add_nodes_from(range(12, 19), label_0='1')
g2.add_nodes_from([19, 20, 21], label_0='2')
g2.add_nodes_from([22, 23], label_0='3')
g2.add_edges_from([(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 19), (19, 7), (7, 8), (8, 9), (9, 10), (10, 11), (11, 20), (20, 7), (5, 0), (4, 8), (0, 12), (1, 13), (2, 14), (9, 15), (10, 16), (11, 17), (6, 18), (3, 21), (21, 22), (21, 23)])
dataset_all.load_graphs([g1, g2] + dataset_all.graphs, targets=None)
# # add two "random" graphs.
# g1 = nx.Graph()
# g1.add_nodes_from(range(0, 16), label_0='0')
# g1.add_nodes_from(range(16, 25), label_0='1')
# g1.add_node(25, label_0='2')
# g1.add_nodes_from([26, 27], label_0='3')
# g1.add_edges_from([(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (10, 11), (11, 12), (5, 0), (4, 9), (12, 3), (10, 13), (13, 14), (14, 15), (15, 8), (0, 16), (1, 17), (2, 18), (12, 19), (11, 20), (13, 21), (15, 22), (7, 23), (6, 24), (14, 25), (25, 26), (25, 27)])
# g2 = nx.Graph()
# g2.add_nodes_from(range(0, 12), label_0='0')
# g2.add_nodes_from(range(12, 19), label_0='1')
# g2.add_nodes_from([19, 20, 21], label_0='2')
# g2.add_nodes_from([22, 23], label_0='3')
# g2.add_edges_from([(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 19), (19, 7), (7, 8), (8, 9), (9, 10), (10, 11), (11, 20), (20, 7), (5, 0), (4, 8), (0, 12), (1, 13), (2, 14), (9, 15), (10, 16), (11, 17), (6, 18), (3, 21), (21, 22), (21, 23)])
# dataset_all.load_graphs([g1, g2] + dataset_all.graphs, targets=None)
# 2. initialize rpg and setting parameters. # 2. initialize rpg and setting parameters.
print('2. initializing rpg and setting parameters...') print('2. initializing rpg and setting parameters...')
nb_graphs = len(dataset_all.graphs) - 2
rpg_options['alphas'] = [alpha1, 1 - alpha1] + [0] * nb_graphs
# nb_graphs = len(dataset_all.graphs) - 2
# rpg_options['alphas'] = [alpha1, 1 - alpha1] + [0] * nb_graphs
nb_graphs = len(dataset_all.graphs)
alphas = [0] * nb_graphs
alphas[1] = alpha1
alphas[6] = 1 - alpha1
rpg_options['alphas'] = alphas
if gmfile_exist: if gmfile_exist:
rpg_options['gram_matrix_unnorm'] = gram_matrix_unnorm rpg_options['gram_matrix_unnorm'] = gram_matrix_unnorm
rpg_options['runtime_precompute_gm'] = time_precompute_gm rpg_options['runtime_precompute_gm'] = time_precompute_gm
@@ -114,11 +131,129 @@ def xp_random_preimage_generation():
# write Gram matrices to file. # write Gram matrices to file.
if not gmfile_exist: if not gmfile_exist:
np.savez(dir_save + 'gram_matrix_unnorm.' + ds_name + '.' + kernel_options['name'] + '.gm', gram_matrix_unnorm=rpg.gram_matrix_unnorm, run_time=results['runtime_precompute_gm']) np.savez(dir_save + 'gram_matrix_unnorm.' + ds_name + '.' + kernel_options['name'] + '.gm', gram_matrix_unnorm=rpg.gram_matrix_unnorm, run_time=results['runtime_precompute_gm'])

# save graphs.
fn_best_dataset = dir_save + 'g_best_dataset.' + 'alpha1_' + str(alpha1)[0:3]
saveGXL(rpg.best_from_dataset, fn_best_dataset + '.gxl', method='default',
node_labels=dataset_all.node_labels, edge_labels=dataset_all.edge_labels,
node_attrs=dataset_all.node_attrs, edge_attrs=dataset_all.edge_attrs)
fn_preimage = dir_save + 'g_preimage.' + 'alpha1_' + str(alpha1)[0:3]
saveGXL(rpg.preimage, fn_preimage + '.gxl', method='default',
node_labels=dataset_all.node_labels, edge_labels=dataset_all.edge_labels,
node_attrs=dataset_all.node_attrs, edge_attrs=dataset_all.edge_attrs)
# draw graphs.
__draw_graph(rpg.best_from_dataset, fn_best_dataset)
__draw_graph(rpg.preimage, fn_preimage)
# plot results figure.
__plot_results(alpha1_list, k_dis_datasets, k_dis_preimages, dir_save)
print('\ncomplete.\n') print('\ncomplete.\n')
return k_dis_datasets, k_dis_preimages, bests_from_dataset, preimages return k_dis_datasets, k_dis_preimages, bests_from_dataset, preimages




def __draw_graph(graph, file_prefix):
# import matplotlib
# matplotlib.use('agg')
import matplotlib.pyplot as plt
plt.figure()
pos = nx.spring_layout(graph)
nx.draw(graph, pos, node_size=500, labels=nx.get_node_attributes(graph, 'label_0'), font_color='w', width=3, with_labels=True)
plt.savefig(file_prefix + '.eps', format='eps', dpi=300)
# plt.show()
plt.clf()
plt.close()


def __plot_results(alpha1_list, k_dis_datasets, k_dis_preimages, dir_save):
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1, figsize=(7, 4.5))

ind = np.arange(len(alpha1_list)) # the x locations for the groups
width = 0.35 # the width of the bars: can also be len(x) sequence
p1 = ax.bar(ind, k_dis_preimages, width, label='Reconstructed pre-image', zorder=3, color='#133AAC')
ax.set_xlabel(r'$\alpha \in [0,1]$')
ax.set_ylabel(r'$d(g_i,g^\star(\alpha))$')
#ax.set_title('Runtime of the shortest path kernel on all datasets')
plt.xticks(ind, [str(i)[0:3] for i in alpha1_list])
#ax.set_yticks(np.logspace(-16, -3, num=20, base=10))
#ax.set_ylim(bottom=1e-15)
ax.grid(axis='y', zorder=0)
ax.spines['top'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.xaxis.set_ticks_position('none')

p2 = ax.plot(ind, k_dis_datasets, 'b.-', label=r'Nearest neighbor in $D_N$', color='orange', zorder=4)
ax.yaxis.set_ticks_position('none')
fig.subplots_adjust(bottom=.2)
fig.legend(loc='lower center', ncol=2, frameon=False) # , ncol=5, labelspacing=0.1, handletextpad=0.4, columnspacing=0.6)
plt.savefig(dir_save + 'distances in kernel space.eps', format='eps', dpi=300,
transparent=True, bbox_inches='tight')
plt.show()
plt.clf()
plt.close()

if __name__ == '__main__': if __name__ == '__main__':
k_dis_datasets, k_dis_preimages, bests_from_dataset, preimages = xp_random_preimage_generation()
# kernel_name = 'PathUpToH'
kernel_name = 'Marginalized'
k_dis_datasets, k_dis_preimages, bests_from_dataset, preimages = xp_random_preimage_generation(kernel_name)
# # save graphs.
# dir_save = dir_root + 'MUTAG.PathUpToH/'
# for i, alpha1 in enumerate(np.linspace(0, 1, 11)):
# fn_best_dataset = dir_save + 'g_best_dataset.' + 'alpha1_' + str(alpha1)[0:3]
# saveGXL(bests_from_dataset[i], fn_best_dataset + '.gxl', method='default',
# node_labels=['label_0'], edge_labels=[],
# node_attrs=[], edge_attrs=[])
# fn_preimage = dir_save + 'g_preimage.' + 'alpha1_' + str(alpha1)[0:3]
# saveGXL(preimages[i], fn_preimage + '.gxl', method='default',
# node_labels=['label_0'], edge_labels=[],
# node_attrs=[], edge_attrs=[])

# # draw graphs.
# dir_save = dir_root + 'MUTAG.PathUpToH/'
# for i, alpha1 in enumerate(np.linspace(0, 1, 11)):
# fn_best_dataset = dir_save + 'g_best_dataset.' + 'alpha1_' + str(alpha1)[0:3]
# __draw_graph(bests_from_dataset[i], fn_best_dataset)
# fn_preimage = dir_save + 'g_preimage.' + 'alpha1_' + str(alpha1)[0:3]
# __draw_graph(preimages[i], fn_preimage)

# # plot results figure.
# alpha1_list = np.linspace(0, 1, 11)
# dir_save = dir_root + 'MUTAG.PathUpToH/'
# __plot_results(alpha1_list, k_dis_datasets, k_dis_preimages, dir_save)

# k_dis_datasets = [0.0,
# 0.08882515554098754,
# 0.17765031108197632,
# 0.2664754666229643,
# 0.35530062216395264,
# 0.44412577770494066,
# 0.35530062216395236,
# 0.2664754666229643,
# 0.17765031108197632,
# 0.08882515554098878,
# 0.0]

# k_dis_preimages = [0.0,
# 0.08882515554098754,
# 0.17765031108197632,
# 0.2664754666229643,
# 0.35530062216395264,
# 0.44412577770494066,
# 0.35530062216395236,
# 0.2664754666229643,
# 0.17765031108197632,
# 0.08882515554098878,
# 0.0]

Loading…
Cancel
Save