You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

run_cyclicpatternkernel.ipynb 116 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252
  1. {
  2. "cells": [
  3. {
  4. "cell_type": "code",
  5. "execution_count": 1,
  6. "metadata": {},
  7. "outputs": [
  8. {
  9. "name": "stdout",
  10. "output_type": "stream",
  11. "text": [
  12. "\n",
  13. " --- This is a classification problem ---\n",
  14. "\n",
  15. "\n",
  16. " #--- calculating kernel matrix when cycle_bound = 0.0 ---#\n",
  17. "\n",
  18. " Loading dataset from file...\n",
  19. "\n",
  20. " Calculating kernel matrix, this could take a while...\n",
  21. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 373.39it/s]\n",
  22. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 26367.08it/s]\n",
  23. "\n",
  24. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.18705153465270996 seconds ---\n",
  25. "[[0. 0. 0. ... 0. 0. 0.]\n",
  26. " [0. 0. 0. ... 0. 0. 0.]\n",
  27. " [0. 0. 0. ... 0. 0. 0.]\n",
  28. " ...\n",
  29. " [0. 0. 0. ... 0. 0. 0.]\n",
  30. " [0. 0. 0. ... 0. 0. 0.]\n",
  31. " [0. 0. 0. ... 0. 0. 0.]]\n",
  32. "\n",
  33. " Starting calculate accuracy/rmse...\n",
  34. "calculate performance: 83%|████████▎ | 834/1000 [00:00<00:00, 2077.02it/s]\n",
  35. " Mean performance on train set: 0.549180\n",
  36. "With standard deviation: 0.016798\n",
  37. "\n",
  38. " Mean performance on test set: 0.642857\n",
  39. "With standard deviation: 0.146385\n",
  40. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 2083.52it/s]\n",
  41. "\n",
  42. "\n",
  43. " #--- calculating kernel matrix when cycle_bound = 50.0 ---#\n",
  44. "\n",
  45. " Loading dataset from file...\n",
  46. "\n",
  47. " Calculating kernel matrix, this could take a while...\n",
  48. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 231.33it/s]\n",
  49. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 15078.65it/s]\n",
  50. "\n",
  51. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.3006291389465332 seconds ---\n",
  52. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  53. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  54. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  55. " ...\n",
  56. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  57. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  58. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  59. "\n",
  60. " Starting calculate accuracy/rmse...\n",
  61. "calculate performance: 81%|████████ | 808/1000 [00:00<00:00, 2005.12it/s]\n",
  62. " Mean performance on train set: 0.698361\n",
  63. "With standard deviation: 0.116889\n",
  64. "\n",
  65. " Mean performance on test set: 0.871429\n",
  66. "With standard deviation: 0.100000\n",
  67. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 2024.59it/s]\n",
  68. "\n",
  69. "\n",
  70. " #--- calculating kernel matrix when cycle_bound = 100.0 ---#\n",
  71. "\n",
  72. " Loading dataset from file...\n",
  73. "\n",
  74. " Calculating kernel matrix, this could take a while...\n",
  75. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 224.68it/s]\n",
  76. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 13144.65it/s]\n",
  77. "\n",
  78. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.30983662605285645 seconds ---\n",
  79. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  80. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  81. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  82. " ...\n",
  83. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  84. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  85. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  86. "\n",
  87. " Starting calculate accuracy/rmse...\n",
  88. "calculate performance: 82%|████████▏ | 821/1000 [00:00<00:00, 2050.17it/s]\n",
  89. " Mean performance on train set: 0.732787\n",
  90. "With standard deviation: 0.082637\n",
  91. "\n",
  92. " Mean performance on test set: 0.900000\n",
  93. "With standard deviation: 0.111575\n",
  94. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 2050.63it/s]\n",
  95. "\n",
  96. "\n",
  97. " #--- calculating kernel matrix when cycle_bound = 150.0 ---#\n",
  98. "\n",
  99. " Loading dataset from file...\n",
  100. "\n",
  101. " Calculating kernel matrix, this could take a while...\n",
  102. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 219.10it/s]\n",
  103. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 12644.09it/s]\n",
  104. "\n",
  105. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.31808018684387207 seconds ---\n",
  106. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  107. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  108. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  109. " ...\n",
  110. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  111. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  112. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  113. "\n",
  114. " Starting calculate accuracy/rmse...\n",
  115. "calculate performance: 99%|█████████▉| 993/1000 [00:00<00:00, 1993.90it/s]\n",
  116. " Mean performance on train set: 0.732787\n",
  117. "With standard deviation: 0.082637\n",
  118. "\n",
  119. " Mean performance on test set: 0.900000\n",
  120. "With standard deviation: 0.111575\n",
  121. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1977.95it/s]\n",
  122. "\n",
  123. "\n",
  124. " #--- calculating kernel matrix when cycle_bound = 200.0 ---#\n",
  125. "\n",
  126. " Loading dataset from file...\n",
  127. "\n",
  128. " Calculating kernel matrix, this could take a while...\n",
  129. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 219.08it/s]\n",
  130. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 14177.69it/s]\n",
  131. "\n",
  132. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.31757450103759766 seconds ---\n",
  133. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  134. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  135. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  136. " ...\n",
  137. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  138. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  139. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  140. "\n",
  141. " Starting calculate accuracy/rmse...\n",
  142. "calculate performance: 98%|█████████▊| 980/1000 [00:00<00:00, 1969.03it/s]\n",
  143. " Mean performance on train set: 0.732787\n",
  144. "With standard deviation: 0.082637\n",
  145. "\n",
  146. " Mean performance on test set: 0.900000\n",
  147. "With standard deviation: 0.111575\n",
  148. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1951.39it/s]\n",
  149. "\n",
  150. "\n",
  151. " #--- calculating kernel matrix when cycle_bound = 250.0 ---#\n",
  152. "\n",
  153. " Loading dataset from file...\n",
  154. "\n",
  155. " Calculating kernel matrix, this could take a while...\n",
  156. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 218.22it/s]\n",
  157. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 12697.56it/s]\n",
  158. "\n",
  159. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.3192298412322998 seconds ---\n",
  160. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  161. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  162. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  163. " ...\n",
  164. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  165. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  166. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  167. "\n",
  168. " Starting calculate accuracy/rmse...\n",
  169. "calculate performance: 95%|█████████▍| 946/1000 [00:00<00:00, 1878.10it/s]\n",
  170. " Mean performance on train set: 0.732787\n",
  171. "With standard deviation: 0.082637\n",
  172. "\n",
  173. " Mean performance on test set: 0.900000\n",
  174. "With standard deviation: 0.111575\n",
  175. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1875.67it/s]\n",
  176. "\n",
  177. "\n",
  178. " #--- calculating kernel matrix when cycle_bound = 300.0 ---#\n",
  179. "\n",
  180. " Loading dataset from file...\n",
  181. "\n",
  182. " Calculating kernel matrix, this could take a while...\n",
  183. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 206.81it/s]\n",
  184. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 12364.00it/s]\n",
  185. "\n",
  186. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.33614420890808105 seconds ---\n",
  187. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  188. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  189. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  190. " ...\n",
  191. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  192. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  193. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  194. "\n",
  195. " Starting calculate accuracy/rmse...\n",
  196. "calculate performance: 97%|█████████▋| 970/1000 [00:00<00:00, 1947.13it/s]\n",
  197. " Mean performance on train set: 0.732787\n",
  198. "With standard deviation: 0.082637\n",
  199. "\n",
  200. " Mean performance on test set: 0.900000\n",
  201. "With standard deviation: 0.111575\n",
  202. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1934.26it/s]\n",
  203. "\n",
  204. "\n",
  205. " #--- calculating kernel matrix when cycle_bound = 350.0 ---#\n",
  206. "\n",
  207. " Loading dataset from file...\n",
  208. "\n",
  209. " Calculating kernel matrix, this could take a while...\n",
  210. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 189.65it/s]\n",
  211. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 13989.93it/s]\n",
  212. "\n",
  213. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.3654501438140869 seconds ---\n",
  214. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  215. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  216. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  217. " ...\n",
  218. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  219. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  220. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  221. "\n",
  222. " Starting calculate accuracy/rmse...\n",
  223. "calculate performance: 95%|█████████▍| 946/1000 [00:00<00:00, 1875.81it/s]\n",
  224. " Mean performance on train set: 0.732787\n",
  225. "With standard deviation: 0.082637\n",
  226. "\n",
  227. " Mean performance on test set: 0.900000\n",
  228. "With standard deviation: 0.111575\n",
  229. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1881.94it/s]\n",
  230. "\n",
  231. "\n",
  232. " #--- calculating kernel matrix when cycle_bound = 400.0 ---#\n",
  233. "\n",
  234. " Loading dataset from file...\n",
  235. "\n",
  236. " Calculating kernel matrix, this could take a while...\n",
  237. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 220.95it/s]\n",
  238. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 14281.34it/s]\n",
  239. "\n",
  240. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.3142852783203125 seconds ---\n",
  241. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  242. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  243. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  244. " ...\n",
  245. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  246. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  247. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  248. "\n",
  249. " Starting calculate accuracy/rmse...\n",
  250. "calculate performance: 95%|█████████▌| 952/1000 [00:00<00:00, 1900.77it/s]\n",
  251. " Mean performance on train set: 0.732787\n",
  252. "With standard deviation: 0.082637\n",
  253. "\n",
  254. " Mean performance on test set: 0.900000\n",
  255. "With standard deviation: 0.111575\n"
  256. ]
  257. },
  258. {
  259. "name": "stdout",
  260. "output_type": "stream",
  261. "text": [
  262. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1900.46it/s]\n",
  263. "\n",
  264. "\n",
  265. " #--- calculating kernel matrix when cycle_bound = 450.0 ---#\n",
  266. "\n",
  267. " Loading dataset from file...\n",
  268. "\n",
  269. " Calculating kernel matrix, this could take a while...\n",
  270. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 212.09it/s]\n",
  271. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 11357.62it/s]\n",
  272. "\n",
  273. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.3287320137023926 seconds ---\n",
  274. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  275. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  276. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  277. " ...\n",
  278. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  279. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  280. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  281. "\n",
  282. " Starting calculate accuracy/rmse...\n",
  283. "calculate performance: 98%|█████████▊| 981/1000 [00:00<00:00, 1956.30it/s]\n",
  284. " Mean performance on train set: 0.732787\n",
  285. "With standard deviation: 0.082637\n",
  286. "\n",
  287. " Mean performance on test set: 0.900000\n",
  288. "With standard deviation: 0.111575\n",
  289. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1952.54it/s]\n",
  290. "\n",
  291. "\n",
  292. " #--- calculating kernel matrix when cycle_bound = 500.0 ---#\n",
  293. "\n",
  294. " Loading dataset from file...\n",
  295. "\n",
  296. " Calculating kernel matrix, this could take a while...\n",
  297. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 208.14it/s]\n",
  298. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 12536.27it/s]\n",
  299. "\n",
  300. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.3347315788269043 seconds ---\n",
  301. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  302. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  303. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  304. " ...\n",
  305. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  306. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  307. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  308. "\n",
  309. " Starting calculate accuracy/rmse...\n",
  310. "calculate performance: 98%|█████████▊| 979/1000 [00:00<00:00, 1970.30it/s]\n",
  311. " Mean performance on train set: 0.732787\n",
  312. "With standard deviation: 0.082637\n",
  313. "\n",
  314. " Mean performance on test set: 0.900000\n",
  315. "With standard deviation: 0.111575\n",
  316. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1950.19it/s]\n",
  317. "\n",
  318. "\n",
  319. " #--- calculating kernel matrix when cycle_bound = 550.0 ---#\n",
  320. "\n",
  321. " Loading dataset from file...\n",
  322. "\n",
  323. " Calculating kernel matrix, this could take a while...\n",
  324. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 208.06it/s]\n",
  325. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 13816.44it/s]\n",
  326. "\n",
  327. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.3341798782348633 seconds ---\n",
  328. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  329. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  330. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  331. " ...\n",
  332. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  333. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  334. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  335. "\n",
  336. " Starting calculate accuracy/rmse...\n",
  337. "calculate performance: 97%|█████████▋| 974/1000 [00:00<00:00, 1930.44it/s]\n",
  338. " Mean performance on train set: 0.732787\n",
  339. "With standard deviation: 0.082637\n",
  340. "\n",
  341. " Mean performance on test set: 0.900000\n",
  342. "With standard deviation: 0.111575\n",
  343. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1937.89it/s]\n",
  344. "\n",
  345. "\n",
  346. " #--- calculating kernel matrix when cycle_bound = 600.0 ---#\n",
  347. "\n",
  348. " Loading dataset from file...\n",
  349. "\n",
  350. " Calculating kernel matrix, this could take a while...\n",
  351. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 213.56it/s]\n",
  352. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 13048.43it/s]\n",
  353. "\n",
  354. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.32569050788879395 seconds ---\n",
  355. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  356. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  357. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  358. " ...\n",
  359. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  360. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  361. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  362. "\n",
  363. " Starting calculate accuracy/rmse...\n",
  364. "calculate performance: 97%|█████████▋| 972/1000 [00:00<00:00, 1924.82it/s]\n",
  365. " Mean performance on train set: 0.732787\n",
  366. "With standard deviation: 0.082637\n",
  367. "\n",
  368. " Mean performance on test set: 0.900000\n",
  369. "With standard deviation: 0.111575\n",
  370. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1935.68it/s]\n",
  371. "\n",
  372. "\n",
  373. " #--- calculating kernel matrix when cycle_bound = 650.0 ---#\n",
  374. "\n",
  375. " Loading dataset from file...\n",
  376. "\n",
  377. " Calculating kernel matrix, this could take a while...\n",
  378. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 216.51it/s]\n",
  379. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 9669.54it/s]\n",
  380. "\n",
  381. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.3229689598083496 seconds ---\n",
  382. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  383. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  384. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  385. " ...\n",
  386. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  387. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  388. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  389. "\n",
  390. " Starting calculate accuracy/rmse...\n",
  391. "calculate performance: 98%|█████████▊| 983/1000 [00:00<00:00, 1963.08it/s]\n",
  392. " Mean performance on train set: 0.732787\n",
  393. "With standard deviation: 0.082637\n",
  394. "\n",
  395. " Mean performance on test set: 0.900000\n",
  396. "With standard deviation: 0.111575\n",
  397. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1960.32it/s]\n",
  398. "\n",
  399. "\n",
  400. " #--- calculating kernel matrix when cycle_bound = 700.0 ---#\n",
  401. "\n",
  402. " Loading dataset from file...\n",
  403. "\n",
  404. " Calculating kernel matrix, this could take a while...\n",
  405. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 208.61it/s]\n",
  406. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 13485.23it/s]\n",
  407. "\n",
  408. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.33377623558044434 seconds ---\n",
  409. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  410. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  411. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  412. " ...\n",
  413. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  414. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  415. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  416. "\n",
  417. " Starting calculate accuracy/rmse...\n",
  418. "calculate performance: 81%|████████ | 812/1000 [00:00<00:00, 2020.52it/s]\n",
  419. " Mean performance on train set: 0.732787\n",
  420. "With standard deviation: 0.082637\n",
  421. "\n",
  422. " Mean performance on test set: 0.900000\n",
  423. "With standard deviation: 0.111575\n",
  424. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 2029.28it/s]\n",
  425. "\n",
  426. "\n",
  427. " #--- calculating kernel matrix when cycle_bound = 750.0 ---#\n",
  428. "\n",
  429. " Loading dataset from file...\n",
  430. "\n",
  431. " Calculating kernel matrix, this could take a while...\n",
  432. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 223.54it/s]\n",
  433. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 13952.29it/s]\n",
  434. "\n",
  435. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.31093406677246094 seconds ---\n",
  436. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  437. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  438. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  439. " ...\n",
  440. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  441. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  442. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  443. "\n",
  444. " Starting calculate accuracy/rmse...\n",
  445. "calculate performance: 82%|████████▎ | 825/1000 [00:00<00:00, 2053.32it/s]\n",
  446. " Mean performance on train set: 0.732787\n",
  447. "With standard deviation: 0.082637\n",
  448. "\n",
  449. " Mean performance on test set: 0.900000\n",
  450. "With standard deviation: 0.111575\n",
  451. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 2055.77it/s]\n",
  452. "\n",
  453. "\n",
  454. " #--- calculating kernel matrix when cycle_bound = 800.0 ---#\n",
  455. "\n",
  456. " Loading dataset from file...\n",
  457. "\n",
  458. " Calculating kernel matrix, this could take a while...\n",
  459. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 223.35it/s]\n",
  460. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 13220.82it/s]\n",
  461. "\n",
  462. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.31124091148376465 seconds ---\n",
  463. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  464. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  465. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  466. " ...\n",
  467. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  468. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  469. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  470. "\n",
  471. " Starting calculate accuracy/rmse...\n",
  472. "calculate performance: 96%|█████████▌| 959/1000 [00:00<00:00, 1925.40it/s]\n",
  473. " Mean performance on train set: 0.732787\n",
  474. "With standard deviation: 0.082637\n",
  475. "\n",
  476. " Mean performance on test set: 0.900000\n",
  477. "With standard deviation: 0.111575\n",
  478. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1912.78it/s]\n",
  479. "\n",
  480. "\n",
  481. " #--- calculating kernel matrix when cycle_bound = 850.0 ---#\n",
  482. "\n",
  483. " Loading dataset from file...\n",
  484. "\n",
  485. " Calculating kernel matrix, this could take a while...\n",
  486. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 202.00it/s]\n",
  487. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 12487.42it/s]\n",
  488. "\n",
  489. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.34392237663269043 seconds ---\n",
  490. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  491. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  492. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  493. " ...\n",
  494. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  495. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  496. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  497. "\n",
  498. " Starting calculate accuracy/rmse...\n",
  499. "calculate performance: 95%|█████████▍| 946/1000 [00:00<00:00, 1869.41it/s]\n",
  500. " Mean performance on train set: 0.732787\n",
  501. "With standard deviation: 0.082637\n",
  502. "\n",
  503. " Mean performance on test set: 0.900000\n",
  504. "With standard deviation: 0.111575\n"
  505. ]
  506. },
  507. {
  508. "name": "stdout",
  509. "output_type": "stream",
  510. "text": [
  511. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1883.23it/s]\n",
  512. "\n",
  513. "\n",
  514. " #--- calculating kernel matrix when cycle_bound = 900.0 ---#\n",
  515. "\n",
  516. " Loading dataset from file...\n",
  517. "\n",
  518. " Calculating kernel matrix, this could take a while...\n",
  519. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 217.23it/s]\n",
  520. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 13956.38it/s]\n",
  521. "\n",
  522. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.32010626792907715 seconds ---\n",
  523. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  524. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  525. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  526. " ...\n",
  527. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  528. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  529. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  530. "\n",
  531. " Starting calculate accuracy/rmse...\n",
  532. "calculate performance: 99%|█████████▉| 989/1000 [00:00<00:00, 1978.29it/s]\n",
  533. " Mean performance on train set: 0.732787\n",
  534. "With standard deviation: 0.082637\n",
  535. "\n",
  536. " Mean performance on test set: 0.900000\n",
  537. "With standard deviation: 0.111575\n",
  538. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1968.44it/s]\n",
  539. "\n",
  540. "\n",
  541. " #--- calculating kernel matrix when cycle_bound = 950.0 ---#\n",
  542. "\n",
  543. " Loading dataset from file...\n",
  544. "\n",
  545. " Calculating kernel matrix, this could take a while...\n",
  546. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 228.56it/s]\n",
  547. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 14794.72it/s]\n",
  548. "\n",
  549. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.30414795875549316 seconds ---\n",
  550. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  551. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  552. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  553. " ...\n",
  554. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  555. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  556. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  557. "\n",
  558. " Starting calculate accuracy/rmse...\n",
  559. "calculate performance: 83%|████████▎ | 829/1000 [00:00<00:00, 2063.72it/s]\n",
  560. " Mean performance on train set: 0.732787\n",
  561. "With standard deviation: 0.082637\n",
  562. "\n",
  563. " Mean performance on test set: 0.900000\n",
  564. "With standard deviation: 0.111575\n",
  565. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 2068.06it/s]\n",
  566. "\n",
  567. "\n",
  568. " #--- calculating kernel matrix when cycle_bound = 1000.0 ---#\n",
  569. "\n",
  570. " Loading dataset from file...\n",
  571. "\n",
  572. " Calculating kernel matrix, this could take a while...\n",
  573. "retrieve patterns: 100%|██████████| 68/68 [00:00<00:00, 223.02it/s]\n",
  574. "calculate kernels: 100%|██████████| 68/68 [00:00<00:00, 13702.27it/s]\n",
  575. "\n",
  576. " --- kernel matrix of cyclic pattern kernel of size 68 built in 0.3120880126953125 seconds ---\n",
  577. "[[ 8. 8. 8. ... 8. 8. 8.]\n",
  578. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  579. " [ 8. 8. 8. ... 8. 8. 8.]\n",
  580. " ...\n",
  581. " [ 8. 8. 8. ... 10. 9. 9.]\n",
  582. " [ 8. 8. 8. ... 9. 10. 10.]\n",
  583. " [ 8. 8. 8. ... 9. 10. 10.]]\n",
  584. "\n",
  585. " Starting calculate accuracy/rmse...\n",
  586. "calculate performance: 82%|████████▎ | 825/1000 [00:00<00:00, 2054.81it/s]\n",
  587. " Mean performance on train set: 0.732787\n",
  588. "With standard deviation: 0.082637\n",
  589. "\n",
  590. " Mean performance on test set: 0.900000\n",
  591. "With standard deviation: 0.111575\n",
  592. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 2022.62it/s]\n",
  593. "\n",
  594. "\n",
  595. " cycle_bound accur_test std_test accur_train std_train k_time\n",
  596. "------------- ------------ ---------- ------------- ----------- --------\n",
  597. " 0 0.642857 0.146385 0.54918 0.0167983 0.187052\n",
  598. " 50 0.871429 0.1 0.698361 0.116889 0.300629\n",
  599. " 100 0.9 0.111575 0.732787 0.0826366 0.309837\n",
  600. " 150 0.9 0.111575 0.732787 0.0826366 0.31808\n",
  601. " 200 0.9 0.111575 0.732787 0.0826366 0.317575\n",
  602. " 250 0.9 0.111575 0.732787 0.0826366 0.31923\n",
  603. " 300 0.9 0.111575 0.732787 0.0826366 0.336144\n",
  604. " 350 0.9 0.111575 0.732787 0.0826366 0.36545\n",
  605. " 400 0.9 0.111575 0.732787 0.0826366 0.314285\n",
  606. " 450 0.9 0.111575 0.732787 0.0826366 0.328732\n",
  607. " 500 0.9 0.111575 0.732787 0.0826366 0.334732\n",
  608. " 550 0.9 0.111575 0.732787 0.0826366 0.33418\n",
  609. " 600 0.9 0.111575 0.732787 0.0826366 0.325691\n",
  610. " 650 0.9 0.111575 0.732787 0.0826366 0.322969\n",
  611. " 700 0.9 0.111575 0.732787 0.0826366 0.333776\n",
  612. " 750 0.9 0.111575 0.732787 0.0826366 0.310934\n",
  613. " 800 0.9 0.111575 0.732787 0.0826366 0.311241\n",
  614. " 850 0.9 0.111575 0.732787 0.0826366 0.343922\n",
  615. " 900 0.9 0.111575 0.732787 0.0826366 0.320106\n",
  616. " 950 0.9 0.111575 0.732787 0.0826366 0.304148\n",
  617. " 1000 0.9 0.111575 0.732787 0.0826366 0.312088\n"
  618. ]
  619. }
  620. ],
  621. "source": [
  622. "# MAO dataset (node labeled, edge labeled, undirected, cyclic + linear, classification)\n",
  623. "%load_ext line_profiler\n",
  624. "\n",
  625. "import sys\n",
  626. "sys.path.insert(0, \"../\")\n",
  627. "from pygraph.utils.utils import kernel_train_test\n",
  628. "from pygraph.kernels.cyclicPatternKernel import cyclicpatternkernel\n",
  629. "\n",
  630. "import numpy as np\n",
  631. "\n",
  632. "datafile = '../../../../datasets/MAO/dataset.ds'\n",
  633. "kernel_file_path = 'kernelmatrices_cyclicpattern_mao/'\n",
  634. "\n",
  635. "kernel_para = dict(node_label = 'atom', edge_label = 'bond_type', labeled = True)\n",
  636. "\n",
  637. "kernel_train_test(datafile, kernel_file_path, cyclicpatternkernel, kernel_para, \\\n",
  638. " hyper_name = 'cycle_bound', hyper_range = np.linspace(0, 500, 21), normalize = False,\n",
  639. " model_type = 'classification')"
  640. ]
  641. },
  642. {
  643. "cell_type": "code",
  644. "execution_count": 2,
  645. "metadata": {},
  646. "outputs": [
  647. {
  648. "name": "stdout",
  649. "output_type": "stream",
  650. "text": [
  651. "The line_profiler extension is already loaded. To reload it, use:\n",
  652. " %reload_ext line_profiler\n",
  653. "\n",
  654. " --- This is a classification problem ---\n",
  655. "\n",
  656. "\n",
  657. " #--- calculating kernel matrix when cycle_bound = 0.0 ---#\n",
  658. "\n",
  659. " Loading dataset from file...\n",
  660. "\n",
  661. " Calculating kernel matrix, this could take a while...\n",
  662. "retrieve patterns: 100%|██████████| 94/94 [00:00<00:00, 176.07it/s]\n",
  663. "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 18331.07it/s]\n",
  664. "\n",
  665. " --- kernel matrix of cyclic pattern kernel of size 94 built in 0.5411422252655029 seconds ---\n",
  666. "[[0. 0. 0. ... 0. 0. 0.]\n",
  667. " [0. 0. 0. ... 0. 0. 0.]\n",
  668. " [0. 0. 0. ... 0. 0. 0.]\n",
  669. " ...\n",
  670. " [0. 0. 0. ... 0. 0. 0.]\n",
  671. " [0. 0. 0. ... 0. 0. 0.]\n",
  672. " [0. 0. 0. ... 0. 0. 0.]]\n",
  673. "\n",
  674. " Starting calculate accuracy/rmse...\n",
  675. "calculate performance: 95%|█████████▌| 951/1000 [00:00<00:00, 1898.18it/s]\n",
  676. " Mean performance on train set: 0.629762\n",
  677. "With standard deviation: 0.013521\n",
  678. "\n",
  679. " Mean performance on test set: 0.610000\n",
  680. "With standard deviation: 0.113578\n",
  681. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1889.49it/s]\n",
  682. "\n",
  683. "\n",
  684. " #--- calculating kernel matrix when cycle_bound = 10.0 ---#\n",
  685. "\n",
  686. " Loading dataset from file...\n",
  687. "\n",
  688. " Calculating kernel matrix, this could take a while...\n",
  689. "retrieve patterns: 100%|██████████| 94/94 [00:00<00:00, 165.16it/s]\n",
  690. "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 16217.54it/s]\n",
  691. "\n",
  692. " --- kernel matrix of cyclic pattern kernel of size 94 built in 0.5770719051361084 seconds ---\n",
  693. "[[0. 0. 0. ... 0. 0. 0.]\n",
  694. " [0. 0. 0. ... 0. 0. 0.]\n",
  695. " [0. 0. 0. ... 0. 0. 0.]\n",
  696. " ...\n",
  697. " [0. 0. 0. ... 0. 0. 0.]\n",
  698. " [0. 0. 0. ... 0. 0. 0.]\n",
  699. " [0. 0. 0. ... 0. 0. 0.]]\n",
  700. "\n",
  701. " Starting calculate accuracy/rmse...\n",
  702. "calculate performance: 94%|█████████▍| 940/1000 [00:00<00:00, 1876.61it/s]\n",
  703. " Mean performance on train set: 0.629762\n",
  704. "With standard deviation: 0.013521\n",
  705. "\n",
  706. " Mean performance on test set: 0.610000\n",
  707. "With standard deviation: 0.113578\n",
  708. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1866.80it/s]\n",
  709. "\n",
  710. "\n",
  711. " #--- calculating kernel matrix when cycle_bound = 20.0 ---#\n",
  712. "\n",
  713. " Loading dataset from file...\n",
  714. "\n",
  715. " Calculating kernel matrix, this could take a while...\n",
  716. "retrieve patterns: 100%|██████████| 94/94 [00:00<00:00, 165.21it/s]\n",
  717. "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 16888.61it/s]\n",
  718. "\n",
  719. " --- kernel matrix of cyclic pattern kernel of size 94 built in 0.5768516063690186 seconds ---\n",
  720. "[[3. 0. 0. ... 0. 0. 0.]\n",
  721. " [0. 0. 0. ... 0. 0. 0.]\n",
  722. " [0. 0. 0. ... 0. 0. 0.]\n",
  723. " ...\n",
  724. " [0. 0. 0. ... 0. 0. 0.]\n",
  725. " [0. 0. 0. ... 0. 0. 0.]\n",
  726. " [0. 0. 0. ... 0. 0. 0.]]\n",
  727. "\n",
  728. " Starting calculate accuracy/rmse...\n",
  729. "calculate performance: 93%|█████████▎| 926/1000 [00:00<00:00, 1837.36it/s]\n",
  730. " Mean performance on train set: 0.629762\n",
  731. "With standard deviation: 0.013521\n",
  732. "\n",
  733. " Mean performance on test set: 0.610000\n",
  734. "With standard deviation: 0.113578\n",
  735. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1841.13it/s]\n",
  736. "\n",
  737. "\n",
  738. " #--- calculating kernel matrix when cycle_bound = 30.0 ---#\n",
  739. "\n",
  740. " Loading dataset from file...\n",
  741. "\n",
  742. " Calculating kernel matrix, this could take a while...\n",
  743. "retrieve patterns: 100%|██████████| 94/94 [00:00<00:00, 171.51it/s]\n",
  744. "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 17701.46it/s]\n",
  745. "\n",
  746. " --- kernel matrix of cyclic pattern kernel of size 94 built in 0.5560076236724854 seconds ---\n",
  747. "[[3. 3. 3. ... 0. 0. 0.]\n",
  748. " [3. 4. 4. ... 0. 0. 0.]\n",
  749. " [3. 4. 4. ... 0. 0. 0.]\n",
  750. " ...\n",
  751. " [0. 0. 0. ... 0. 0. 0.]\n",
  752. " [0. 0. 0. ... 0. 0. 0.]\n",
  753. " [0. 0. 0. ... 0. 0. 0.]]\n",
  754. "\n",
  755. " Starting calculate accuracy/rmse...\n",
  756. "calculate performance: 92%|█████████▏| 923/1000 [00:00<00:00, 1845.18it/s]\n",
  757. " Mean performance on train set: 0.633333\n",
  758. "With standard deviation: 0.015793\n",
  759. "\n",
  760. " Mean performance on test set: 0.640000\n",
  761. "With standard deviation: 0.111355\n",
  762. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1836.56it/s]\n",
  763. "\n",
  764. "\n",
  765. " #--- calculating kernel matrix when cycle_bound = 40.0 ---#\n",
  766. "\n",
  767. " Loading dataset from file...\n",
  768. "\n",
  769. " Calculating kernel matrix, this could take a while...\n",
  770. "retrieve patterns: 100%|██████████| 94/94 [00:00<00:00, 159.66it/s]\n",
  771. "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 17703.84it/s]\n",
  772. "\n",
  773. " --- kernel matrix of cyclic pattern kernel of size 94 built in 0.5963354110717773 seconds ---\n",
  774. "[[3. 3. 3. ... 0. 0. 0.]\n",
  775. " [3. 4. 4. ... 0. 0. 0.]\n",
  776. " [3. 4. 4. ... 0. 0. 0.]\n",
  777. " ...\n",
  778. " [0. 0. 0. ... 0. 0. 0.]\n",
  779. " [0. 0. 0. ... 0. 0. 0.]\n",
  780. " [0. 0. 0. ... 0. 0. 0.]]\n",
  781. "\n",
  782. " Starting calculate accuracy/rmse...\n",
  783. "calculate performance: 84%|████████▍ | 845/1000 [00:00<00:00, 1694.10it/s]\n",
  784. " Mean performance on train set: 0.633333\n",
  785. "With standard deviation: 0.015793\n",
  786. "\n",
  787. " Mean performance on test set: 0.640000\n",
  788. "With standard deviation: 0.111355\n",
  789. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1694.34it/s]\n",
  790. "\n",
  791. "\n",
  792. " #--- calculating kernel matrix when cycle_bound = 50.0 ---#\n",
  793. "\n",
  794. " Loading dataset from file...\n",
  795. "\n",
  796. " Calculating kernel matrix, this could take a while...\n",
  797. "retrieve patterns: 100%|██████████| 94/94 [00:00<00:00, 126.36it/s]\n",
  798. "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 14863.89it/s]\n",
  799. "\n",
  800. " --- kernel matrix of cyclic pattern kernel of size 94 built in 0.7526798248291016 seconds ---\n",
  801. "[[3. 3. 3. ... 0. 0. 0.]\n",
  802. " [3. 4. 4. ... 0. 0. 0.]\n",
  803. " [3. 4. 4. ... 0. 0. 0.]\n",
  804. " ...\n",
  805. " [0. 0. 0. ... 0. 0. 0.]\n",
  806. " [0. 0. 0. ... 0. 0. 0.]\n",
  807. " [0. 0. 0. ... 0. 0. 0.]]\n",
  808. "\n",
  809. " Starting calculate accuracy/rmse...\n",
  810. "calculate performance: 84%|████████▍ | 842/1000 [00:00<00:00, 1670.86it/s]\n",
  811. " Mean performance on train set: 0.658333\n",
  812. "With standard deviation: 0.034524\n",
  813. "\n",
  814. " Mean performance on test set: 0.670000\n",
  815. "With standard deviation: 0.090000\n",
  816. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1665.11it/s]\n",
  817. "\n",
  818. "\n",
  819. " #--- calculating kernel matrix when cycle_bound = 60.0 ---#\n",
  820. "\n",
  821. " Loading dataset from file...\n",
  822. "\n",
  823. " Calculating kernel matrix, this could take a while...\n",
  824. "retrieve patterns: 100%|██████████| 94/94 [00:00<00:00, 107.33it/s]\n",
  825. "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 13937.03it/s]\n",
  826. "\n",
  827. " --- kernel matrix of cyclic pattern kernel of size 94 built in 0.8846912384033203 seconds ---\n",
  828. "[[3. 3. 3. ... 0. 0. 0.]\n",
  829. " [3. 4. 4. ... 0. 0. 0.]\n",
  830. " [3. 4. 4. ... 0. 0. 0.]\n",
  831. " ...\n",
  832. " [0. 0. 0. ... 0. 0. 0.]\n",
  833. " [0. 0. 0. ... 0. 0. 0.]\n",
  834. " [0. 0. 0. ... 0. 0. 0.]]\n",
  835. "\n",
  836. " Starting calculate accuracy/rmse...\n",
  837. "calculate performance: 83%|████████▎ | 829/1000 [00:00<00:00, 1653.86it/s]\n",
  838. " Mean performance on train set: 0.671429\n",
  839. "With standard deviation: 0.036577\n",
  840. "\n",
  841. " Mean performance on test set: 0.680000\n",
  842. "With standard deviation: 0.107703\n",
  843. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1673.57it/s]\n",
  844. "\n",
  845. "\n",
  846. " #--- calculating kernel matrix when cycle_bound = 70.0 ---#\n",
  847. "\n",
  848. " Loading dataset from file...\n",
  849. "\n",
  850. " Calculating kernel matrix, this could take a while...\n",
  851. "retrieve patterns: 100%|██████████| 94/94 [00:01<00:00, 81.45it/s] \n",
  852. "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 14275.64it/s]\n",
  853. "\n",
  854. " --- kernel matrix of cyclic pattern kernel of size 94 built in 1.1631414890289307 seconds ---\n",
  855. "[[3. 3. 3. ... 3. 3. 3.]\n",
  856. " [3. 4. 4. ... 4. 4. 4.]\n",
  857. " [3. 4. 4. ... 4. 4. 4.]\n",
  858. " ...\n",
  859. " [3. 4. 4. ... 7. 7. 7.]\n",
  860. " [3. 4. 4. ... 7. 7. 7.]\n",
  861. " [3. 4. 4. ... 7. 7. 7.]]\n",
  862. "\n",
  863. " Starting calculate accuracy/rmse...\n",
  864. "calculate performance: 88%|████████▊ | 876/1000 [00:00<00:00, 1761.00it/s]\n",
  865. " Mean performance on train set: 0.666667\n",
  866. "With standard deviation: 0.038021\n",
  867. "\n",
  868. " Mean performance on test set: 0.670000\n",
  869. "With standard deviation: 0.100499\n",
  870. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1754.20it/s]\n",
  871. "\n",
  872. "\n",
  873. " #--- calculating kernel matrix when cycle_bound = 80.0 ---#\n",
  874. "\n",
  875. " Loading dataset from file...\n",
  876. "\n",
  877. " Calculating kernel matrix, this could take a while...\n",
  878. "retrieve patterns: 100%|██████████| 94/94 [00:01<00:00, 79.93it/s] \n",
  879. "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 14789.73it/s]\n",
  880. "\n",
  881. " --- kernel matrix of cyclic pattern kernel of size 94 built in 1.1846554279327393 seconds ---\n",
  882. "[[3. 3. 3. ... 3. 3. 3.]\n",
  883. " [3. 4. 4. ... 4. 4. 4.]\n",
  884. " [3. 4. 4. ... 4. 4. 4.]\n",
  885. " ...\n",
  886. " [3. 4. 4. ... 7. 7. 7.]\n",
  887. " [3. 4. 4. ... 7. 7. 7.]\n",
  888. " [3. 4. 4. ... 7. 7. 7.]]\n",
  889. "\n",
  890. " Starting calculate accuracy/rmse...\n",
  891. "calculate performance: 93%|█████████▎| 926/1000 [00:00<00:00, 1854.59it/s]\n",
  892. " Mean performance on train set: 0.709524\n",
  893. "With standard deviation: 0.058853\n",
  894. "\n",
  895. " Mean performance on test set: 0.780000\n",
  896. "With standard deviation: 0.107703\n",
  897. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1844.77it/s]\n",
  898. "\n",
  899. "\n",
  900. " #--- calculating kernel matrix when cycle_bound = 90.0 ---#\n",
  901. "\n",
  902. " Loading dataset from file...\n",
  903. "\n",
  904. " Calculating kernel matrix, this could take a while...\n"
  905. ]
  906. },
  907. {
  908. "name": "stdout",
  909. "output_type": "stream",
  910. "text": [
  911. "retrieve patterns: 100%|██████████| 94/94 [00:01<00:00, 83.75it/s] \n",
  912. "calculate kernels: 100%|██████████| 94/94 [00:00<00:00, 14169.95it/s]\n",
  913. "\n",
  914. " --- kernel matrix of cyclic pattern kernel of size 94 built in 1.1314406394958496 seconds ---\n",
  915. "[[3. 3. 3. ... 3. 3. 3.]\n",
  916. " [3. 4. 4. ... 4. 4. 4.]\n",
  917. " [3. 4. 4. ... 4. 4. 4.]\n",
  918. " ...\n",
  919. " [3. 4. 4. ... 7. 7. 7.]\n",
  920. " [3. 4. 4. ... 7. 7. 7.]\n",
  921. " [3. 4. 4. ... 7. 7. 7.]]\n",
  922. "\n",
  923. " Starting calculate accuracy/rmse...\n",
  924. "calculate performance: 94%|█████████▍| 943/1000 [00:00<00:00, 1878.69it/s]\n",
  925. " Mean performance on train set: 0.709524\n",
  926. "With standard deviation: 0.058853\n",
  927. "\n",
  928. " Mean performance on test set: 0.780000\n",
  929. "With standard deviation: 0.107703\n",
  930. "calculate performance: 100%|██████████| 1000/1000 [00:00<00:00, 1872.55it/s]\n",
  931. "\n",
  932. "\n",
  933. " cycle_bound accur_test std_test accur_train std_train k_time\n",
  934. "------------- ------------ ---------- ------------- ----------- --------\n",
  935. " 0 0.61 0.113578 0.629762 0.0135212 0.541142\n",
  936. " 10 0.61 0.113578 0.629762 0.0135212 0.577072\n",
  937. " 20 0.61 0.113578 0.629762 0.0135212 0.576852\n",
  938. " 30 0.64 0.111355 0.633333 0.0157935 0.556008\n",
  939. " 40 0.64 0.111355 0.633333 0.0157935 0.596335\n",
  940. " 50 0.67 0.09 0.658333 0.0345238 0.75268\n",
  941. " 60 0.68 0.107703 0.671429 0.0365769 0.884691\n",
  942. " 70 0.67 0.100499 0.666667 0.0380208 1.16314\n",
  943. " 80 0.78 0.107703 0.709524 0.0588534 1.18466\n",
  944. " 90 0.78 0.107703 0.709524 0.0588534 1.13144\n"
  945. ]
  946. }
  947. ],
  948. "source": [
  949. "# PAH dataset (node and edge unlabeled, undirected, cyclic, classification)\n",
  950. "%load_ext line_profiler\n",
  951. "\n",
  952. "import sys\n",
  953. "sys.path.insert(0, \"../\")\n",
  954. "from pygraph.utils.utils import kernel_train_test\n",
  955. "from pygraph.kernels.cyclicPatternKernel import cyclicpatternkernel\n",
  956. "\n",
  957. "import numpy as np\n",
  958. "\n",
  959. "datafile = '../../../../datasets/PAH/dataset.ds'\n",
  960. "kernel_file_path = 'kernelmatrices_cyclicpattern_pah/'\n",
  961. "\n",
  962. "\n",
  963. "kernel_para = dict(node_label = 'atom', edge_label = 'bond_type', labeled = False)\n",
  964. "\n",
  965. "kernel_train_test(datafile, kernel_file_path, cyclicpatternkernel, kernel_para, \\\n",
  966. " hyper_name = 'cycle_bound', hyper_range = np.linspace(0, 90, 10), normalize = False, \\\n",
  967. " model_type = 'classification')"
  968. ]
  969. },
  970. {
  971. "cell_type": "code",
  972. "execution_count": null,
  973. "metadata": {},
  974. "outputs": [],
  975. "source": [
  976. "# results\n",
  977. "\n",
  978. "# MAO dataset\n",
  979. "cycle_bound accur_test std_test accur_train std_train k_time\n",
  980. "------------- ------------ ---------- ------------- ----------- --------\n",
  981. " 0 0.642857 0.146385 0.54918 0.0167983 0.187052\n",
  982. " 50 0.871429 0.1 0.698361 0.116889 0.300629\n",
  983. " 100 0.9 0.111575 0.732787 0.0826366 0.309837\n",
  984. " 150 0.9 0.111575 0.732787 0.0826366 0.31808\n",
  985. " 200 0.9 0.111575 0.732787 0.0826366 0.317575\n",
  986. " \n",
  987. "# PAH dataset\n",
  988. " cycle_bound accur_test std_test accur_train std_train k_time\n",
  989. "------------- ------------ ---------- ------------- ----------- --------\n",
  990. " 0 0.61 0.113578 0.629762 0.0135212 0.521801\n",
  991. " 10 0.61 0.113578 0.629762 0.0135212 0.52589\n",
  992. " 20 0.61 0.113578 0.629762 0.0135212 0.548528\n",
  993. " 30 0.64 0.111355 0.633333 0.0157935 0.535311\n",
  994. " 40 0.64 0.111355 0.633333 0.0157935 0.61764\n",
  995. " 50 0.67 0.09 0.658333 0.0345238 0.733868\n",
  996. " 60 0.68 0.107703 0.671429 0.0365769 0.871147\n",
  997. " 70 0.67 0.100499 0.666667 0.0380208 1.12625\n",
  998. " 80 0.78 0.107703 0.709524 0.0588534 1.19828\n",
  999. " 90 0.78 0.107703 0.709524 0.0588534 1.21182"
  1000. ]
  1001. },
  1002. {
  1003. "cell_type": "code",
  1004. "execution_count": null,
  1005. "metadata": {},
  1006. "outputs": [
  1007. {
  1008. "name": "stdout",
  1009. "output_type": "stream",
  1010. "text": [
  1011. "\n",
  1012. " --- This is a classification problem ---\n",
  1013. "\n",
  1014. "\n",
  1015. " #--- calculating kernel matrix when cycle_bound = 1000.0 ---#\n",
  1016. "\n",
  1017. " Loading dataset from file...\n",
  1018. "load SDF: 100%|██████████| 4457424/4457424 [00:10<00:00, 408299.51it/s]\n",
  1019. "ajust data: 100%|██████████| 42687/42687 [00:10<00:00, 4092.17it/s] \n",
  1020. "\n",
  1021. " Calculating kernel matrix, this could take a while...\n",
  1022. "retrieve patterns: 100%|██████████| 42682/42682 [19:36<00:00, 36.27it/s]\n",
  1023. "calculate kernels: 100%|██████████| 42682/42682 [37:05<00:00, 19.18it/s] \n",
  1024. "\n",
  1025. " --- kernel matrix of cyclic pattern kernel of size 42682 built in 3402.171978712082 seconds ---\n",
  1026. "[[ 9. 9. 3. ... 4. 3. 4.]\n",
  1027. " [ 9. 11. 5. ... 6. 5. 6.]\n",
  1028. " [ 3. 5. 16. ... 6. 6. 6.]\n",
  1029. " ...\n",
  1030. " [ 4. 6. 6. ... 30. 29. 6.]\n",
  1031. " [ 3. 5. 6. ... 29. 29. 6.]\n",
  1032. " [ 4. 6. 6. ... 6. 6. 11.]]\n",
  1033. "\n",
  1034. " Starting calculate accuracy/rmse...\n",
  1035. "calculate performance: 7%|▋ | 70/1000 [1:34:57<227:25:45, 880.37s/it]"
  1036. ]
  1037. }
  1038. ],
  1039. "source": [
  1040. "# NCI-HIV dataset (labeled?, directed?, cyclic, classification)\n",
  1041. "%load_ext line_profiler\n",
  1042. "\n",
  1043. "import sys\n",
  1044. "sys.path.insert(0, \"../\")\n",
  1045. "from pygraph.utils.utils import kernel_train_test\n",
  1046. "from pygraph.kernels.cyclicPatternKernel import cyclicpatternkernel\n",
  1047. "\n",
  1048. "import numpy as np\n",
  1049. "\n",
  1050. "datafile = '../../../../datasets/NCI-HIV/AIDO99SD.sdf'\n",
  1051. "datafile_y = '../../../../datasets/NCI-HIV/aids_conc_may04.txt'\n",
  1052. "kernel_file_path = 'kernelmatrices_path_acyclic/'\n",
  1053. "\n",
  1054. "kernel_para = dict(node_label = 'atom', edge_label = 'bond_type', labeled = True)\n",
  1055. "\n",
  1056. "kernel_train_test(datafile, kernel_file_path, cyclicpatternkernel, kernel_para, \\\n",
  1057. " hyper_name = 'cycle_bound', hyper_range = np.linspace(0, 1000, 21), normalize = False, \\\n",
  1058. " datafile_y = datafile_y, model_type = 'classification')\n",
  1059. "\n",
  1060. "# kernel_para = dict(node_label = 'atom', edge_label = 'bond_type', labeled = True, cycle_bound = 200)\n",
  1061. "\n",
  1062. "# kernel_train_test(datafile, kernel_file_path, cyclicpatternkernel, kernel_para,\n",
  1063. "# normalize = False, datafile_y = datafile_y, model_type = 'classification')\n",
  1064. "\n",
  1065. "# kernel_para['k_func'] = 'minmax'\n",
  1066. "# kernel_train_test(datafile, kernel_file_path, untildpathkernel, kernel_para, \\\n",
  1067. "# hyper_name = 'depth', hyper_range = np.linspace(0, 10, 11), normalize = True)\n",
  1068. "# kernel_train_test(datafile, kernel_file_path, untildpathkernel, kernel_para, \\\n",
  1069. "# hyper_name = 'depth', hyper_range = np.linspace(0, 10, 11), normalize = False)\n",
  1070. "# # kernel_train_test(datafile, kernel_file_path, untildpathkernel, kernel_para, normalize = False)\n",
  1071. "\n",
  1072. "# kernel_para['depth'] = 10\n",
  1073. "# %lprun -f untildpathkernel \\\n",
  1074. "# kernel_train_test(datafile, kernel_file_path, untildpathkernel, kernel_para, normalize = False)"
  1075. ]
  1076. },
  1077. {
  1078. "cell_type": "code",
  1079. "execution_count": 19,
  1080. "metadata": {},
  1081. "outputs": [
  1082. {
  1083. "name": "stdout",
  1084. "output_type": "stream",
  1085. "text": [
  1086. "The line_profiler extension is already loaded. To reload it, use:\n",
  1087. " %reload_ext line_profiler\n"
  1088. ]
  1089. },
  1090. {
  1091. "data": {
  1092. "image/png": "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\n",
  1093. "text/plain": [
  1094. "<matplotlib.figure.Figure at 0x7f71ccb78400>"
  1095. ]
  1096. },
  1097. "metadata": {},
  1098. "output_type": "display_data"
  1099. },
  1100. {
  1101. "data": {
  1102. "image/png": "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\n",
  1103. "text/plain": [
  1104. "<matplotlib.figure.Figure at 0x7f71ccb339b0>"
  1105. ]
  1106. },
  1107. "metadata": {},
  1108. "output_type": "display_data"
  1109. },
  1110. {
  1111. "name": "stdout",
  1112. "output_type": "stream",
  1113. "text": [
  1114. "\n",
  1115. " --- kernel matrix of cyclic pattern kernel of size 999 built in 18.78946042060852 seconds ---\n",
  1116. "(array([[11., 5., 5., ..., 6., 7., 3.],\n",
  1117. " [ 5., 16., 6., ..., 5., 5., 3.],\n",
  1118. " [ 5., 6., 8., ..., 4., 5., 3.],\n",
  1119. " ...,\n",
  1120. " [ 6., 5., 4., ..., 17., 7., 4.],\n",
  1121. " [ 7., 5., 5., ..., 7., 15., 4.],\n",
  1122. " [ 3., 3., 3., ..., 4., 4., 11.]]), 18.78946042060852)\n"
  1123. ]
  1124. }
  1125. ],
  1126. "source": [
  1127. "%load_ext line_profiler\n",
  1128. "\n",
  1129. "import networkx as nx\n",
  1130. "import matplotlib.pyplot as plt\n",
  1131. "import sys\n",
  1132. "sys.path.insert(0, \"../\")\n",
  1133. "from pygraph.utils.graphfiles import loadDataset\n",
  1134. "from pygraph.kernels.cyclicPatternKernel import cyclicpatternkernel\n",
  1135. "\n",
  1136. "# datafile = '../../../../datasets/NCI-HIV/AIDO99SD.sdf'\n",
  1137. "# datafile_y = '../../../../datasets/NCI-HIV/aids_conc_may04.txt'\n",
  1138. "# dataset, y = loadDataset(datafile, datafile_y)\n",
  1139. "G1 = dataset[1]\n",
  1140. "G2 = dataset[2]\n",
  1141. "G3 = dataset[3]\n",
  1142. "G4 = dataset[4]\n",
  1143. "G5 = dataset[5]\n",
  1144. "data = [G1, G2, G3, G4, G5]\n",
  1145. "nx.draw_networkx(G1)\n",
  1146. "plt.show()\n",
  1147. "nx.draw_networkx(G2)\n",
  1148. "plt.show()\n",
  1149. "\n",
  1150. "kernel = cyclicpatternkernel(dataset[1:1000], cycle_bound = 1000)\n",
  1151. "print(kernel)"
  1152. ]
  1153. },
  1154. {
  1155. "cell_type": "code",
  1156. "execution_count": 1,
  1157. "metadata": {},
  1158. "outputs": [
  1159. {
  1160. "name": "stdout",
  1161. "output_type": "stream",
  1162. "text": [
  1163. "\n",
  1164. " --- This is a classification problem ---\n",
  1165. "\n",
  1166. "\n",
  1167. " Loading dataset from file...\n",
  1168. "\n",
  1169. " Calculating kernel matrix, this could take a while...\n",
  1170. "retrieve patterns: 100%|██████████| 185/185 [00:00<00:00, 2064.69it/s]\n",
  1171. "calculate kernels: 100%|██████████| 185/185 [00:00<00:00, 11170.00it/s]\n",
  1172. "\n",
  1173. " --- kernel matrix of cyclic pattern kernel of size 185 built in 0.10836505889892578 seconds ---\n",
  1174. "[[0. 0. 0. ... 0. 0. 0.]\n",
  1175. " [0. 0. 0. ... 0. 0. 0.]\n",
  1176. " [0. 0. 0. ... 0. 0. 0.]\n",
  1177. " ...\n",
  1178. " [0. 0. 0. ... 0. 0. 0.]\n",
  1179. " [0. 0. 0. ... 0. 0. 0.]\n",
  1180. " [0. 0. 0. ... 0. 0. 0.]]\n",
  1181. "\n",
  1182. " Starting calculate accuracy/rmse...\n",
  1183. "calculate performance: 100%|██████████| 1000/1000 [00:24<00:00, 36.41it/s]\n",
  1184. " Mean performance on train set: 0.018072\n",
  1185. "With standard deviation: 0.000000\n",
  1186. "\n",
  1187. " Mean performance on test set: 0.000000\n",
  1188. "With standard deviation: 0.000000\n",
  1189. "\n",
  1190. "\n",
  1191. " accur_test std_test accur_train std_train k_time\n",
  1192. "------------ ---------- ------------- ----------- --------\n",
  1193. " 0 0 0.0180723 0 0.108365\n"
  1194. ]
  1195. }
  1196. ],
  1197. "source": [
  1198. "# acyclic dataset (node labeled, edge labeled, undirected, linear + non-linear, regression)\n",
  1199. "%load_ext line_profiler\n",
  1200. "\n",
  1201. "import sys\n",
  1202. "sys.path.insert(0, \"../\")\n",
  1203. "from pygraph.utils.utils import kernel_train_test\n",
  1204. "from pygraph.kernels.cyclicPatternKernel import cyclicpatternkernel\n",
  1205. "\n",
  1206. "import numpy as np\n",
  1207. "\n",
  1208. "datafile = '../../../../datasets/acyclic/Acyclic/dataset_bps.ds'\n",
  1209. "kernel_file_path = 'kernelmatrices_path_acyclic/'\n",
  1210. "\n",
  1211. "kernel_para = dict(node_label = 'atom', edge_label = 'bond_type', labeled = True, cycle_bound = 200)\n",
  1212. "\n",
  1213. "# kernel_train_test(datafile, kernel_file_path, treeletkernel, kernel_para, normalize = False)\n",
  1214. "\n",
  1215. "kernel_train_test(datafile, kernel_file_path, cyclicpatternkernel, kernel_para, \\\n",
  1216. " normalize = False , model_type = 'classification')\n",
  1217. "\n",
  1218. "# kernel_para['k_func'] = 'minmax'\n",
  1219. "# kernel_train_test(datafile, kernel_file_path, untildpathkernel, kernel_para, \\\n",
  1220. "# hyper_name = 'depth', hyper_range = np.linspace(0, 10, 11), normalize = True)\n",
  1221. "# kernel_train_test(datafile, kernel_file_path, untildpathkernel, kernel_para, \\\n",
  1222. "# hyper_name = 'depth', hyper_range = np.linspace(0, 10, 11), normalize = False)\n",
  1223. "# # kernel_train_test(datafile, kernel_file_path, untildpathkernel, kernel_para, normalize = False)\n",
  1224. "\n",
  1225. "# kernel_para['depth'] = 10\n",
  1226. "# %lprun -f untildpathkernel \\\n",
  1227. "# kernel_train_test(datafile, kernel_file_path, untildpathkernel, kernel_para, normalize = False)"
  1228. ]
  1229. }
  1230. ],
  1231. "metadata": {
  1232. "kernelspec": {
  1233. "display_name": "Python 3",
  1234. "language": "python",
  1235. "name": "python3"
  1236. },
  1237. "language_info": {
  1238. "codemirror_mode": {
  1239. "name": "ipython",
  1240. "version": 3
  1241. },
  1242. "file_extension": ".py",
  1243. "mimetype": "text/x-python",
  1244. "name": "python",
  1245. "nbconvert_exporter": "python",
  1246. "pygments_lexer": "ipython3",
  1247. "version": "3.5.2"
  1248. }
  1249. },
  1250. "nbformat": 4,
  1251. "nbformat_minor": 2
  1252. }

A Python package for graph kernels, graph edit distances and graph pre-image problem.