Newer
Older
notebooks / metapath2vec.ipynb
Morteza Ansarinia on 3 Nov 2021 16 KB add spektral general_gnn (SOTA)
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# %conda activate py38\n",
    "# %pip install stellargraph chardet spektral -Uq"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2021-11-03 03:47:25.594278: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA\n",
      "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n"
     ]
    }
   ],
   "source": [
    "%reload_ext autoreload\n",
    "%autoreload 2\n",
    "\n",
    "import stellargraph as sg\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "StellarGraph: Undirected multigraph\n",
      " Nodes: 6, Edges: 5\n",
      "\n",
      " Node types:\n",
      "  task: [3]\n",
      "    Features: float32 vector, length 1\n",
      "    Edge types: task-default->construct, task-default->task\n",
      "  construct: [3]\n",
      "    Features: float32 vector, length 1\n",
      "    Edge types: construct-default->construct, construct-default->task\n",
      "\n",
      " Edge types:\n",
      "    task-default->task: [2]\n",
      "        Weights: range=[1, 2], mean=1.5, std=0.707107\n",
      "        Features: none\n",
      "    construct-default->construct: [2]\n",
      "        Weights: range=[10, 12], mean=11, std=1.41421\n",
      "        Features: none\n",
      "    construct-default->task: [1]\n",
      "        Weights: all 10\n",
      "        Features: none\n"
     ]
    }
   ],
   "source": [
    "tasks = pd.DataFrame(\n",
    "  [10,20,30],\n",
    "  index = ['t1','t2','t3']\n",
    ")\n",
    "\n",
    "constructs = pd.DataFrame(\n",
    "  [50,60,70],\n",
    "  index = ['c1','c2','c3']\n",
    ")\n",
    "\n",
    "edges = pd.DataFrame(\n",
    "    {'source': ['t1', 't2', 'c1', 'c2', 't1'],\n",
    "     'target': ['t2', 't3', 'c2', 'c1', 'c1'],\n",
    "     'weight': [1, 2, 10, 12, 10]},\n",
    ")\n",
    "\n",
    "G = sg.StellarGraph({'task': tasks, 'construct': constructs}, edges=edges)\n",
    "print(G.info())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of random walks: {len(walks)}\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[['c1', 'c2', 'c1', 'c2', 'c1'],\n",
       " ['c2', 'c1', 'c2', 'c1', 'c2'],\n",
       " ['c3'],\n",
       " ['t1', 'c1', 't1', 'c1', 't1'],\n",
       " ['t1', 'c1', 'c2'],\n",
       " ['t2'],\n",
       " ['t2'],\n",
       " ['t3'],\n",
       " ['t3']]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# metapath2vec\n",
    "\n",
    "rnd_walk_length = 5  # maximum length of a random walk\n",
    "\n",
    "# metapath schemas as a list of lists of node types.\n",
    "metapaths = [\n",
    "    ['task', 'construct', 'task'],\n",
    "    ['construct', 'construct'],\n",
    "    ['task', 'construct', 'construct', 'task'],\n",
    "]\n",
    "\n",
    "\n",
    "from stellargraph.data import UniformRandomMetaPathWalk\n",
    "\n",
    "rw = UniformRandomMetaPathWalk(G)\n",
    "\n",
    "walks = rw.run(\n",
    "    nodes=list(G.nodes()),  # root nodes\n",
    "    length=rnd_walk_length,  # maximum length of a random walk\n",
    "    n=1,  # number of random walks per root node\n",
    "    metapaths=metapaths,  # the metapaths\n",
    ")\n",
    "\n",
    "print('Number of random walks: {len(walks)}')\n",
    "walks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "shape: (6, 128)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[('c1', 0.0630912259221077),\n",
       " ('t2', 0.02670864760875702),\n",
       " ('t3', -0.016970207914710045),\n",
       " ('c2', -0.07985257357358932),\n",
       " ('c3', -0.15879441797733307)]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from gensim.models import Word2Vec\n",
    "\n",
    "model = Word2Vec(walks, vector_size=128, window=5, min_count=0, sg=1, workers=2, epochs=1)\n",
    "print('shape:', model.wv.vectors.shape)\n",
    "model.wv.most_similar('t1')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/Caskroom/miniforge/base/envs/py38/lib/python3.8/site-packages/sklearn/manifold/_t_sne.py:819: FutureWarning: 'square_distances' has been introduced in 0.24 to help phase out legacy squaring behavior. The 'legacy' setting will be removed in 1.1 (renaming of 0.26), and the default setting will be changed to True. In 1.3, 'square_distances' will be removed altogether, and distances will be squared by default. Set 'square_distances'=True to silence this warning.\n",
      "  warnings.warn(\n",
      "/usr/local/Caskroom/miniforge/base/envs/py38/lib/python3.8/site-packages/sklearn/manifold/_t_sne.py:982: FutureWarning: The PCA initialization in TSNE will change to have the standard deviation of PC1 equal to 1e-4 in 1.2. This will ensure better convergence.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 360x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# viz\n",
    "\n",
    "node_embeddings = model.wv.vectors\n",
    "node_types = [G.node_type(node_id) for node_id in model.wv.index_to_key]\n",
    "\n",
    "from sklearn.manifold import TSNE\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\n",
    "node_embeddings_2d = TSNE(n_components=2, learning_rate='auto', init='pca', metric='cosine').fit_transform(node_embeddings)\n",
    "node_embeddings_2d\n",
    "\n",
    "label_map = {l: i for i, l in enumerate(np.unique(node_types))}\n",
    "node_colors = [label_map[t] for t in node_types]\n",
    "\n",
    "plt.figure(figsize=(5, 5))\n",
    "plt.axes().set(aspect=\"equal\")\n",
    "plt.scatter(node_embeddings_2d[:, 0], node_embeddings_2d[:, 1], c=node_colors, alpha=0.3)\n",
    "plt.title('2d projection of the node embeddings')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "4bc0b60e31b0a7441a2e25ec194980ab62b84e91a65eae3f6b114824d9f7dec0"
  },
  "kernelspec": {
   "display_name": "Python 3.8.12 64-bit ('py38': conda)",
   "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.8.12"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}