{ "cells": [ { "cell_type": "markdown", "id": "b12508af-69b5-4663-b8c6-771853be4d15", "metadata": {}, "source": [ "# Tutorial: Cell2Vec - Embedding Cells using Topological Deep Learning\n", "\n", "\n", "In this tutorial, we explored Cell2Vec, a method for embedding cells in cell or simplicial complexes using topological deep learning. We implemented Cell2Vec using TopoEmbedX and demonstrated the visualization of cell embeddings.\n" ] }, { "cell_type": "markdown", "id": "ff32d87d-2411-4054-b6e8-f0774d7522b7", "metadata": {}, "source": [ "In this tutorial, we will explore Cell2Vec, a method for embedding cells using topological deep learning techniques. Node2Vec is a generalization of the DeepWalk algorithm to cell or simplicial complexes, enabling the generation of meaningful embeddings for cells of varying dimensions (0, 1, or 2) within a topological domain.\n", "\n", "### Table of Contents\n", "\n", "* Introduction\n", "* Understanding Node2Vec\n", "* Generalizing Node2Vec to Cell2Vec\n", "* Implementation in Python using TopoEmbedX\n", "* Visualization of Cell Embeddings\n", "* Conclusion and Further Steps" ] }, { "cell_type": "markdown", "id": "03c12f22-8c15-45dc-abaa-4d5956d61447", "metadata": {}, "source": [ "## Understanding Node2Vec\n", "Node2Vec is an algorithm used for generating embeddings in graph-structured data, such as social networks or citation networks. It extends the idea of Word2Vec to graphs, aiming to learn low-dimensional vector representations for nodes that preserve the network structure.\n", "\n", "The key concept in Node2Vec is the notion of biased random walks. Instead of performing simple random walks, Node2Vec introduces parameters to control the walk behavior. These parameters allow the random walker to balance between exploring the neighborhood locally (BFS-like) and jumping to far-away nodes (DFS-like). This biased random walk strategy helps in capturing the node neighborhood structure effectively.\n", "\n", "## Generalizing Node2Vec to Cell2Vec\n", "Cell2Vec extends the principles of Node2Vec to cell or simplicial complexes, where nodes represent cells (vertices, edges, or faces), and edges represent connections between cells. By leveraging biased random walks on the cell complex, Cell2Vec captures the topological structure effectively, enabling the generation of meaningful embeddings for cells.\n", "\n", "## Implementation in Python using TopoEmbedX\n", "To implement Cell2Vec, we will utilize the TopoEmbedX library, which provides tools for topological representation learning. We will demonstrate how to use TopoEmbedX to create a model, fit it to a cell complex, and obtain cell embeddings." ] }, { "cell_type": "code", "execution_count": 69, "id": "b7f8e498-d9b1-4e71-bbcc-bbacd49ec65c", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAK7CAYAAADFiN+fAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB0PElEQVR4nO3deVxV1f7/8fcRkEEZUkRQyCE1TVMxMoccyDnHzMo0x7pWTpVmw1crbLCywYmwexskS62rkpWRRqalqTmnpZUppCbkQIKKIHL27w9+nOsRDhsQOAyv5+PBo87aa+/12bAy3u6917YYhmEIAAAAAOBQFWcXAAAAAABlHcEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJQKURHR0ti8Vi+3J1dVVwcLDGjBmjv/76q1jHql+/vkaPHl2sx7xcVFSUoqOjc7UnJCTIYrHkua0s+eSTT9S8eXN5enrKYrFoz549+fY/fPiwJk6cqCZNmsjT01NeXl5q3ry5ZsyYUaSfXc5cSEhIsLWNHj1a9evXL/AxvvjiC/Xv31+1a9dW1apVVaNGDXXr1k1LlixRZmZmoWsqTRaLRREREaU6ZknMzXfffVeDBg1S/fr15enpqUaNGunhhx9WYmJirr6X/7fv4uKia665Rq1atdKDDz6orVu3FltNACouV2cXAAClbdGiRWratKkuXLig77//Xi+//LK+++477du3T9WqVSuWMT799FP5+PgUy7HyEhUVJX9//1zhLCgoSFu2bNF1111XYmNfrZMnT2rEiBHq3bu3oqKi5O7uriZNmjjsv3r1ag0dOlT+/v6aOHGiQkNDZbFYtG/fPr3//vv68ssvtXv37lKr3zAMjR07VtHR0br99tv15ptvKiQkRCkpKVq/fr3Gjx+vU6dO6ZFHHim1msqDkpibzz33nMLDwzVr1izVrVtXv/32m1544QV99tln2r17t2rXrm3Xf8iQIZo6daoMw1Bqaqp+/vlnLV68WP/5z380efJkzZs3r9hqA1DxEJwAVDotWrRQWFiYJCk8PFxZWVl64YUXtGrVKg0fPjzPfdLS0uTl5VXgMUJDQ4ul1sJyd3dXu3btnDJ2Qf3+++/KzMzUfffdpy5duuTbNz4+XkOHDlWTJk20fv16+fr62rbddtttmjx5sj799NOSLtnOa6+9pujoaM2cOVPPPvus3bb+/fvriSee0B9//FGqNZUHJTE3d+/erYCAANvnLl26qE2bNrr55pv1zjvvaMaMGXb9a9eubVdDr1699Oijj2rcuHGaP3++mjZtqocffrhYawRQcXCrHoBKL+cXqT///FNS9i1b1atX1759+9SzZ095e3urW7dukqTk5GSNHz9edevWVdWqVdWwYUNNnz5dGRkZdsfM61a91NRUPf7442rQoIGqVq2qunXr6tFHH9X58+ft+lmtVi1YsECtW7eWp6en/Pz81K5dO33++ee2Y//yyy/67rvvbLce5dxi5uh2qE2bNqlbt27y9vaWl5eXOnTooC+//NKuT87ta+vXr9fDDz8sf39/1axZU4MHD9bx48cL9L38/PPP1b59e3l5ecnb21s9evTQli1bbNtHjx6tW2+9VZJ0zz33yGKxqGvXrg6P9+abb+r8+fOKioqyC005LBaLBg8ebNf2zTffqFu3bvLx8ZGXl5c6duyodevWFah+M5mZmXr11VfVtGlTPfPMM3n2CQwMtJ2jVPA5Y7FYNHHiRC1atEjXX3+9PD09FRYWpq1bt8owDL322mtq0KCBqlevrttuuy1XOOvatatatGihjRs3ql27dvL09FTdunX1zDPPKCsry/TckpKS9OCDDyo4OFhVq1ZVgwYNNHPmTF26dElS9pW222+/XTVr1tSRI0ds+6Wlpal58+Zq1qxZrrl8ubzmZkREhCwWi3755Rfde++98vX1Ve3atTV27FilpKSY1nx5aMpx0003ycXFRUePHjXdX5JcXFwUGRkpf39/vfbaawXaB0DlRHACUOnl/AJaq1YtW9vFixc1YMAA3Xbbbfrss880c+ZMpaenKzw8XIsXL9aUKVP05Zdf6r777tPs2bNz/fJ+pbS0NHXp0kUffPCBJk+erK+++kpPPvmkoqOjNWDAABmGYes7evRoPfLII7r55pv1ySef6OOPP9aAAQNsz+N8+umnatiwoUJDQ7VlyxZt2bIl36su3333nW677TalpKTovffe07Jly+Tt7a3+/fvrk08+ydX/gQcekJubm5YuXarZs2drw4YNuu+++0y/j0uXLtXAgQPl4+OjZcuW6b333tM///yjrl27atOmTZKkZ555Rm+99ZYkadasWdqyZYuioqIcHvPrr7/OdZUgPx999JF69uwpHx8fffDBB/rvf/+rGjVqqFevXsUSnnbs2KHk5GQNHDhQFovFtH9h58zq1av17rvv6pVXXtGyZct09uxZ9e3bV1OnTtUPP/ygyMhI/ec//9H+/ft155132s0bKTv8DB06VMOHD9dnn32mIUOG6MUXXzS9bTApKUlt27bV2rVr9eyzz+qrr77S/fffr5dffln/+te/JGUHuw8//FBeXl66++67bc9xjR8/XvHx8frvf/9b5Ftd77zzTjVp0kQrV67UU089paVLl+qxxx4r0rG+++47ZWVlqXnz5gXex9PTU927d1d8fLyOHTtWpHEBVAIGAFQSixYtMiQZW7duNTIzM42zZ88aq1evNmrVqmV4e3sbSUlJhmEYxqhRowxJxvvvv2+3/9tvv21IMv773//atb/66quGJOPrr7+2tdWrV88YNWqU7fPLL79sVKlSxdi+fbvdvitWrDAkGbGxsYZhGMb3339vSDKmT5+e77k0b97c6NKlS672+Ph4Q5KxaNEiW1u7du2MgIAA4+zZs7a2S5cuGS1atDCCg4MNq9Vq9/0ZP3683TFnz55tSDISExMd1pOVlWXUqVPHuPHGG42srCxb+9mzZ42AgACjQ4cOtrb169cbkozly5fne46GYRgeHh5Gu3btTPsZhmGcP3/eqFGjhtG/f/9ctbVq1cpo27atrS3nXOPj421to0aNMurVq5fvGB9//LEhyXj77bcLVFNh5owkIzAw0Dh37pytbdWqVYYko3Xr1rafk2EYxty5cw1Jxt69e21tXbp0MSQZn332md1Y//rXv4wqVaoYf/75p91Yzz33nO3zgw8+aFSvXt2uj2EYxuuvv25IMn755Rdb26ZNmwxXV1fj0UcfNd5//31DkvHuu++afi/ympvPPfecIcmYPXu2Xd/x48cbHh4edudcEKmpqUazZs2MkJAQu/luGNnnPGHCBIf7Pvnkk4Yk48cffyzUmAAqD644Aah02rVrJzc3N3l7e6tfv34KDAzUV199letB8jvvvNPu87fffqtq1appyJAhdu05t+Tld0Vj9erVatGihVq3bq1Lly7Zvnr16iWLxaINGzZIkr766itJ0oQJE67yLLOdP39eP/74o4YMGaLq1avb2l1cXDRixAgdO3ZMv/32m90+AwYMsPvcsmVLSf+7lTEvv/32m44fP64RI0aoSpX//a+levXquvPOO7V161alpaUVxyk5tHnzZiUnJ2vUqFF232Or1arevXtr+/bt+d5KVhIKO2fCw8Ptrto0a9ZMktSnTx+7K1w57Vf+TLy9vXP9/IYNGyar1arvv//eYZ2rV69WeHi46tSpY/e969Onj6Tsqzg5OnbsqJdeeklz587Vww8/rPvuu0/3339/vt8HM3nNufT0dJ04caLAx0hPT9fgwYP1559/avny5XbzvSCMK67eAcCVWBwCQKWzePFiNWvWTK6urqpdu7aCgoJy9fHy8sq1Kt7p06cVGBiY6xatgIAAubq66vTp0w7H/Pvvv/XHH3/Izc0tz+2nTp2SlL3inIuLiwIDAwt7Wnn6559/ZBhGnudYp04dScpVd82aNe0+u7u7S5IuXLjgcJycYzgax2q16p9//inUAhuSdO211yo+Pr5Aff/++29JyhVSLpecnHxVKydee+21klTgmgo7Z2rUqGH3uWrVqvm2p6en27VfGf4l2eaS2fz84osvTOdnjuHDh+uZZ55RRkaGpk2b5vC4BVWUOXe5jIwM3XHHHdq0aZNWr16tW265pdA15ITQnP8uAOBKBCcAlU6zZs1sq+o5ktfzKzVr1tSPP/4owzDstp84cUKXLl2Sv7+/w+P5+/vL09NT77//vsPtUvZzVllZWUpKSsozhBTWNddcoypVquT5XpucBR/yq7ugcn7xdTROlSpVdM011xT6uL169dKCBQu0detW0+eccs5jwYIFDvvmFSwKIywsTDVq1NBnn32ml19+2fQ5p6uZM0WREx4vl5SUZKvFEX9/f7Vs2VIvvfRSntsvDxNZWVkaPny4rrnmGrm7u+v+++/XDz/8YAtzpS0jI0ODBg3S+vXr9dlnn9kWcimMCxcu6JtvvtF1112n4ODgEqgSQEXArXoAUEDdunXTuXPntGrVKrv2xYsX27Y70q9fPx06dEg1a9ZUWFhYrq+cVfFybo1auHBhvrW4u7sX6G/jq1WrpltuuUUxMTF2/a1Wqz766CMFBwfn+w6lgrr++utVt25dLV261O6Wp/Pnz2vlypW2lfYK67HHHlO1atU0fvz4PFdZMwzDtjBGx44d5efnp/379+f5PQ4LC7vqX+7d3Nz05JNP6tdff9ULL7yQZ58TJ07ohx9+kHR1c6Yozp49a1t9McfSpUtVpUoVde7c2eF+/fr1088//6zrrrsuz+/b5cHpueee08aNG7VkyRJ98skn+umnn4rlqlNR5Fxp+vbbb7Vy5Ur16tWr0MfIysrSxIkTdfr0aT355JMlUCWAioIrTgBQQCNHjtRbb72lUaNGKSEhQTfeeKM2bdqkWbNm6fbbb1f37t0d7vvoo49q5cqV6ty5sx577DG1bNlSVqtVR44c0ddff62pU6fqlltuUadOnTRixAi9+OKL+vvvv9WvXz+5u7tr9+7d8vLy0qRJkyRJN954oz7++GN98sknatiwoTw8PHTjjTfmOfbLL7+sHj16KDw8XI8//riqVq2qqKgo/fzzz1q2bFmBVoczU6VKFc2ePVvDhw9Xv3799OCDDyojI0Ovvfaazpw5o1deeaVIx23QoIE+/vhj3XPPPWrdurXtBbiStH//fr3//vsyDEN33HGHqlevrgULFmjUqFFKTk7WkCFDFBAQoJMnT+qnn37SyZMnTQNpQUybNk0HDhzQc889p23btmnYsGG2F+B+//33+s9//qOZM2eqY8eOVzVniqJmzZp6+OGHdeTIETVp0kSxsbF655139PDDD9tuM8zL888/r7i4OHXo0EGTJ0/W9ddfr/T0dCUkJCg2NlZvv/22goODFRcXp5dfflnPPPOMLfS9/PLLevzxx9W1a1fdcccdxXo+ZoYMGaKvvvpK06dPV82aNbV161bbNh8fH91www12/f/++2/b8u5nz561vQD3p59+0mOPPWZbQRAA8uS8dSkAoHTlrKR25cp2Vxo1apRRrVq1PLedPn3aeOihh4ygoCDD1dXVqFevnvH0008b6enpdv3q1atnjB492q7t3LlzxowZM4zrr7/eqFq1quHr62vceOONxmOPPWZb0c8wsleBmzNnjtGiRQtbv/bt2xtffPGFrU9CQoLRs2dPw9vb25BkWw0ur5XLDMMwNm7caNx2221GtWrVDE9PT6Ndu3Z2x8vv+5OzCt769evz/b4ZRvYqcLfccovh4eFhVKtWzejWrZvxww8/5Hm8gqyql+PQoUPG+PHjjUaNGhnu7u6Gp6enccMNNxhTpkyxWxnPMAzju+++M/r27WvUqFHDcHNzM+rWrWv07dvXbryirqp3uc8++8zo27evUatWLcPV1dW45pprjPDwcOPtt982MjIybP0KOmeUx6pvOT/P1157za49r+9hly5d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69Zp4cKFkrKfgYqNjVXnzp01duxYNWnSREOHDlVCQoJq165d5LHHjRunJUuWFHq/0aNHq2vXrvn2Wbx4sW655Rb17dtXXbp0kZubm9asWSM3Nzdbn2XLlmn48OFOWY+A4FRBjB49WhaLRRaLRW5ubmrYsKEef/xxnT9//qqOe8899+j3338vpipLP4jlfE8sFou8vb0VFhammJiYAu8/b948RUdHF3rMVatWFa5QAACAQggKClJkZKQSEhKUkZGhY8eO6bPPPrMLJ97e3po/f77++usvXbx4UUeOHNFHH31kW947IiJCe/bssfWPjo42/R1m1KhROn78uLZu3eqwT0JCgh599NFcbWbBycfHR++9957++ecfnT59WjExMXZLkZ88eVIrVqzQk08+me9xSgrBqYRkZUkbNkjLlmX/szTeUdu7d28lJibq8OHDevHFFxUVFaXHH388z76ZmZkFOqanp6cCAgKKs8xSt2jRIiUmJmr79u1q1aqV7rrrLm3ZsqVA+/r6+pbZK24AAAClzcPDQ4sXL9apU6cKvM/Zs2d16NAhh7+XFlR8fLyioqLUoEGDqzpOURGcSkBMjFS/vhQeLg0blv3P+vWz20uSu7u7AgMDFRISomHDhmn48OG2vzWIiIhQ69at9f7776thw4Zyd3eXYRg6cuSIBg4cqOrVq8vHx0d33323/v77b9sx87pC9MUXX+imm26Sh4eHGjZsqJkzZ9qt5X/mzBmNGzdOtWvXloeHh1q0aKHVq1drw4YNGjNmjFJSUmxXgSIiIiRlLwX/xBNPqG7duqpWrZpuueWWXKvAREdH69prr5WXl5fuuOMOnT59ukDfFz8/PwUGBqpp06Z6++235eHhoc8//1yStG/fPt12223y9PRUzZo1NW7cOJ07d86275W36nXt2lWTJ0/WE088oRo1aigwMNB2DpJsD1/ecccdslgsts8//fSTwsPD5e3tLR8fH910001Fvr8YAADAmbp06aJ+/foVuL+3t7eOHj2q6tWrX9W4bdu21T333HNVx7gaBKdiFhMjDRkiHTtm3/7XX9ntJR2eLufp6Wl3ZemPP/7Qf//7X61cudJ2WXbQoEFKTk7Wd999p7i4OB06dCjfCbl27Vrdd999mjx5svbv369///vfio6O1ksvvSQpe+nLPn36aPPmzfroo4+0f/9+vfLKK3JxcVGHDh00d+5c+fj4KDExUYmJiba/eRgzZox++OEHffzxx9q7d6/uuusu9e7dWwcPHpQk/fjjjxo7dqzGjx+vPXv2KDw8XC+++GKhvydubm5ydXVVZmam0tLS1Lt3b11zzTXavn27li9frm+++UYTJ07M9xgffPCBqlWrph9//FGzZ8/W888/r7i4OEnS9u3bJdlf5ZKyV5wJDg7W9u3btXPnTj311FN29+sCAACgbGM58mKUlSU98oj0/99LZscwJItFevRRaeBAycWlZGvZtm2bli5dqm7dutnaLl68qA8//NC27n1cXJz27t2r+Ph42/2jH374oZo3b67t27fr5ptvznXcl156SU899ZRGjRolSWrYsKFeeOEFPfHEE3ruuef0zTffaNu2bTpw4ICaNGli65PD19dXFotFgYGBtrZDhw5p2bJlOnbsmOrUqSNJevzxx7VmzRotWrTI9gbpXr166amnnpKUvfLK5s2btWbNmgJ/TzIyMvTaa68pNTVV3bp105IlS3ThwgUtXrzYtpRnZGSk+vfvr1dffdXhg5MtW7bUc889Jyn7XQqRkZFat26devToYfve5lzlynHkyBFNmzbN9pbvxo0bF7huAAAAOB/BqRht3Jj7StPlDEM6ejS7n8mzcUWyevVqVa9eXZcuXVJmZqYGDhyoBQsW2LbXq1fP7mVhBw4cUEhIiN1DdzfccIP8/Px04MCBPIPTzp07tX37dtsVJin7JWfp6elKS0vTnj17FBwcbAtNBbFr1y4ZhpFrn4yMDNvbrg8cOKA77rjDbnv79u0LFJzuvfdeubi46MKFC/L19dXrr7+uPn36aMqUKWrVqpXd+w86duwoq9Wq3377Ld/gdLmgoCCdOHEi3xqmTJmiBx54QB9++KG6d++uu+66S9ddd51p7QAAACgbCE7FKDGxePsVVnh4uBYuXCg3NzfVqVMn161gV74gzTAM21ufC9IuZd+KN3PmTA0ePDjXNg8PD3l6eha6bqvVKhcXF+3cuVMuV1yKy7kX1sjrMl4BzZkzR927d5ePj4/dQhf5naejdkm5vq8Wi0VWqzXfGiIiIjRs2DB9+eWX+uqrr/Tcc8/p448/zhUGAQAAUDYRnIpRUFDx9iusatWqqVGjRgXuf8MNN+jIkSM6evSo7arT/v37lZKSombNmuW5T5s2bfTbb785HKdly5Y6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1Nq1azVhwgT9+uuvJTZ2ZGSk7rrrLnl7e+fatnXrVm3btk116tQp8vEXLVqk3r172z77+vrabR8zZowWLFig++67r8hjAAAAlBdccQKuQs5VnW3btmnIkCFq0qSJmjdvrilTpmjr1q22fikpKRo3bpwCAgLk4+Oj2267TT/99FORx7VarVq+fLkGDBiQa9tff/2ld955Rx988IHc3NyKPIafn58CAwNtX56ennbbBwwYoG3btunw4cNFHgMAAKC8IDgBRZScnKw1a9ZowoQJqlatWq7tfn5+kiTDMNS3b18lJSUpNjZWO3fuVJs2bdStWzclJycXaey9e/fqzJkzCgsLs2u3Wq0aM2aMBg0apObNmxfp2DkmTpwof39/3XzzzXr77bdzPc9Ur149BQQEaOPGjVc1DgAAQHnArXpAEf3xxx8yDENNmzbNt9/69eu1b98+nThxQu7u7pKk119/XatWrdKKFSs0bty4Qo+dkJAgFxcXBQQE2LW/+uqrcnV1Vb9+/Qp9zMu98MIL6tatmzw9PbVu3TpNnTpVp06d0owZM+z61a1bVwkJCVc1FgAAQHlAcAKKyDAMSdkLKeRn586dOnfunGrWrGnXfuHCBR06dKhIY1+4cEHu7u52Y+/cuVPz5s3Tjz/+qD179hTpuDkuD0g5q/09//zzuYKTp6en0tLSrmosAACA8oDgBBRR48aNZbFYdODAgXyXDrdarQoKCtKGDRtybcu5na+w/P39lZaWposXL6pq1aqSpI0bN+rEiRO67rrrZBiGLBaLsrKyNHXqVM2dO/eqrgy1a9dOqamp+vvvv1W7dm1be3JysmrVqlXk4wIAAJQXPOMEFFGNGjXUq1cvvfXWWzp//nyu7WfOnJEktWnTRklJSXJ1dVWjRo3svvz9/Ys0ds5VoP3799vaRowYob1792r79u2aM2eOtm/frjp16mjatGlau3ZtkcbJsXv3bnl4eNgFvfT0dB06dEihoaFXdWwAAIDygOAEXIWoqChlZWWpbdu2WrlypQ4ePKgDBw5o/vz5at++vSSpe/fuat++vQYNGqS1a9cqISFBmzdv1owZM7Rjx44ijVurVi21adNGmzZtsrXVrFlTLVq0UIsWLVSvXj21aNFCbm5uCgwM1PXXX1/gY3/xxRd655139PPPP+vQoUN69913NX36dI0bN872jJaUveS5u7u77TwBAAAqMoITcBUaNGigXbt2KTw8XFOnTlWLFi3Uo0cPrVu3TgsXLpSU/QxUbGysOnfurLFjx6pJkyYaOnSoEhIS7G57K6xx48ZpyZIlhd5v9OjR6tq1q8Ptbm5uioqKUvv27dWyZUvNmzdPzz//vN544w27fsuWLdPw4cPl5eVV6BoAAADKG55xAq5SUFCQIiMjFRkZ6bCPt7e35s+fr/nz5+e5PSIiQhEREbbP0dHRpuOOGjVKs2bN0pYtWxxe9cnruaaEhIR8g1Pv3r3tXnybl5MnT2rFihVFvmIGAABQ3hCcgHLKw8NDixcv1qlTpwq8z9mzZ3Xo0CGtXr36qsaOj49XVFSUGjRocFXHAQAAKC8ITkA51qVLl0L19/b21tGjR6963LZt26pt27ZXfRwAAIDygmecAAAAAMAEwQkAAAAATBCcAAAAAMAEwQkAAAAATBCcAAAAAMAEq+oB5VBWlrRxo5SYKAUFSZ06SS4uzq4KAACg4iI4AeVMTIz0yCPSsWP/awsOlubNkwYPdl5dAAAAFRm36gHlSEyMNGSIfWiSpL/+ym6PiXFOXQAAABUdwQkoJ7Kysq80GUbubTltjz6a3Q8AAADFi+AElBMbN+a+0nQ5w5COHpW2bCm9mgAAACoLghNQTiQmFqxfUlLJ1gEAAFAZEZyAciIoqGD9AgNLtg4AAIDKiOAElBOdOmWvnmex5L3dYpFCQqT27Uu3LgAAgMqA4ASUEy4u2UuOS7nDU87nuXN5nxMAAEBJIDgB5cjgwdKKFVLduvbtwcHZ7bzHCQAAoGTwAlygnBk8WBo4MHuVvcTE7GefOnXiShMAAEBJIjgB5ZCLi9S1q7OrAAAAqDy4VQ8AAAAATBCcAAAAAMAEwQkAAAAATDg1OH3//ffq37+/6tSpI4vFolWrVuXbPyYmRj169FCtWrXk4+Oj9u3ba+3ataVTLAAAAIBKy6nB6fz582rVqpUiIyML1P/7779Xjx49FBsbq507dyo8PFz9+/fX7t27S7hSAAAAAJWZU1fV69Onj/r06VPg/nPnzrX7PGvWLH322Wf64osvFBoaWszVAQAAAEC2cr0cudVq1dmzZ1WjRg2HfTIyMpSRkWH7nJqaKknKzMxUZmZmiddYUnJqL8/ngJLB3IAjzA04wtyAI8wNOFJR5kZh6rcYhmGUYC0FZrFY9Omnn2rQoEEF3ue1117TK6+8ogMHDiggICDPPhEREZo5c2au9qVLl8rLy6uo5QIAAAAo59LS0jRs2DClpKTIx8cn377lNjgtW7ZMDzzwgD777DN1797dYb+8rjiFhITo1KlTpt+csiwzM1NxcXHq0aOH3NzcnF0OyhDmBhxhbsAR5gYcYW7AkYoyN1JTU+Xv71+g4FQub9X75JNPdP/992v58uX5hiZJcnd3l7u7e652Nze3cv1DzlFRzgPFj7kBR5gbcIS5AUeYG3CkvM+NwtRe7t7jtGzZMo0ePVpLly5V3759nV0OAAAAgErAqVeczp07pz/++MP2OT4+Xnv27FGNGjV07bXX6umnn9Zff/2lxYsXS8oOTSNHjtS8efPUrl07JSUlSZI8PT3l6+vrlHMAAAAAUPE59YrTjh07FBoaaltKfMqUKQoNDdWzzz4rSUpMTNSRI0ds/f/973/r0qVLmjBhgoKCgmxfjzzyiFPqBwAAAFA5OPWKU9euXZXf2hTR0dF2nzds2FCyBQEAAABAHsrdM04AAAAAUNoITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguCEqxIREaHWrVvbPo8ePVqDBg0y3W/EiBGaNWtWyRXmwOrVqxUaGiqr1VrqYwMAAKD8IjhVYklJSZo0aZIaNmwod3d3hYSEqH///lq3bl2Jjrt37159+eWXmjRpkq0tJiZGvXr1kr+/vywWi/bs2VPo4/7000+69957FRISIk9PTzVr1kzz5s2z69OvXz9ZLBYtXbr0ak8DAAAAlQjBqZJKSEjQTTfdpG+//VazZ8/Wvn37tGbNGoWHh2vChAklOnZkZKTuuusueXt729rOnz+vjh076pVXXinycXfu3KlatWrpo48+0i+//KLp06fr6aefVmRkpF2/MWPGaMGCBUUeBwAAAJWPq7MLgHOMHz9eFotF27ZtU7Vq1WztzZs319ixY22fU1JSNG3aNK1atUrp6ekKCwvTnDlz1KpVqyKNa7VatXz5cn300Ud2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9eOPPxZ5jNOnTys4OFgWi0Vnzpyxtffr108Wi0VLly69mlMAAADAVSI4oVxISEjQTTfdpG+//VazZ8/Wvn37tGbNGoWHh2vChAklOnZkZKTuuusueXt729qaNGmiyMhI7du3T5s2bVL9+vXVs2dPnTx5skhj3H///WrZsmWe28aMGaMFCxYU6bgAAAAoHgQnlAvjx4+XxWLRtm3bNGTIEDVp0kTNmzfXlClTtHXrVlu/lJQUjRs3TgEBAfLx8dFtt92mn376qcjjWq1WLV++XAMGDLBrHzZsmLp3766GDRuqefPmevPNN5Wamqq9e/cWeoyFCxfqzJkzevzxx/PcPmDAAG3btk2HDx8u0jkAAADg6hGcUOYlJydrzZo1mjBhgqpVq5Zru5+fnyTJMAz17dtXSUlJio2N1c6dO9WmTRt169ZNycnJRRp77969OnPmjMLCwhz2uXjxov7zn//I19dXrVq1KtTx9+/fr+eff16LFy9WlSp5/+dYr149BQQEaOPGjYU6NlBaeHYQAFAZEJxQ5v3xxx8yDENNmzbNt9/69eu1b98+LV++XGFhYWrcuLFef/11+fn5acWKFUUaOyEhQS4uLgoICMi1bfXq1apevbo8PDw0Z84cxcXFyd/fv8DHzsjI0L333qvXXntN1157bb5969atq4SEhMKWD5gqS88OxsTEqFevXvL395fFYtGePXuKdGyLxZLr6+2337Zt59lBAEBRuDq7AMCMYRiSsn8Zys/OnTt17tw51axZ0679woULOnToUJHGvnDhgtzd3fMcOzw8XHv27NGpU6f0zjvv6O6779aPP/6YZ8jKy9NPP61mzZrpvvvuM+3r6emptLS0QtcP5CchIUEdO3aUn5+fZs+erZYtWyozM1Nr167VhAkT9Ouvv5bY2Hk9O3j+/Hl17NhRd911l/71r39d1fEXLVqk3r172z77+vrabc95drAg//0BACARnFAONG7cWBaLRQcOHMj39h+r1aqgoCBt2LAh17ac2/kKy9/fX2lpabp48aKqVq1qt61atWpq1KiRGjVqpHbt2qlx48Z677339PTTTxfo2N9++6327dtnuxqWExD9/f01ffp0zZw509Y3OTlZtWrVKtI5AI5c/uzg5bfBNm/eXGPHjrV9TklJ0bRp07Rq1Sqlp6crLCxMc+bMKfStqTlynh386KOP7NpH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AAAAmCA4AQAAAIAJghMAAAAAmCA4AQAAAIAJghMAAAAAmCA4AQAAAIAJghMAAAAAmCA4AQAAAIAJghMAAAAAmCA4AQAAAIAJghMAAAAAmCA4AQAAAIAJghMAAAAAmCA4AQAAAIAJghMAAAAAmCA4AQAAAIAJghMAAAAAmCA4AQAAAIAJghMAAAAAmCA4AQAAAIAJghMAAAAAmCA4AQAAAIAJghMAAAAAmCA4AQAAAIAJghMAAAAAmCA4AQAAAIAJghMAAAAAmCA4AQAAAIAJghMAAAAAmCA4AQAAAIAJpwenqKgoNWjQQB4eHrrpppu0cePGfPtnZGRo+vTpqlevntzd3XXdddfp/fffL6VqAQAAAFRGrs4c/JNPPtGjjz6qqKgodezYUf/+97/Vp08f7d+/X9dee22e+9x99936+++/9d5776lRo0Y6ceKELl26VMqVAwAAAKhMnBqc3nzzTd1///164IEHJElz587V2rVrtXDhQr388su5+q9Zs0bfffedDh8+rBo1akiS6tevX5olAwAAAKiEnBacLl68qJ07d+qpp56ya+/Zs6c2b96c5z6ff/65wsLCNHv2bH344YeqVq2aBgwYoBdeeEGenp557pORkaGMjAzb59TUVElSZmamMjMzi+lsSl9O7eX5HFAymBtwhLkBR5gbcIS5AUcqytwoTP1OC06nTp1SVlaWateubddeu3ZtJSUl5bnP4cOHtWnTJnl4eOjTTz/VqVOnNH78eCUnJzt8zunll1/WzJkzc7V//fXX8vLyuvoTcbK4uDhnl4AyirkBR5gbcIS5AUeYG3CkvM+NtLS0Avd16q16kmSxWOw+G4aRqy2H1WqVxWLRkiVL5OvrKyn7dr8hQ4borbfeyvOq09NPP60pU6bYPqempiokJEQ9e/aUj49PMZ5J6crMzFRcXJx69OghNzc3Z5eDMoS5AUeYG3CEuQFHmBtwpKLMjZy70QrCacHJ399fLi4uua4unThxItdVqBxBQUGqW7euLTRJUrNmzWQYho4dO6bGjRvn2sfd3V3u7u652t3c3Mr1DzlHRTkPFD/mBhxhbsAR5gYcYW7AkfI+NwpTu9OWI69atapuuummXJf34uLi1KFDhzz36dixo44fP65z587Z2n7//XdVqVJFwcHBJVovAAAAgMrLqe9xmjJlit599129//77OnDggB57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ZswokXE7dOigxMRE+fr6lsjxAQBln8UwDMPZRQAAUFAHDx5U69at9Z///EfDhw+XJI0cOVI//fSTtm/frqpVqzq5QgBARcQVJwBAudK4cWO9/PLLmjRpko4fP67PPvtMH3/8sT744AOHoenJJ59UkyZN5OXlpYYNG+qZZ55RZmamJMkwDHXv3l29e/dWzt8lnjlzRtdee62mT58uKfeten/++af69++va665RtWqVVPz5s0VGxtb8icPAHAaV2cXAABAYU2aNEmffvqpRo4cqX379unZZ59V69atHfb39vZWdHS06tSpo3379ulf//qXvL299cQTT8hiseiDDz7QjTfeqPnz5+uRRx7RQw89pNq1aysiIiLP402YMEEXL17U999/r2rVqmn//v2qXr16yZwsAKBM4FY9AEC59Ouvv6pZs2a68cYbtWvXLrm6FvzvAl977TV98skn2rFjh61t+fLlGjFihKZMmaJ58+Zp9+7datKkiaTsK07h4eH6559/5Ofnp5YtW+rOO+/Uc889V+znBQAom7hVDwBQLr3//vvy8vJSfHy8jh07Jkl66KGHVL16ddtXjhUrVujWW29VYGCgqlevrmeeeUZHjhyxO95dd92lwYMH6+WXX9Ybb7xhC015mTx5sl588UV17NhRzz33nPbu3VsyJwkAKDMITgCAcmfLli2aM2eOPvvsM7Vv317333+/DMPQ888/rz179ti+JGnr1q0aOnSo+vTpo9WrV2v37t2aPn26Ll68aHfMtLQ07dy5Uy4uLjp48GC+4z/wwAM6fPiwRowYoX379iksLEwLFiwoqdMFAJQBBCcAQLly4cIFjRo1Sg8++KC6d++ud999V9u3b9e///1vBQQEqFGjRrYvSfrhhx9Ur149TZ8+XWFhYWrcuLH+/PPPXMedOnWqqlSpoq+++krz58/Xt99+m28dISEheuihhxQTE6OpU6fqnXfeKZHzBQCUDQQnAEC58tRTT8lqterVV1+VJF177bV64403NG3aNCUkJOTq36hRIx05ckQff/yxDh06pPnz5+vTTz+16/Pll1/q/fff15IlS9SjRw899dRTGjVqlP755588a3j00Ue1du1axcfHa9euXfr222/VrFmzYj9XAEDZweIQAIBy47vvvlO3bt20YcMG3XrrrXbbevXqpUuXLumbb76RxWKx2/bEE0/o/fffV0ZGhvr27at27dopIiJCZ86c0cmTJ3XjjTfqkUce0dNPPy1JunTpkjp27Kj69evrk08+ybU4xKRJk/TVV1/p2LFj8vHxUe/evTVnzhzVrFmz1L4XAIDSRXACAAAAABPcqgcAAAAAJghOAAAAAGCC4AQAAAAAJghOAAAAAGCC4AQAAAAAJghOAAAAAGCC4AQAAAAAJghOAAAAAGCC4AQAAAAAJghOAAAAAGCC4AQAAAAAJv4fDCbDRYstHkgAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import toponetx as tnx\n", "\n", "import topoembedx as tex\n", "\n", "# Create a cell complex object with a few cells\n", "cc = tnx.classes.CellComplex([[1, 2, 3, 4, 5], [4, 5, 6]], ranks=2)\n", "\n", "# Create a model\n", "model = tex.Cell2Vec(dimensions=2)\n", "\n", "# Fit the model to the cell complex\n", "\n", "model.fit(cc, neighborhood_type=\"adj\", neighborhood_dim={\"rank\": 1, \"via_rank\": -1})\n", "\n", "# note that \"via_rank\" is ignored here and only considered when the complex is Combintatorial complex\n", "\n", "# Get the embeddings\n", "embedded_points = model.get_embedding(get_dict=True)\n", "\n", "\n", "# Prepare data for plotting\n", "x = [embedded_points[cell][0] for cell in embedded_points]\n", "y = [embedded_points[cell][1] for cell in embedded_points]\n", "cell_labels = [f\"Cell {cell}\" for cell in embedded_points]\n", "\n", "# Plotting\n", "plt.figure(figsize=(10, 8))\n", "plt.scatter(x, y, c=\"blue\", label=\"Projected Points\")\n", "\n", "# Annotate the points to correspond with cells\n", "for i, label in enumerate(cell_labels):\n", " plt.annotate(\n", " label, (x[i], y[i]), textcoords=\"offset points\", xytext=(0, 10), ha=\"center\"\n", " )\n", "\n", "# Label axes and add title\n", "plt.xlabel(\"X-axis\")\n", "plt.ylabel(\"Y-axis\")\n", "plt.title(\"Projection of Cell Complex in 2D\")\n", "\n", "# Display the plot\n", "plt.legend()\n", "plt.grid(True)\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "694be0ab-8bf6-4aad-b900-e1088dd3fbc9", "metadata": {}, "source": [ "Observe how the edge (4,5) is inbetweeen the edges belonging to the cell (1, 2, 3, 4, 5) whereas the edges (4,5) and (5,6) are isolated on the otherwise. This is because (4,5) is shared between the cells.\n", "\n", "\n", "Next we explore embedding 2 cells using Cell2Vec:" ] }, { "cell_type": "code", "execution_count": 86, "id": "447c3dfe-58f9-4ed5-bf40-d58ad65dd1ac", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import toponetx as tnx\n", "\n", "import topoembedx as tex\n", "\n", "# Create a cell complex object with a few cells\n", "cc = tnx.classes.CellComplex(\n", " [[1, 2, 3], [1, 2, 3, 4, 5], [7, 8, 9, 12], [7, 8, 9, 10], [4, 5, 6]], ranks=2\n", ")\n", "\n", "# Create a model\n", "model = tex.Cell2Vec(dimensions=2)\n", "\n", "# Fit the model to the cell complex\n", "model.fit(cc, neighborhood_type=\"coadj\", neighborhood_dim={\"rank\": 2, \"via_rank\": -1})\n", "\n", "# Get the embeddings\n", "embedded_points = model.get_embedding(get_dict=True)\n", "\n", "\n", "# Prepare data for plotting\n", "x = [embedded_points[cell][0] for cell in embedded_points]\n", "y = [embedded_points[cell][1] for cell in embedded_points]\n", "cell_labels = [f\"Cell {cell}\" for cell in embedded_points]\n", "\n", "# Plotting\n", "plt.figure(figsize=(10, 8))\n", "plt.scatter(x, y, c=\"blue\", label=\"Projected Points\")\n", "\n", "# Annotate the points to correspond with cells\n", "for i, label in enumerate(cell_labels):\n", " plt.annotate(\n", " label, (x[i], y[i]), textcoords=\"offset points\", xytext=(0, 10), ha=\"center\"\n", " )\n", "\n", "# Label axes and add title\n", "plt.xlabel(\"X-axis\")\n", "plt.ylabel(\"Y-axis\")\n", "plt.title(\"Projection of Cell Complex in 2D\")\n", "\n", "# Display the plot\n", "plt.legend()\n", "plt.grid(True)\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "6f2ae646-e504-4055-af4c-865236c529cd", "metadata": {}, "source": [ "### Refs\n", "\n", "(1) Mustafa Hajij,Kyle Istvan,and Ghada Zamzmi, Cell Complex Neural Networks. NeurIPS2020 Workshop TDA and Beyond, 2020." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9" } }, "nbformat": 4, "nbformat_minor": 5 }