{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " --- This is a classification problem ---\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 0.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 373.39it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 26367.08it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.18705153465270996 seconds ---\n", "[[0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " ...\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 83%|████████▎ | 834/1000 [00:00<00:00, 2077.02it/s]\n", " Mean performance on train set: 0.549180\n", "With standard deviation: 0.016798\n", "\n", " Mean performance on test set: 0.642857\n", "With standard deviation: 0.146385\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 2083.52it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 50.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 231.33it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 15078.65it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.3006291389465332 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 81%|████████ | 808/1000 [00:00<00:00, 2005.12it/s]\n", " Mean performance on train set: 0.698361\n", "With standard deviation: 0.116889\n", "\n", " Mean performance on test set: 0.871429\n", "With standard deviation: 0.100000\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 2024.59it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 100.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 224.68it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 13144.65it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.30983662605285645 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 82%|████████▏ | 821/1000 [00:00<00:00, 2050.17it/s]\n", " Mean performance on train set: 0.732787\n", "With standard deviation: 0.082637\n", "\n", " Mean performance on test set: 0.900000\n", "With standard deviation: 0.111575\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 2050.63it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 150.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 219.10it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 12644.09it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.31808018684387207 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 99%|█████████▉| 993/1000 [00:00<00:00, 1993.90it/s]\n", " Mean performance on train set: 0.732787\n", "With standard deviation: 0.082637\n", "\n", " Mean performance on test set: 0.900000\n", "With standard deviation: 0.111575\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1977.95it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 200.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 219.08it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 14177.69it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.31757450103759766 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 98%|█████████▊| 980/1000 [00:00<00:00, 1969.03it/s]\n", " Mean performance on train set: 0.732787\n", "With standard deviation: 0.082637\n", "\n", " Mean performance on test set: 0.900000\n", "With standard deviation: 0.111575\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1951.39it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 250.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 218.22it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 12697.56it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.3192298412322998 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 95%|█████████▍| 946/1000 [00:00<00:00, 1878.10it/s]\n", " Mean performance on train set: 0.732787\n", "With standard deviation: 0.082637\n", "\n", " Mean performance on test set: 0.900000\n", "With standard deviation: 0.111575\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1875.67it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 300.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 206.81it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 12364.00it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.33614420890808105 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 97%|█████████▋| 970/1000 [00:00<00:00, 1947.13it/s]\n", " Mean performance on train set: 0.732787\n", "With standard deviation: 0.082637\n", "\n", " Mean performance on test set: 0.900000\n", "With standard deviation: 0.111575\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1934.26it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 350.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 189.65it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 13989.93it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.3654501438140869 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 95%|█████████▍| 946/1000 [00:00<00:00, 1875.81it/s]\n", " Mean performance on train set: 0.732787\n", "With standard deviation: 0.082637\n", "\n", " Mean performance on test set: 0.900000\n", "With standard deviation: 0.111575\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1881.94it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 400.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 220.95it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 14281.34it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.3142852783203125 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 95%|█████████▌| 952/1000 [00:00<00:00, 1900.77it/s]\n", " Mean performance on train set: 0.732787\n", "With standard deviation: 0.082637\n", "\n", " Mean performance on test set: 0.900000\n", "With standard deviation: 0.111575\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1900.46it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 450.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 212.09it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 11357.62it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.3287320137023926 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 98%|█████████▊| 981/1000 [00:00<00:00, 1956.30it/s]\n", " Mean performance on train set: 0.732787\n", "With standard deviation: 0.082637\n", "\n", " Mean performance on test set: 0.900000\n", "With standard deviation: 0.111575\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1952.54it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 500.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 208.14it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 12536.27it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.3347315788269043 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 98%|█████████▊| 979/1000 [00:00<00:00, 1970.30it/s]\n", " Mean performance on train set: 0.732787\n", "With standard deviation: 0.082637\n", "\n", " Mean performance on test set: 0.900000\n", "With standard deviation: 0.111575\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1950.19it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 550.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 208.06it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 13816.44it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.3341798782348633 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 97%|█████████▋| 974/1000 [00:00<00:00, 1930.44it/s]\n", " Mean performance on train set: 0.732787\n", "With standard deviation: 0.082637\n", "\n", " Mean performance on test set: 0.900000\n", "With standard deviation: 0.111575\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1937.89it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 600.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 213.56it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 13048.43it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.32569050788879395 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 97%|█████████▋| 972/1000 [00:00<00:00, 1924.82it/s]\n", " Mean performance on train set: 0.732787\n", "With standard deviation: 0.082637\n", "\n", " Mean performance on test set: 0.900000\n", "With standard deviation: 0.111575\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1935.68it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 650.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 216.51it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 9669.54it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.3229689598083496 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 98%|█████████▊| 983/1000 [00:00<00:00, 1963.08it/s]\n", " Mean performance on train set: 0.732787\n", "With standard deviation: 0.082637\n", "\n", " Mean performance on test set: 0.900000\n", "With standard deviation: 0.111575\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1960.32it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 700.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 208.61it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 13485.23it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.33377623558044434 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 81%|████████ | 812/1000 [00:00<00:00, 2020.52it/s]\n", " Mean performance on train set: 0.732787\n", "With standard deviation: 0.082637\n", "\n", " Mean performance on test set: 0.900000\n", "With standard deviation: 0.111575\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 2029.28it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 750.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 223.54it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 13952.29it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.31093406677246094 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 82%|████████▎ | 825/1000 [00:00<00:00, 2053.32it/s]\n", " Mean performance on train set: 0.732787\n", "With standard deviation: 0.082637\n", "\n", " Mean performance on test set: 0.900000\n", "With standard deviation: 0.111575\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 2055.77it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 800.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 223.35it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 13220.82it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.31124091148376465 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 96%|█████████▌| 959/1000 [00:00<00:00, 1925.40it/s]\n", " Mean performance on train set: 0.732787\n", "With standard deviation: 0.082637\n", "\n", " Mean performance on test set: 0.900000\n", "With standard deviation: 0.111575\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1912.78it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 850.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 202.00it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 12487.42it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.34392237663269043 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 95%|█████████▍| 946/1000 [00:00<00:00, 1869.41it/s]\n", " Mean performance on train set: 0.732787\n", "With standard deviation: 0.082637\n", "\n", " Mean performance on test set: 0.900000\n", "With standard deviation: 0.111575\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1883.23it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 900.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 217.23it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 13956.38it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.32010626792907715 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 99%|█████████▉| 989/1000 [00:00<00:00, 1978.29it/s]\n", " Mean performance on train set: 0.732787\n", "With standard deviation: 0.082637\n", "\n", " Mean performance on test set: 0.900000\n", "With standard deviation: 0.111575\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1968.44it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 950.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 228.56it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 14794.72it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.30414795875549316 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 83%|████████▎ | 829/1000 [00:00<00:00, 2063.72it/s]\n", " Mean performance on train set: 0.732787\n", "With standard deviation: 0.082637\n", "\n", " Mean performance on test set: 0.900000\n", "With standard deviation: 0.111575\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 2068.06it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 1000.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 223.02it/s]\n", "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 13702.27it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.3120880126953125 seconds ---\n", "[[ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " [ 8. 8. 8. ... 8. 8. 8.]\n", " ...\n", " [ 8. 8. 8. ... 10. 9. 9.]\n", " [ 8. 8. 8. ... 9. 10. 10.]\n", " [ 8. 8. 8. ... 9. 10. 10.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 82%|████████▎ | 825/1000 [00:00<00:00, 2054.81it/s]\n", " Mean performance on train set: 0.732787\n", "With standard deviation: 0.082637\n", "\n", " Mean performance on test set: 0.900000\n", "With standard deviation: 0.111575\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 2022.62it/s]\n", "\n", "\n", " cycle_bound accur_test std_test accur_train std_train k_time\n", "------------- ------------ ---------- ------------- ----------- --------\n", " 0 0.642857 0.146385 0.54918 0.0167983 0.187052\n", " 50 0.871429 0.1 0.698361 0.116889 0.300629\n", " 100 0.9 0.111575 0.732787 0.0826366 0.309837\n", " 150 0.9 0.111575 0.732787 0.0826366 0.31808\n", " 200 0.9 0.111575 0.732787 0.0826366 0.317575\n", " 250 0.9 0.111575 0.732787 0.0826366 0.31923\n", " 300 0.9 0.111575 0.732787 0.0826366 0.336144\n", " 350 0.9 0.111575 0.732787 0.0826366 0.36545\n", " 400 0.9 0.111575 0.732787 0.0826366 0.314285\n", " 450 0.9 0.111575 0.732787 0.0826366 0.328732\n", " 500 0.9 0.111575 0.732787 0.0826366 0.334732\n", " 550 0.9 0.111575 0.732787 0.0826366 0.33418\n", " 600 0.9 0.111575 0.732787 0.0826366 0.325691\n", " 650 0.9 0.111575 0.732787 0.0826366 0.322969\n", " 700 0.9 0.111575 0.732787 0.0826366 0.333776\n", " 750 0.9 0.111575 0.732787 0.0826366 0.310934\n", " 800 0.9 0.111575 0.732787 0.0826366 0.311241\n", " 850 0.9 0.111575 0.732787 0.0826366 0.343922\n", " 900 0.9 0.111575 0.732787 0.0826366 0.320106\n", " 950 0.9 0.111575 0.732787 0.0826366 0.304148\n", " 1000 0.9 0.111575 0.732787 0.0826366 0.312088\n" ] } ], "source": [ "# MAO dataset (node labeled, edge labeled, undirected, cyclic + linear, classification)\n", "%load_ext line_profiler\n", "\n", "import sys\n", "sys.path.insert(0, \"../\")\n", "from pygraph.utils.utils import kernel_train_test\n", "from pygraph.kernels.cyclicPatternKernel import cyclicpatternkernel\n", "\n", "import numpy as np\n", "\n", "datafile = '../../../../datasets/MAO/dataset.ds'\n", "kernel_file_path = 'kernelmatrices_cyclicpattern_mao/'\n", "\n", "kernel_para = dict(node_label = 'atom', edge_label = 'bond_type', labeled = True)\n", "\n", "kernel_train_test(datafile, kernel_file_path, cyclicpatternkernel, kernel_para, \\\n", " hyper_name = 'cycle_bound', hyper_range = np.linspace(0, 500, 21), normalize = False,\n", " model_type = 'classification')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The line_profiler extension is already loaded. To reload it, use:\n", " %reload_ext line_profiler\n", "\n", " --- This is a classification problem ---\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 0.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 94/94 [00:00<00:00, 176.07it/s]\n", "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 18331.07it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 94 built in 0.5411422252655029 seconds ---\n", "[[0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " ...\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 95%|█████████▌| 951/1000 [00:00<00:00, 1898.18it/s]\n", " Mean performance on train set: 0.629762\n", "With standard deviation: 0.013521\n", "\n", " Mean performance on test set: 0.610000\n", "With standard deviation: 0.113578\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1889.49it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 10.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 94/94 [00:00<00:00, 165.16it/s]\n", "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 16217.54it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 94 built in 0.5770719051361084 seconds ---\n", "[[0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " ...\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 94%|█████████▍| 940/1000 [00:00<00:00, 1876.61it/s]\n", " Mean performance on train set: 0.629762\n", "With standard deviation: 0.013521\n", "\n", " Mean performance on test set: 0.610000\n", "With standard deviation: 0.113578\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1866.80it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 20.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 94/94 [00:00<00:00, 165.21it/s]\n", "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 16888.61it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 94 built in 0.5768516063690186 seconds ---\n", "[[3. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " ...\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 93%|█████████▎| 926/1000 [00:00<00:00, 1837.36it/s]\n", " Mean performance on train set: 0.629762\n", "With standard deviation: 0.013521\n", "\n", " Mean performance on test set: 0.610000\n", "With standard deviation: 0.113578\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1841.13it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 30.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 94/94 [00:00<00:00, 171.51it/s]\n", "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 17701.46it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 94 built in 0.5560076236724854 seconds ---\n", "[[3. 3. 3. ... 0. 0. 0.]\n", " [3. 4. 4. ... 0. 0. 0.]\n", " [3. 4. 4. ... 0. 0. 0.]\n", " ...\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 92%|█████████▏| 923/1000 [00:00<00:00, 1845.18it/s]\n", " Mean performance on train set: 0.633333\n", "With standard deviation: 0.015793\n", "\n", " Mean performance on test set: 0.640000\n", "With standard deviation: 0.111355\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1836.56it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 40.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 94/94 [00:00<00:00, 159.66it/s]\n", "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 17703.84it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 94 built in 0.5963354110717773 seconds ---\n", "[[3. 3. 3. ... 0. 0. 0.]\n", " [3. 4. 4. ... 0. 0. 0.]\n", " [3. 4. 4. ... 0. 0. 0.]\n", " ...\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 84%|████████▍ | 845/1000 [00:00<00:00, 1694.10it/s]\n", " Mean performance on train set: 0.633333\n", "With standard deviation: 0.015793\n", "\n", " Mean performance on test set: 0.640000\n", "With standard deviation: 0.111355\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1694.34it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 50.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 94/94 [00:00<00:00, 126.36it/s]\n", "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 14863.89it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 94 built in 0.7526798248291016 seconds ---\n", "[[3. 3. 3. ... 0. 0. 0.]\n", " [3. 4. 4. ... 0. 0. 0.]\n", " [3. 4. 4. ... 0. 0. 0.]\n", " ...\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 84%|████████▍ | 842/1000 [00:00<00:00, 1670.86it/s]\n", " Mean performance on train set: 0.658333\n", "With standard deviation: 0.034524\n", "\n", " Mean performance on test set: 0.670000\n", "With standard deviation: 0.090000\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1665.11it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 60.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 94/94 [00:00<00:00, 107.33it/s]\n", "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 13937.03it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 94 built in 0.8846912384033203 seconds ---\n", "[[3. 3. 3. ... 0. 0. 0.]\n", " [3. 4. 4. ... 0. 0. 0.]\n", " [3. 4. 4. ... 0. 0. 0.]\n", " ...\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 83%|████████▎ | 829/1000 [00:00<00:00, 1653.86it/s]\n", " Mean performance on train set: 0.671429\n", "With standard deviation: 0.036577\n", "\n", " Mean performance on test set: 0.680000\n", "With standard deviation: 0.107703\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1673.57it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 70.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 94/94 [00:01<00:00, 81.45it/s] \n", "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 14275.64it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 94 built in 1.1631414890289307 seconds ---\n", "[[3. 3. 3. ... 3. 3. 3.]\n", " [3. 4. 4. ... 4. 4. 4.]\n", " [3. 4. 4. ... 4. 4. 4.]\n", " ...\n", " [3. 4. 4. ... 7. 7. 7.]\n", " [3. 4. 4. ... 7. 7. 7.]\n", " [3. 4. 4. ... 7. 7. 7.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 88%|████████▊ | 876/1000 [00:00<00:00, 1761.00it/s]\n", " Mean performance on train set: 0.666667\n", "With standard deviation: 0.038021\n", "\n", " Mean performance on test set: 0.670000\n", "With standard deviation: 0.100499\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1754.20it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 80.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 94/94 [00:01<00:00, 79.93it/s] \n", "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 14789.73it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 94 built in 1.1846554279327393 seconds ---\n", "[[3. 3. 3. ... 3. 3. 3.]\n", " [3. 4. 4. ... 4. 4. 4.]\n", " [3. 4. 4. ... 4. 4. 4.]\n", " ...\n", " [3. 4. 4. ... 7. 7. 7.]\n", " [3. 4. 4. ... 7. 7. 7.]\n", " [3. 4. 4. ... 7. 7. 7.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 93%|█████████▎| 926/1000 [00:00<00:00, 1854.59it/s]\n", " Mean performance on train set: 0.709524\n", "With standard deviation: 0.058853\n", "\n", " Mean performance on test set: 0.780000\n", "With standard deviation: 0.107703\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1844.77it/s]\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 90.0 ---#\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "retrieve patterns: 100%|██████████| 94/94 [00:01<00:00, 83.75it/s] \n", "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 14169.95it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 94 built in 1.1314406394958496 seconds ---\n", "[[3. 3. 3. ... 3. 3. 3.]\n", " [3. 4. 4. ... 4. 4. 4.]\n", " [3. 4. 4. ... 4. 4. 4.]\n", " ...\n", " [3. 4. 4. ... 7. 7. 7.]\n", " [3. 4. 4. ... 7. 7. 7.]\n", " [3. 4. 4. ... 7. 7. 7.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 94%|█████████▍| 943/1000 [00:00<00:00, 1878.69it/s]\n", " Mean performance on train set: 0.709524\n", "With standard deviation: 0.058853\n", "\n", " Mean performance on test set: 0.780000\n", "With standard deviation: 0.107703\n", "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1872.55it/s]\n", "\n", "\n", " cycle_bound accur_test std_test accur_train std_train k_time\n", "------------- ------------ ---------- ------------- ----------- --------\n", " 0 0.61 0.113578 0.629762 0.0135212 0.541142\n", " 10 0.61 0.113578 0.629762 0.0135212 0.577072\n", " 20 0.61 0.113578 0.629762 0.0135212 0.576852\n", " 30 0.64 0.111355 0.633333 0.0157935 0.556008\n", " 40 0.64 0.111355 0.633333 0.0157935 0.596335\n", " 50 0.67 0.09 0.658333 0.0345238 0.75268\n", " 60 0.68 0.107703 0.671429 0.0365769 0.884691\n", " 70 0.67 0.100499 0.666667 0.0380208 1.16314\n", " 80 0.78 0.107703 0.709524 0.0588534 1.18466\n", " 90 0.78 0.107703 0.709524 0.0588534 1.13144\n" ] } ], "source": [ "# PAH dataset (node and edge unlabeled, undirected, cyclic, classification)\n", "%load_ext line_profiler\n", "\n", "import sys\n", "sys.path.insert(0, \"../\")\n", "from pygraph.utils.utils import kernel_train_test\n", "from pygraph.kernels.cyclicPatternKernel import cyclicpatternkernel\n", "\n", "import numpy as np\n", "\n", "datafile = '../../../../datasets/PAH/dataset.ds'\n", "kernel_file_path = 'kernelmatrices_cyclicpattern_pah/'\n", "\n", "\n", "kernel_para = dict(node_label = 'atom', edge_label = 'bond_type', labeled = False)\n", "\n", "kernel_train_test(datafile, kernel_file_path, cyclicpatternkernel, kernel_para, \\\n", " hyper_name = 'cycle_bound', hyper_range = np.linspace(0, 90, 10), normalize = False, \\\n", " model_type = 'classification')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# results\n", "\n", "# MAO dataset\n", "cycle_bound accur_test std_test accur_train std_train k_time\n", "------------- ------------ ---------- ------------- ----------- --------\n", " 0 0.642857 0.146385 0.54918 0.0167983 0.187052\n", " 50 0.871429 0.1 0.698361 0.116889 0.300629\n", " 100 0.9 0.111575 0.732787 0.0826366 0.309837\n", " 150 0.9 0.111575 0.732787 0.0826366 0.31808\n", " 200 0.9 0.111575 0.732787 0.0826366 0.317575\n", " \n", "# PAH dataset\n", " cycle_bound accur_test std_test accur_train std_train k_time\n", "------------- ------------ ---------- ------------- ----------- --------\n", " 0 0.61 0.113578 0.629762 0.0135212 0.521801\n", " 10 0.61 0.113578 0.629762 0.0135212 0.52589\n", " 20 0.61 0.113578 0.629762 0.0135212 0.548528\n", " 30 0.64 0.111355 0.633333 0.0157935 0.535311\n", " 40 0.64 0.111355 0.633333 0.0157935 0.61764\n", " 50 0.67 0.09 0.658333 0.0345238 0.733868\n", " 60 0.68 0.107703 0.671429 0.0365769 0.871147\n", " 70 0.67 0.100499 0.666667 0.0380208 1.12625\n", " 80 0.78 0.107703 0.709524 0.0588534 1.19828\n", " 90 0.78 0.107703 0.709524 0.0588534 1.21182" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " --- This is a classification problem ---\n", "\n", "\n", " #--- calculating kernel matrix when cycle_bound = 1000.0 ---#\n", "\n", " Loading dataset from file...\n", "load SDF: 100%|██████████| 4457424/4457424 [00:10<00:00, 408299.51it/s]\n", "ajust data: 100%|██████████| 42687/42687 [00:10<00:00, 4092.17it/s] \n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 42682/42682 [19:36<00:00, 36.27it/s]\n", "calculate kernels: 100%|██████████| 42682/42682 [37:05<00:00, 19.18it/s] \n", "\n", " --- kernel matrix of cyclic pattern kernel of size 42682 built in 3402.171978712082 seconds ---\n", "[[ 9. 9. 3. ... 4. 3. 4.]\n", " [ 9. 11. 5. ... 6. 5. 6.]\n", " [ 3. 5. 16. ... 6. 6. 6.]\n", " ...\n", " [ 4. 6. 6. ... 30. 29. 6.]\n", " [ 3. 5. 6. ... 29. 29. 6.]\n", " [ 4. 6. 6. ... 6. 6. 11.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 7%|▋ | 70/1000 [1:34:57<227:25:45, 880.37s/it]" ] } ], "source": [ "# NCI-HIV dataset (labeled?, directed?, cyclic, classification)\n", "%load_ext line_profiler\n", "\n", "import sys\n", "sys.path.insert(0, \"../\")\n", "from pygraph.utils.utils import kernel_train_test\n", "from pygraph.kernels.cyclicPatternKernel import cyclicpatternkernel\n", "\n", "import numpy as np\n", "\n", "datafile = '../../../../datasets/NCI-HIV/AIDO99SD.sdf'\n", "datafile_y = '../../../../datasets/NCI-HIV/aids_conc_may04.txt'\n", "kernel_file_path = 'kernelmatrices_path_acyclic/'\n", "\n", "kernel_para = dict(node_label = 'atom', edge_label = 'bond_type', labeled = True)\n", "\n", "kernel_train_test(datafile, kernel_file_path, cyclicpatternkernel, kernel_para, \\\n", " hyper_name = 'cycle_bound', hyper_range = np.linspace(0, 1000, 21), normalize = False, \\\n", " datafile_y = datafile_y, model_type = 'classification')\n", "\n", "# kernel_para = dict(node_label = 'atom', edge_label = 'bond_type', labeled = True, cycle_bound = 200)\n", "\n", "# kernel_train_test(datafile, kernel_file_path, cyclicpatternkernel, kernel_para,\n", "# normalize = False, datafile_y = datafile_y, model_type = 'classification')\n", "\n", "# kernel_para['k_func'] = 'minmax'\n", "# kernel_train_test(datafile, kernel_file_path, untildpathkernel, kernel_para, \\\n", "# hyper_name = 'depth', hyper_range = np.linspace(0, 10, 11), normalize = True)\n", "# kernel_train_test(datafile, kernel_file_path, untildpathkernel, kernel_para, \\\n", "# hyper_name = 'depth', hyper_range = np.linspace(0, 10, 11), normalize = False)\n", "# # kernel_train_test(datafile, kernel_file_path, untildpathkernel, kernel_para, normalize = False)\n", "\n", "# kernel_para['depth'] = 10\n", "# %lprun -f untildpathkernel \\\n", "# kernel_train_test(datafile, kernel_file_path, untildpathkernel, kernel_para, normalize = False)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The line_profiler extension is already loaded. To reload it, use:\n", " %reload_ext line_profiler\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", " --- kernel matrix of cyclic pattern kernel of size 999 built in 18.78946042060852 seconds ---\n", "(array([[11., 5., 5., ..., 6., 7., 3.],\n", " [ 5., 16., 6., ..., 5., 5., 3.],\n", " [ 5., 6., 8., ..., 4., 5., 3.],\n", " ...,\n", " [ 6., 5., 4., ..., 17., 7., 4.],\n", " [ 7., 5., 5., ..., 7., 15., 4.],\n", " [ 3., 3., 3., ..., 4., 4., 11.]]), 18.78946042060852)\n" ] } ], "source": [ "%load_ext line_profiler\n", "\n", "import networkx as nx\n", "import matplotlib.pyplot as plt\n", "import sys\n", "sys.path.insert(0, \"../\")\n", "from pygraph.utils.graphfiles import loadDataset\n", "from pygraph.kernels.cyclicPatternKernel import cyclicpatternkernel\n", "\n", "# datafile = '../../../../datasets/NCI-HIV/AIDO99SD.sdf'\n", "# datafile_y = '../../../../datasets/NCI-HIV/aids_conc_may04.txt'\n", "# dataset, y = loadDataset(datafile, datafile_y)\n", "G1 = dataset[1]\n", "G2 = dataset[2]\n", "G3 = dataset[3]\n", "G4 = dataset[4]\n", "G5 = dataset[5]\n", "data = [G1, G2, G3, G4, G5]\n", "nx.draw_networkx(G1)\n", "plt.show()\n", "nx.draw_networkx(G2)\n", "plt.show()\n", "\n", "kernel = cyclicpatternkernel(dataset[1:1000], cycle_bound = 1000)\n", "print(kernel)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " --- This is a classification problem ---\n", "\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "retrieve patterns: 100%|██████████| 185/185 [00:00<00:00, 2064.69it/s]\n", "calculate kernels: 100%|██████████| 185/185 [00:00<00:00, 11170.00it/s]\n", "\n", " --- kernel matrix of cyclic pattern kernel of size 185 built in 0.10836505889892578 seconds ---\n", "[[0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " ...\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 100%|██████████| 1000/1000 [00:24<00:00, 36.41it/s]\n", " Mean performance on train set: 0.018072\n", "With standard deviation: 0.000000\n", "\n", " Mean performance on test set: 0.000000\n", "With standard deviation: 0.000000\n", "\n", "\n", " accur_test std_test accur_train std_train k_time\n", "------------ ---------- ------------- ----------- --------\n", " 0 0 0.0180723 0 0.108365\n" ] } ], "source": [ "# acyclic dataset (node labeled, edge labeled, undirected, linear + non-linear, regression)\n", "%load_ext line_profiler\n", "\n", "import sys\n", "sys.path.insert(0, \"../\")\n", "from pygraph.utils.utils import kernel_train_test\n", "from pygraph.kernels.cyclicPatternKernel import cyclicpatternkernel\n", "\n", "import numpy as np\n", "\n", "datafile = '../../../../datasets/acyclic/Acyclic/dataset_bps.ds'\n", "kernel_file_path = 'kernelmatrices_path_acyclic/'\n", "\n", "kernel_para = dict(node_label = 'atom', edge_label = 'bond_type', labeled = True, cycle_bound = 200)\n", "\n", "# kernel_train_test(datafile, kernel_file_path, treeletkernel, kernel_para, normalize = False)\n", "\n", "kernel_train_test(datafile, kernel_file_path, cyclicpatternkernel, kernel_para, \\\n", " normalize = False , model_type = 'classification')\n", "\n", "# kernel_para['k_func'] = 'minmax'\n", "# kernel_train_test(datafile, kernel_file_path, untildpathkernel, kernel_para, \\\n", "# hyper_name = 'depth', hyper_range = np.linspace(0, 10, 11), normalize = True)\n", "# kernel_train_test(datafile, kernel_file_path, untildpathkernel, kernel_para, \\\n", "# hyper_name = 'depth', hyper_range = np.linspace(0, 10, 11), normalize = False)\n", "# # kernel_train_test(datafile, kernel_file_path, untildpathkernel, kernel_para, normalize = False)\n", "\n", "# kernel_para['depth'] = 10\n", "# %lprun -f untildpathkernel \\\n", "# kernel_train_test(datafile, kernel_file_path, untildpathkernel, kernel_para, normalize = False)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 2 }