Browse Source

Add class WeisfeilerLehman.

v0.2.x
jajupmochi 5 years ago
parent
commit
f337fc3fa9
5 changed files with 734 additions and 536 deletions
  1. +1
    -0
      gklearn/kernels/__init__.py
  2. +513
    -513
      gklearn/kernels/weisfeilerLehmanKernel.py
  3. +190
    -1
      gklearn/preimage/experiments/xp_median_preimage.py
  4. +7
    -1
      gklearn/preimage/median_preimage_generator.py
  5. +23
    -21
      gklearn/tests/test_graph_kernels.py

+ 1
- 0
gklearn/kernels/__init__.py View File

@@ -12,3 +12,4 @@ from gklearn.kernels.structural_sp import StructuralSP
from gklearn.kernels.shortest_path import ShortestPath
from gklearn.kernels.path_up_to_h import PathUpToH
from gklearn.kernels.treelet import Treelet
from gklearn.kernels.weisfeiler_lehman import WeisfeilerLehman

+ 513
- 513
gklearn/kernels/weisfeilerLehmanKernel.py
File diff suppressed because it is too large
View File


+ 190
- 1
gklearn/preimage/experiments/xp_median_preimage.py View File

@@ -196,6 +196,66 @@ def xp_median_preimage_9_3():
print('fit method:', fit_method, '\n')
mpg_options['fit_method'] = fit_method
generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required)
def xp_median_preimage_9_4():
"""xp 9_4: MAO, WeisfeilerLehman, using CONSTANT.
"""
# set parameters.
ds_name = 'MAO' #
mpg_options = {'fit_method': 'k-graphs',
'init_ecc': [4, 4, 2, 1, 1, 1], #
'ds_name': ds_name,
'parallel': True, # False
'time_limit_in_sec': 0,
'max_itrs': 100, #
'max_itrs_without_update': 3,
'epsilon_residual': 0.01,
'epsilon_ec': 0.1,
'verbose': 2}
kernel_options = {'name': 'WeisfeilerLehman',
'height': 6,
'base_kernel': 'subtree',
'parallel': 'imap_unordered',
# 'parallel': None,
'n_jobs': multiprocessing.cpu_count(),
'normalize': True,
'verbose': 2}
ged_options = {'method': 'IPFP',
'initialization_method': 'RANDOM', # 'NODE'
'initial_solutions': 10, # 1
'edit_cost': 'CONSTANT', #
'attr_distance': 'euclidean',
'ratio_runs_from_initial_solutions': 1,
'threads': multiprocessing.cpu_count(),
'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'}
mge_options = {'init_type': 'MEDOID',
'random_inits': 10,
'time_limit': 600,
'verbose': 2,
'refine': False}
save_results = True
dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/'
irrelevant_labels = None #
edge_required = False #
# print settings.
print('parameters:')
print('dataset name:', ds_name)
print('mpg_options:', mpg_options)
print('kernel_options:', kernel_options)
print('ged_options:', ged_options)
print('mge_options:', mge_options)
print('save_results:', save_results)
print('irrelevant_labels:', irrelevant_labels)
print()
# generate preimages.
for fit_method in ['k-graphs', 'expert'] + ['random'] * 5:
print('\n-------------------------------------')
print('fit method:', fit_method, '\n')
mpg_options['fit_method'] = fit_method
generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required)


def xp_median_preimage_8_1():
@@ -383,6 +443,66 @@ def xp_median_preimage_8_3():
mpg_options['fit_method'] = fit_method
generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required)
def xp_median_preimage_8_4():
"""xp 8_4: Monoterpenoides, WeisfeilerLehman, using CONSTANT.
"""
# set parameters.
ds_name = 'Monoterpenoides' #
mpg_options = {'fit_method': 'k-graphs',
'init_ecc': [4, 4, 2, 1, 1, 1], #
'ds_name': ds_name,
'parallel': True, # False
'time_limit_in_sec': 0,
'max_itrs': 100, #
'max_itrs_without_update': 3,
'epsilon_residual': 0.01,
'epsilon_ec': 0.1,
'verbose': 2}
kernel_options = {'name': 'WeisfeilerLehman',
'height': 4,
'base_kernel': 'subtree',
'parallel': 'imap_unordered',
# 'parallel': None,
'n_jobs': multiprocessing.cpu_count(),
'normalize': True,
'verbose': 2}
ged_options = {'method': 'IPFP',
'initialization_method': 'RANDOM', # 'NODE'
'initial_solutions': 10, # 1
'edit_cost': 'CONSTANT', #
'attr_distance': 'euclidean',
'ratio_runs_from_initial_solutions': 1,
'threads': multiprocessing.cpu_count(),
'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'}
mge_options = {'init_type': 'MEDOID',
'random_inits': 10,
'time_limit': 600,
'verbose': 2,
'refine': False}
save_results = True
dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/'
irrelevant_labels = None #
edge_required = False #
# print settings.
print('parameters:')
print('dataset name:', ds_name)
print('mpg_options:', mpg_options)
print('kernel_options:', kernel_options)
print('ged_options:', ged_options)
print('mge_options:', mge_options)
print('save_results:', save_results)
print('irrelevant_labels:', irrelevant_labels)
print()
# generate preimages.
for fit_method in ['k-graphs', 'expert'] + ['random'] * 5:
print('\n-------------------------------------')
print('fit method:', fit_method, '\n')
mpg_options['fit_method'] = fit_method
generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required)

def xp_median_preimage_7_1():
"""xp 7_1: MUTAG, StructuralSP, using CONSTANT.
@@ -568,6 +688,66 @@ def xp_median_preimage_7_3():
print('fit method:', fit_method, '\n')
mpg_options['fit_method'] = fit_method
generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required)
def xp_median_preimage_7_4():
"""xp 7_4: MUTAG, WeisfeilerLehman, using CONSTANT.
"""
# set parameters.
ds_name = 'MUTAG' #
mpg_options = {'fit_method': 'k-graphs',
'init_ecc': [4, 4, 2, 1, 1, 1], #
'ds_name': ds_name,
'parallel': True, # False
'time_limit_in_sec': 0,
'max_itrs': 100, #
'max_itrs_without_update': 3,
'epsilon_residual': 0.01,
'epsilon_ec': 0.1,
'verbose': 2}
kernel_options = {'name': 'WeisfeilerLehman',
'height': 1,
'base_kernel': 'subtree',
'parallel': 'imap_unordered',
# 'parallel': None,
'n_jobs': multiprocessing.cpu_count(),
'normalize': True,
'verbose': 2}
ged_options = {'method': 'IPFP',
'initialization_method': 'RANDOM', # 'NODE'
'initial_solutions': 10, # 1
'edit_cost': 'CONSTANT', #
'attr_distance': 'euclidean',
'ratio_runs_from_initial_solutions': 1,
'threads': multiprocessing.cpu_count(),
'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'}
mge_options = {'init_type': 'MEDOID',
'random_inits': 10,
'time_limit': 600,
'verbose': 2,
'refine': False}
save_results = True
dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/'
irrelevant_labels = None #
edge_required = False #
# print settings.
print('parameters:')
print('dataset name:', ds_name)
print('mpg_options:', mpg_options)
print('kernel_options:', kernel_options)
print('ged_options:', ged_options)
print('mge_options:', mge_options)
print('save_results:', save_results)
print('irrelevant_labels:', irrelevant_labels)
print()
# generate preimages.
for fit_method in ['k-graphs', 'expert'] + ['random'] * 5:
print('\n-------------------------------------')
print('fit method:', fit_method, '\n')
mpg_options['fit_method'] = fit_method
generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required)


def xp_median_preimage_6_1():
@@ -1432,6 +1612,9 @@ if __name__ == "__main__":

#### xp 7_3: MUTAG, Treelet, using CONSTANT.
# xp_median_preimage_7_3()

#### xp 7_4: MUTAG, WeisfeilerLehman, using CONSTANT.
# xp_median_preimage_7_4()
#### xp 8_1: Monoterpenoides, StructuralSP, using CONSTANT.
# xp_median_preimage_8_1()
@@ -1442,6 +1625,9 @@ if __name__ == "__main__":
#### xp 8_3: Monoterpenoides, Treelet, using CONSTANT.
# xp_median_preimage_8_3()

#### xp 8_4: Monoterpenoides, WeisfeilerLehman, using CONSTANT.
# xp_median_preimage_8_4()

#### xp 9_1: MAO, StructuralSP, using CONSTANT, symbolic only.
# xp_median_preimage_9_1()

@@ -1449,4 +1635,7 @@ if __name__ == "__main__":
# xp_median_preimage_9_2()

#### xp 9_3: MAO, Treelet, using CONSTANT.
xp_median_preimage_9_3()
# xp_median_preimage_9_3()

#### xp 9_4: MAO, WeisfeilerLehman, using CONSTANT.
xp_median_preimage_9_4()

+ 7
- 1
gklearn/preimage/median_preimage_generator.py View File

@@ -751,8 +751,14 @@ class MedianPreimageGenerator(PreimageGenerator):
edge_labels=self._dataset.edge_labels,
ds_infos=self._dataset.get_dataset_infos(keys=['directed']),
**self._kernel_options)
elif self._kernel_options['name'] == 'WeisfeilerLehman':
from gklearn.kernels import WeisfeilerLehman
self._graph_kernel = WeisfeilerLehman(node_labels=self._dataset.node_labels,
edge_labels=self._dataset.edge_labels,
ds_infos=self._dataset.get_dataset_infos(keys=['directed']),
**self._kernel_options)
else:
raise Exception('The graph kernel given is not defined. Possible choices include: "StructuralSP", "ShortestPath", "PathUpToH", "Treelet".')
raise Exception('The graph kernel given is not defined. Possible choices include: "StructuralSP", "ShortestPath", "PathUpToH", "Treelet", "WeisfeilerLehman".')
# def __clean_graph(self, G, node_labels=[], edge_labels=[], node_attrs=[], edge_attrs=[]):


+ 23
- 21
gklearn/tests/test_graph_kernels.py View File

@@ -233,7 +233,7 @@ def test_PathUpToH(ds_name, parallel, k_func, compute_method):
@pytest.mark.parametrize('ds_name', ['Alkane', 'AIDS'])
@pytest.mark.parametrize('parallel', ['imap_unordered', None])
def test_treeletkernel(ds_name, parallel):
def test_Treelet(ds_name, parallel):
"""Test treelet kernel.
"""
from gklearn.kernels import Treelet
@@ -258,28 +258,30 @@ def test_treeletkernel(ds_name, parallel):
assert False, exception
# @pytest.mark.parametrize('ds_name', ['Acyclic'])
# #@pytest.mark.parametrize('base_kernel', ['subtree', 'sp', 'edge'])
# @pytest.mark.parametrize('base_kernel', ['subtree'])
# @pytest.mark.parametrize('parallel', ['imap_unordered', None])
# def test_weisfeilerlehmankernel(ds_name, parallel, base_kernel):
# """Test Weisfeiler-Lehman kernel.
# """
# from gklearn.kernels.weisfeilerLehmanKernel import weisfeilerlehmankernel
@pytest.mark.parametrize('ds_name', ['Acyclic'])
#@pytest.mark.parametrize('base_kernel', ['subtree', 'sp', 'edge'])
@pytest.mark.parametrize('base_kernel', ['subtree'])
@pytest.mark.parametrize('parallel', ['imap_unordered', None])
def test_WeisfeilerLehman(ds_name, parallel, base_kernel):
"""Test Weisfeiler-Lehman kernel.
"""
from gklearn.kernels import WeisfeilerLehman
# Gn, y = chooseDataset(ds_name)
dataset = chooseDataset(ds_name)

# try:
# Kmatrix, run_time = weisfeilerlehmankernel(Gn,
# node_label='atom',
# edge_label='bond_type',
# height=2,
# base_kernel=base_kernel,
# parallel=parallel,
# n_jobs=multiprocessing.cpu_count(),
# verbose=True)
# except Exception as exception:
# assert False, exception
try:
graph_kernel = WeisfeilerLehman(node_labels=dataset.node_labels,
edge_labels=dataset.edge_labels,
ds_infos=dataset.get_dataset_infos(keys=['directed']),
height=2, base_kernel=base_kernel)
gram_matrix, run_time = graph_kernel.compute(dataset.graphs,
parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True)
kernel_list, run_time = graph_kernel.compute(dataset.graphs[0], dataset.graphs[1:],
parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True)
kernel, run_time = graph_kernel.compute(dataset.graphs[0], dataset.graphs[1],
parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True)
except Exception as exception:
assert False, exception

if __name__ == "__main__":


Loading…
Cancel
Save