{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!pip install pandas\n", "!pip install pysmiles\n", "!pip install networkx" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import networkx as nx\n", "from pysmiles import read_smiles" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# TD / TP -- Discriminant graph mining\n", "\n", "The objective of this TD is to implement a DFS algorithm to mine discriminant molecule graphs. \n", "We will more specifically investigate the question of Blood Brain Barrier (BBB) traversal. The BBB prevents large molecules in the blood to penetrate the brain. \n", "Knowing whether a candidate drug is capable to go through the BBB is essential to design drugs again brain diseases. \n", "Then, there are many research effort to predict whether a molecule (candidate drug) can cross the BBB.\n", "\n", "In this TP, we will use a discriminant graph mining technique. \n", "\n", "The TP is organized in three parts :\n", "1. you will discover a bit more the data and the library that we propose to use to manipulate molecules\n", "2. you will implement a frequent graph mining algorithm. As we have already seen, the problem with graphs is that there are potentially a lot of redundancies: you will do your best to address this issue.\n", "3. you will implement an disciminant graph mining approach" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Discovery of the data and the library" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### Molecule data as a graph" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#load dataset\n", "!wget https://github.com/theochem/B3DB/blob/main/B3DB/B3DB_classification.tsv" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SMILESBBB+/BBB-
0O=C(O)c1cc(N=Nc2ccc(S(=O)(=O)Nc3ccccn3)cc2)ccc1OBBB-
1COC1(NC(=O)C(C(=O)O)c2ccc(O)cc2)C(=O)N2C(C(=O)...BBB-
2Oc1c(I)cc(Cl)c2cccnc12BBB-
3CCNC(=NCCSCc1ncccc1Br)NC#NBBB-
4CN1CC[C@]23c4c5ccc(OC6O[C@H](C(=O)O)[C@@H](O)[...BBB-
.........
7802c1ccc(CN(CC2=NCCN2)c2ccccc2)cc1BBB-
7803CCOCCn1c(N2CCCN(C)CC2)nc2ccccc21BBB+
7804CN1CCC(=C2c3ccccc3CC(=O)c3sccc32)CC1BBB+
7805Cc1[nH]c(=O)c(C#N)cc1-c1ccncc1BBB-
7806Nc1cc(-c2ccncc2)c[nH]c1=OBBB-
\n", "

7807 rows × 2 columns

\n", "
" ], "text/plain": [ " SMILES BBB+/BBB-\n", "0 O=C(O)c1cc(N=Nc2ccc(S(=O)(=O)Nc3ccccn3)cc2)ccc1O BBB-\n", "1 COC1(NC(=O)C(C(=O)O)c2ccc(O)cc2)C(=O)N2C(C(=O)... BBB-\n", "2 Oc1c(I)cc(Cl)c2cccnc12 BBB-\n", "3 CCNC(=NCCSCc1ncccc1Br)NC#N BBB-\n", "4 CN1CC[C@]23c4c5ccc(OC6O[C@H](C(=O)O)[C@@H](O)[... BBB-\n", "... ... ...\n", "7802 c1ccc(CN(CC2=NCCN2)c2ccccc2)cc1 BBB-\n", "7803 CCOCCn1c(N2CCCN(C)CC2)nc2ccccc21 BBB+\n", "7804 CN1CCC(=C2c3ccccc3CC(=O)c3sccc32)CC1 BBB+\n", "7805 Cc1[nH]c(=O)c(C#N)cc1-c1ccncc1 BBB-\n", "7806 Nc1cc(-c2ccncc2)c[nH]c1=O BBB-\n", "\n", "[7807 rows x 2 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "classification_data = pd.read_csv(\"B3DB_classification.tsv\",sep=\"\\t\")\n", "#we keep only to attributes: \n", "# - SMILES: the textual description of a molecule\n", "# - BBB+/BBB-: the class\n", "classification_data=classification_data[['SMILES','BBB+/BBB-']]\n", "classification_data" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'O=C(O)c1cc(N=Nc2ccc(S(=O)(=O)Nc3ccccn3)cc2)ccc1O'" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# the SMILES of a molecule is its textual description (it is not unique!). \n", "smiles=classification_data['SMILES'].iloc[0]\n", "smiles" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Graph with 28 nodes and 30 edges\n", "[(0, 'O'), (1, 'C'), (2, 'O'), (3, 'C'), (4, 'C'), (5, 'C'), (6, 'N'), (7, 'N'), (8, 'C'), (9, 'C'), (10, 'C'), (11, 'C'), (12, 'S'), (13, 'O'), (14, 'O'), (15, 'N'), (16, 'C'), (17, 'C'), (18, 'C'), (19, 'C'), (20, 'C'), (21, 'N'), (22, 'C'), (23, 'C'), (24, 'C'), (25, 'C'), (26, 'C'), (27, 'O')]\n", "[(0, 1), (1, 2), (1, 3), (3, 4), (3, 26), (4, 5), (5, 6), (5, 24), (6, 7), (7, 8), (8, 9), (8, 23), (9, 10), (10, 11), (11, 12), (11, 22), (12, 13), (12, 14), (12, 15), (15, 16), (16, 17), (16, 21), (17, 18), (18, 19), (19, 20), (20, 21), (22, 23), (24, 25), (25, 26), (26, 27)]\n" ] } ], "source": [ "# we use the pySMILES library to automatically build a graph (represented with the NXGraph library) from the SMILES description.\n", "# In the following we will only consider the labels on the vertex, but not on the edges (double-linkage or simple linkage).\n", "# Note that the construction of the graph may also discard stereochemical information. We will then ignore this information.\n", " \n", "mol = read_smiles(smiles)\n", "print(mol)\n", "print(mol.nodes(data='element'))\n", "print(mol.edges())" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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jyflEFG7ZumknAa1JfmoOPEptMps6DWVEPv4QxY5EIG3PwSvkCiLz/KkHCIi6xgoiajds3SWt714ljcRUctxDSURtXvLJsVDYub4RXtJRAKWTYp3aptERJ6KgZKI2r3wIDmWpMQ5tc2lKXEIt7Dhh4iI/oeBkog8QmpCBOaPj3VKWwvG98GUhAintEVE1BFwDSUReZRtWUosTs+BzmC0aU2lWCRAIhKwNCWOYZKIyEYMlETkcQrLNFi0MxtH8kohFgkWg2XD9RHRwVg2KZ7T3EREdmCgJCKPlXu1Clszlci4UAKlSoMbf7MTUF+0PDk2FNOGRbA0EBGRAxgoiahDUGt1yFepUaszwEsiQpTClyfgEBE5CQMlERERETmEu7yJiIiIyCEMlERERETkEAZKIiIiInIIAyUREREROYSBkoiIiIgcwkBJRERERA5hoCQiIiIihzBQEhEREZFDGCiJiIiIyCEMlERERETkEAZKIiIiInIIAyUREREROYSBkoiIiIgcwkBJRERERA5hoCQiIiIihzBQEhEREZFDGCiJiIiIyCEMlERERETkEAZKIiIiInIIAyUREREROYSBkoiIiIgcwkBJRERERA5hoCQiIiIihzBQEhEREZFDGCiJiIiIyCEMlERERETkEAZKIiIiInIIAyUREREROYSBkoiIiIgcwkBJRERERA5hoCQiIiIihzBQEhEREZFDGCiJiIiIyCEMlERERETkEAZKIiIiInIIAyUREREROYSBkoiIiIgc8v8BkS8/goxTh+4AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#we define a draw_mol function to easily visualize the molecule graphs\n", "\n", "def draw_mol(mol):\n", " elements = nx.get_node_attributes(mol, name = \"element\")\n", " nx.draw(mol,with_labels = True, labels=elements)\n", "\n", "\n", "draw_mol(mol)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# then ... we can transform the dataframe above into a dataset of molecules\n", "dataset=[]\n", "classes=[]\n", "#for i in range(len(classification_data)):\n", "for i in range(1350,1450): #we take only 100 graphs for testing more efficiently our methods (this can be changed at the end). The location has been choosen to have a balance set of positive and negative examples.\n", " dataset.append( read_smiles(classification_data.iloc[i]['SMILES']) )\n", " classes.append( 1 if classification_data.iloc[i]['BBB+/BBB-']=='BBB+' else 0 )\n", "\n", "print( sum(classes) )" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### Manipulating graphs with the NetworkX library\n", "\n", "The NetworkX (NX) library is a powerfull library to manage and manipulate graphs in Python. \n", "We use it because it provides an efficient implementation of subgraph isomorphism test. \n", "Implementing such function by our own will be cumbersome and not efficient!\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "#create a graph from scratch\n", "pattern=nx.Graph()\n", "# add a vertex with index 0 and label 'C'. Vertex (and edges) can be multi labeled, for this \n", "# reason we have to precise \"element=\" to specify that we provide a label of the attribute \"element\"\n", "# of the vertex. This attribute name is the one choosed by pySMILES\n", "pattern.add_node(0,element='N')\n", "pattern.add_node(1,element='O')\n", "# add an edge from node 0 to node 1\n", "pattern.add_edge(0,1)\n", "\n", "# indices are unique -> the following line will \"replace\" the label of the node 0\n", "pattern.add_node(0,element='C')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[(0, 'C'), (1, 'O')]\n", "[(0, 1)]\n" ] } ], "source": [ "# have a look at your graph\n", "print(pattern.nodes(data='element'))\n", "print(pattern.edges())" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "False\n", "True\n" ] } ], "source": [ "## Creation of an isomorphic graph and test the isomorphism with NX\n", "pattern_iso=nx.Graph()\n", "pattern_iso.add_node(0,element='O')\n", "pattern_iso.add_node(1,element='S')\n", "pattern_iso.add_edge(0,1)\n", "#NB: `pattern_iso` is not isomorphic to `pattern` because of the labels!\n", "\n", "#simply test the isomorphism between the two graphs' structures: it does not take into account the labels\n", "isiso=nx.isomorphism.is_isomorphic(pattern,pattern_iso)\n", "print(isiso)\n", "\n", "# we have to add an additional matching function for nodes (look at the documentation of NX for more details)\n", "isiso=nx.isomorphism.is_isomorphic(pattern, pattern_iso, node_match=nx.isomorphism.categorical_node_match(\"element\", \"\"))\n", "print(isiso)\n", "\n", "pattern_iso.add_node(1,element='C')\n", "#NB: `pattern_iso` is now isomorphic to `pattern`\n", "isiso=nx.isomorphism.is_isomorphic(pattern, pattern_iso, node_match=nx.isomorphism.categorical_node_match(\"element\", \"\"))\n", "print(isiso)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "False\n" ] } ], "source": [ "# NX: subgraph isomorphism test\n", "# The following line illustrates how to test whether the `pattern` occurs in the molecule.\n", "matches=nx.isomorphism.GraphMatcher(mol,pattern, node_match=nx.isomorphism.categorical_node_match(\"element\", \"\")).subgraph_is_isomorphic()\n", "print(matches)\n", "\n", "# add a new node\n", "pattern.add_node(2,element='S')\n", "pattern.add_edge(1,2)\n", "matches=nx.isomorphism.GraphMatcher(mol,pattern, node_match=nx.isomorphism.categorical_node_match(\"element\", \"\")).subgraph_is_isomorphic()\n", "print(matches)\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Frequent graph mining algorithm" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "nodes_vocabulary = ['O', 'N', 'C', 'S', 'H']" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "**Q1.** Implement a function that returns a boolean vector indicating the matches of a pattern with each dataset elements" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "96\n" ] } ], "source": [ "def support(dataset, pattern):\n", " \"\"\"evaluate the support of the pattern on the dataset\"\"\"\n", " \n", " return 0\n", "\n", "#test the function\n", "p=nx.Graph()\n", "p.add_node(0,element='O')\n", "p.add_node(1,element='C')\n", "p.add_node(2,element='C')\n", "p.add_edge(0,1)\n", "p.add_edge(1,2)\n", "supp=support(dataset,p)\n", "print(sum(supp)) #expected result: 96\n", "#supp" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "**Q2.** Implement a function that checked whether a graph-pattern occurs in a list of graph patterns" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "def exists(g, patterns):\n", " \"\"\"test if the graph `g` exists in the list of `patterns` \"\"\"\n", " \n", " \n", " return False" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "**Q3.** Defines all possible extensions of a graph and then implement a function that evaluates the support of a pattern and continue the exploration (until the pattern is unfrequent or reach a maximum size $m$).\n", "\n", "The objective of this question is just to create a first version of the space exploration without any consideration of redundant exploration." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "def extend(g, dataset, sigma, fpatterns, m=5):\n", " \"\"\"Recursive pattern extention \n", " g: the current graph pattern\n", " dataset: list of graphs\n", " sigma: minimal frequency threshold\n", " fpatterns: (in/out) list of the current frequent patterns (not elegant ... but a bit simpler)\n", " m: maximum size of the graph\n", " \n", " The function does not return anything ... it uses the fpattern list as an in/out parameter\n", " \"\"\"\n", " " ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "def mine(dataset, sigma, m):\n", " \"\"\"Recursive pattern extension \n", "\n", " dataset: list of graphs\n", " sigma: minimal frequency threshold\n", " m: maximum size of the graph\n", "\n", " return a list of of frequent graph-patterns\n", " \"\"\"\n", "\n", " fpatterns=[]\n", "\n", " return fpatterns\n", " " ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "# a small example (be careful with m ... keep it very small)\n", "graphs = mine(dataset, 50, 3)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "530\n" ] } ], "source": [ "print(len(graphs))" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "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pTIyMkzHAQBI2rVrl+rWrSt/f3+tX79etWrVMh0JPohCiavSu3dvnTlzRt9++63pKADg837++WfVrVtX5cqV07p161S9enXTkeCjWDYIV+25557T2rVrtW/fPgUEBJiOAwA+6YcfflDTpk11ww03aOnSpSpfvrzpSPBhTChx1fr3768DBw5oypQppqMAgE9atWqVGjVqpDvuuEMrV66kTMI4JpS4Js2bN9e+ffu0Y8cOWa38XgIAxWXRokVq3bq16tWrpzlz5ig4ONh0JIAJJa5NXFycdu3apfnz55uOAgA+Y8aMGWrRooWaNm2q+fPnUybhNphQ4prVq1dPWVlZ2rBhgywWi+k4AODVxo4dq5deeklPPfWUxo4dK39/f9ORgIuYUOKaxcbG6scff9SaNWtMRwEArzZs2DC1b99eL730ksaPH0+ZhNthQolr5nA49M9//lOVK1fWsmXLTMcBAK/08ccfKzY2Vj179tTnn3/OHSG4JSaUuGYWi0WxsbFavny5Nm/ebDoOAHgVh8Oht956S7Gxsfq///s/yiTcGhNKuCQvL08333yz/vWvf2n69Omm4wCAV3A4HOrVq5cGDRqkTz75RH379jUdCbgkJpRwiZ+fn/r27auZM2dq7969puMAgMfLz89Xp06dNGjQIA0bNowyCY/AhBIuy8rKUkREhB599FGNHDnSdBwA8Fi5ubl64YUXNG3aNI0ePVovvPCC6UjAFWFCCZcFBQWpZ8+eGjdunA4dOmQ6DgB4pKysLD355JOaOXOmpk2bRpmER6FQolC8+uqrCg4O1hdffGE6CgB4nIyMDDVv3lzLli3T3Llz9cQTT5iOBFwVCiUKRalSpfTaa6/pm2++UVpamuk4AOAxzp49qyZNmuj777/X4sWL1axZM9ORgKtGoUShef3115WXl6dhw4aZjgIAHuHUqVNq2LChduzYofj4eNWvX990JOCa8FAOClXXrl01depUpaSkKCQkxHQcAHBbR48eVaNGjXTs2DEtX75c//jHP0xHAq4ZE0oUqt69e+vMmTMaPXq06SgA4LZSU1MVFRWltLQ0rVu3jjIJj8eEEoXu2WefVUJCgvbt28d+swDwF3v37lV0dLRsNpvi4+MVGRlpOhLgMiaUKHT9+/dXamqqpkyZYjoKALiVHTt2qG7duipRooTWrVtHmYTXYEKJIvHYY48p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oUIFffbZZ6ajAHAjixcvVrNmzfTAAw9o6dKlKlWqlOlIgM+iUMLtlShRQj169NCYMWN05MgR03EAuIGZM2eqRYsWaty4sRYsWKCQkBDTkQCfRqGER+jcubMCAwM1aNAg01EAGDZu3Di1bdtWTz75pGbMmKHAwEDTkQCfR6GERyhTpoy6dOmir7/+WmfOnDEdB4AhX331lV588UV16NBB48ePl7+/v+lIAEShhAfp0aOHcnJy9NVXX5mOAsCATz75RK+99pp69OihESNGyGazmY4E4H8olPAY1113ndq3b69BgwbpwoULpuMAKCYOh0P/93//p/79++utt97SwIED2Y4VcDMUSniUPn366NSpUxo9erTpKACKgcPhUO/evfXee+/p448/1rvvvkuZBNwQC5vD47Rr104//PCD9u7dy+enAC+Wn5+vzp07a+TIkRo2bJi6dOliOhIAJ5hQwuPExsYqJSVF06dPNx0FQBHJzc3V888/r2+//VZjx46lTAJujgklPFKzZs104MABbd26VVYrvxcB3iQ7O1tt27bVokWLNHnyZD355JOmIwG4DH4SwyPFxcVpx44dWrx4sekoAApRZmammjdvrqVLl2ru3LmUScBDMKGER3I4HHrooYckSevXr+dD+oAXOHfunB599FFt2bJFCxYsUP369U1HAnCFmFDCI1ksFsXFxen777/X+vXrTccB4KJTp06pYcOG2rZtm1asWEGZBDwME0p4LLvdrjp16igsLEyLFi0yHQfANTp69KgaNWqko0ePavny5frnP/9pOhKAq8SEEh7LarWqf//+Wrx4sbZu3Wo6DoBrkJqaqrp16yotLU3r1q2jTAIeigklPFpeXp5uuOEG3X///Zo8ebLpOACuwr59+9SwYUNZrVatXLlSkZGRpiMBuEZMKOHR/Pz81KdPH02bNk2JiYmm4wC4Qjt37lRUVJRKlCihhIQEyiTg4SiU8HgdOnRQ+fLl9dlnn5mOAuAKbN68WfXq1VOlSpW0bt06VatWzXQkAC6iUMLjlShRQj169NCYMWN09OhR03EAXMJ3332nBg0aqGbNmlq9erUqVapkOhKAQkChhFfo0qWLAgICNGjQINNRADgRHx+vmJgY/fOf/1R8fLzKlStnOhKAQkKhhFcoU6aMOnfurK+//lpnz541HQfAXyxYsECPPPKI6tatq8WL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JABAEWFCCXiguLg4bd68WfHx8aajFCg3N1fPPvusxowZo3HjxlEmAcDLMaEEPJDD4dBdd92lMmXKaOXKlabj/ElWVpbatm2rJUuWaMqUKWrdurXpSACAIsaEEvBAFotFcXFxWrVqlX788UfTcS7KyMjQY489puXLl2vevHmUSQDwEUwoAQ+Vn5+vW265Rbfddptmz55tOo7Onj2rRx55RFu3btWCBQv08MMPm44EACgmTCgBD2Wz2dSvXz/NmTNHu3btMprl5MmTatiwoXbu3Kn4+HjKJAD4GCaUgAfLzs5WZGSkYmJiNGbMGCMZjhw5okaNGun48eNasWKF6tSpYyQHAMAcJpSABwsMDFSvXr00ceJEHThwoNjfPyUlRXXr1tWZM2e0bt06yiQA+CgKJeDhOnXqpNDQUH3++efF+r579+5VVFSU8vPzlZCQoJtvvrlY3x8A4D4olICHCw0NVdeuXTVy5EidPHmyWN5zx44dioqKUkhIiBISEhQREVEs7wsAcE8USsALdOvWTQ6HQ0OHDi3y9/rpp59Ur149ValSRWvXrlXVqlWL/D0BAO6NQgl4gYoVK6pjx44aPHiwzp8/X2Tvs379ejVo0EA33nijVq1apUqVKhXZewEAPAeFEvASvXv3Vnp6ukaOHFkk51+xYoViYmJ05513avny5SpbtmyRvA8AwPOwbBDgRV588UXFx8crMTFRgYGBhXbeefPmqU2bNoqOjtbMmTNVokSJQjs3AMDzMaEEvEi/fv106NAhTZo0qdDO+ft+3M2bN9ecOXMokwCAv2FCCXiZli1bateuXdq5c6dsNpskKSM7T8mnMpSTZ1eAn1U1yocoJNDvsucaNWqUOnXqpOeff16jRo2Sn9/lvwYA4HsolICX2bBhg+6//34NnTBLJ0rdpNW7jys1LVN//ItukRRWLlj1b6qkZ+4N0w2VQ/92nkGDBqlnz57q0qWLhgwZIquVGxoAgIJRKAEvcyAtU43eHKOsMjVks1qUb3f+V/z316NqVdAHLW9X9XLBcjgcGjBggN566y3169dPH330kSwWSzFeAQDA01AoAS8ydVOq3p6/U7l5dtmv4utsVov8rBa981ht/TJrmD755BO99957evPNNymTAIDLolACXmLo6r36bPkel89zeu14vfPkferZs2chpAIA+AI+YQ94gambUgulTEpS2XrP6/qHbi+UcwEAfAMTSsDDHUjLVPQXa5WdV/BN7pzjyTr73WRlH9mr/IwzspUIlX+FMJWoda9K3fVYgV8T6GdVfM96ql4uuCijAwC8BI9tAh7ujTnblefkwZusg7t0ZFwP5RxPUsk6jVUu5lWVrNNYsliU/tN8p+fMszv0xpztRRUZAOBluOUNeLC9x9KVsO+k09fP/TBN1sAQVXnhC1mDSv7ptfyMM06/Lt/uUMK+k9p3PF21Kv19SSEAAP6ICSXgwSZtTJXN6vwp7NzTR+VfIexvZVKSbCFlLnlum9WiiRtSXY0IAPABFErAg63effyS60z6la6onKP7lHMi+arPnW93aPWe4y6kAwD4Cgol4KHOZ+cpNS3zkseUuqeVHLnZOjK6u45O6KPTq8foQtIWOfLzrug9Uk9lKiP7yo4FAPgunvIGPNTOw2f1yJD1lz0u+8genf1hhrKStsiRmy1JsgaXVvmm3RV8w72X/fpF3R5S7etLu5wXAOC9eCgH8FA5TpYJ+qvAKjeqUqs35cjPVc7xJGXu+UHpm+bpxJwPVaXDYAVUCCuU9wEA+C5ueQMeKsDv6v76Wmz+Cqxyo8rWe0HlYrpI9jxl/nb5CefVvg8AwPfwkwLwUDXKh+had9kOqFJLkpR/Pu2Sx1n+9z4AAFwKhRLwUCGBfgq7zE42WSnbVNDHpC8k/iRJ8i9X7ZJfH1Y+WCGBfDIGAHBp/KQAPFj9myppwsYUp0sHpa0YLkdutkrceL/8y1eT8vOUdWiXMnclyFa6skreEe303DarRfVvrFRU0QEAXoSnvAEPtvdYuhoNWuf09Qv7Nyvjt/XKPrRL+emn5MjPlV+piioReZdKP9D2soubx/esy045AIDLYkIJeLAbKocqqlYFfb//VIFTyhKRd6pE5J1XfV6b1aIHIstTJgEAV4TPUAIe7oOWt8vvEtsvXgs/q0UftLy9UM8JAPBeFErAw1UvF6z/NK9dqOd8t3ltVb/MAz8AAPyOQgl4gafuDlOfmBsL5Vx9Y25S27svvdg5AAB/xEM5gBeZuilVb8/fqTy7w+mT3wWxWS3ys1r0bvPalEkAwFWjUAJe5kBapt6Ys10J+07KZrVcslj+/npUrQr6oOXt3OYGAFwTCiXgpfYeS9ekjalavee4Uk9l6o9/0S3676Ll9W+spGfvC+NpbgCASyiUgA/IyM5T8qkM5eTZFeBnVY3yIeyAAwAoNBRKAAAAuISnvAEAAOASCiUAAABcQqEEAACASyiUAAAAcAmFEgAAAC6hUAIAAMAlFEoAAAC4hEIJAAAAl1AoAQAA4BIKJQAAAFxCoQQAAIBLKJQAAABwCYUSAAAALqFQAgAAwCUUSgAAALiEQgkAAACXUCgBAADgEgolAAAAXEKhBAAAgEsolAAAAHAJhRIAAAAuoVACAADAJRRKAAAAuIRCCQAAAJdQKAEAAOASCiUAAABcQqEEAACASyiUAAAAcAmFEgAAAC6hUAIAAMAlFEoAAAC4hEIJAAAAl1AoAQAA4BIKJQAAAFxCoQQAAIBLKJQAAABwCYUSAAAALvl/CvebAbdwCxgAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "draw_mol(graphs[30]) " ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "**Q4.** what is the maximum depth of the recursion for your algorithm?\n", "\n", "**Q5.** Implement an optimized version of the `extend` function:\n", "1. add a test to check whether a graph is already known as a frequent graph (use the `exists` function)\n", "2. add a technique of database projection to reduce the number of subgraph isomorphism test: instead of using the complete dataset in the recursion call, you can only use the graphs that contains the current graph `g`\n", "3. precompute a list of frequent edges to reduce the number of extensions to evaluate\n", "4. define strategy inspired by the technic of letic orders to prevent a priori from redundant searches.\n", "\n", "For each version of your code, you can compare the execution times and the number of outputs to highlight the improvements.\n", "\n", "_Warning:_ Please note that the implementation of DFS code is a bit technical. For an actually efficient graph mining algorithm, we invite you to have look at the strategies and existing implementations of gSpan or Gaston." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "def extend(g, dataset, sigma, fpatterns, m=5):\n", " \"\"\"Recursive pattern extension \n", " g: the current graph pattern\n", " dataset: list of graphs\n", " sigma: minimal frequency threshold\n", " fpatterns: (in/out) list of the current frequent patterns\n", " m: maximum size of the graph\n", " \n", " The function does not return anything ... it uses the fpattern list as an in/out parameter\n", " \"\"\"\n", " " ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "# a small example (be careful with m ... keep it very small)\n", "graphs = mine(dataset, 50, 3)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "43\n" ] } ], "source": [ "print(len(graphs))" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Discriminant pattern mining\n", "\n", "In this section, the objective is to investigate the mining of discriminant graphs, ie graphs that occur more likely in molecules that cross the BBB.\n", "\n", "For that, we start by proposing a simple algorithm which consists in extracting the frequent graphs that are discriminant.\n", "\n", "We propose to use the growth rate ($GR$) to define a discrimant pattern. More specifically, a graph is said to be discriminant if its growth rate is above a user defined threshold $\\mu$, where the growth rate is defined as follows\n", "$$gr_\\mathcal{D}(p) = \\left\\{ \\begin{array}{ll} 0 & \\text{if } supp_{\\mathcal{D}^+}(p) = supp_{\\mathcal{D}^-}(p) = 0 \\\\\n", "+\\infty & \\text{if } supp_{\\mathcal{D}^+}(p) \\neq 0 \\wedge supp_{\\mathcal{D}^-}(p) = 0 \\\\ \n", "\\frac{supp_{\\mathcal{D}^+}(p)}{supp_{\\mathcal{D}^-}(p))} & \\text{otherwise } \\end{array}\\right.$$\n", "\n", "where $\\mathcal{D}^+$ (resp. $\\mathcal{D}^-$) denotes the set of positive (resp. negative) examples.\n", "\n", "Notes that there are several alternatives to this measure. This one is simple and, contrary to the accuracy, it prevents from having too much patterns with low support. Indeed, graphs patterns with low support will have more likely high accuracy.\n", "\n", "
\n", "\n", "The approach we propose to extract discriminant graph patterns is to extract \n", "$$ \\{ g \\,\\mid\\, supp_{\\mathcal{D}^+}(p)\\geq \\sigma \\wedge gr_\\mathcal{D}(p)\\geq \\mu\\}$$\n", "where $\\sigma\\in\\mathbb{N}_+$ and $\\mu\\in\\mathbb{R}^+$ are two used defined thresholds.\n", "\n", "Then,, we propose the following algorithm:\n", "1. mine the frequent graphs in $\\mathcal{D}^+$\n", "2. for each frequent graph $g$, discard the ones that have a growth rate lower than $\\mu$" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "**Q6.** Implement the proposed strategy: we first propose to implement a function that evaluates the growth rate of a graph (*we provide this simple function*), then a function that extracts the emerging patterns. The latter will use the previously implemented mining functions." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "def gr(p,d_plus,d_moins):\n", " s_plus = len(support(d_plus,p))\n", " s_moins = len(support(d_moins,p))\n", " if s_plus==0 and s_moins==0:\n", " return 0\n", " if s_moins==0:\n", " return float(\"inf\")\n", " return float(s_plus)/float(s_moins)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "def emerging_patterns(dataset, classes, sigma, mu, m):\n", " return []" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "106" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "egraphs=emerging_patterns(dataset, classes, 50, 2.0, 4)\n", "len(egraphs)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "draw_mol(egraphs[100])" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "**Q7.** identify the graph patterns of size at most 4 with $\\sigma=100$ and $\\mu=2.0$ for the 2000-th first molecule of the dataset" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# then ... we can transform the dataframe above into a dataset of molecules\n", "dataset=[]\n", "classes=[]\n", "for i in range(0,2000):\n", " dataset.append( read_smiles(classification_data.iloc[i]['SMILES']) )\n", " classes.append( 1 if classification_data.iloc[i]['BBB+/BBB-']=='BBB+' else 0 )\n", "\n", "print( sum(classes) )" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "234" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "egraphs=emerging_patterns(dataset, classes, 100, 2.0, 4)\n", "len(egraphs)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "draw_mol(egraphs[140])" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "As a concluding remark ... we invite you to think about how to make prediction with these outputs ..." ] } ], "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.10.6" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "e7370f93d1d0cde622a1f8e1c04877d8463912d04d973331ad4851f04de6915a" } } }, "nbformat": 4, "nbformat_minor": 2 }