{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Spectral Embedding Methods" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One of the primary embedding tools we'll use in this book is a set of methods called *spectral embedding* {cite:t}`spectraltutorial`. You'll see spectral embedding and variations on it repeatedly, both throughout this section and when we get into applications, so it's worth taking the time to understand spectral embedding deeply. If you're familiar with Principal Component Analysis (PCA), this method has a lot of similarities. We'll need to get into a bit of linear algebra to understand how it works.\n", "\n", "Remember that the basic idea behind any network embedding method is to take the network and put it into Euclidean space - meaning, a nice data table with rows as observations and columns as features (or dimensions), which you can then plot on an x-y axis. In this section, you'll see the linear algebra-centric approach that spectral embedding uses to do this.\n", "\n", "Spectral methods are based on a bit of linear algebra, but hopefully a small enough amount to still be understandable. The overall idea has to do with eigenvectors, and more generally, something called \"singular vectors\" - a generalization of eigenvectors. It turns out that the biggest singular vectors of a network's adjacency matrix contain the most information about that network - and as the singular vectors get smaller, they contain less information about the network (we're glossing over what 'information' means a bit here, so just think about this as a general intuition). So if you represent a network in terms of its singular vectors, you can drop the smaller ones and still retain most of the information. This is the essence of what spectral embedding is about (here \"biggest\" means \"the singular vector corresponding to the largest singular value\").\n", "\n", "```{admonition} Singular Values and Singular Vectors\n", "If you don't know what singular values and singular vectors are, don't worry about it. You can think of them as a generalization of eigenvalues/vectors (it's also ok if you don't know what those are): all matrices have singular values and singular vectors, but not all matrices have eigenvalues and eigenvectors. In the case of square, symmetric matrices with positive eigenvalues, the eigenvalues/vectors and singular values/vectors are the same thing.\n", "\n", "If you want some more background information on eigenstuff and singularstuff, there are some explanations in the Math Refresher section in the introduction. They're an important set of vectors associated with matrices with a bunch of interesting properties. A lot of linear algebra is built around exploring those properties.\n", "```\n", "\n", "You can see visually how Spectral Embedding works below. We start with a 20-node Stochastic Block Model with two communities, and then found its singular values and vectors. It turns out that because there are only two communities, only the first two singular vectors contain information -- the rest are just noise! (you can see this if you look carefully at the first two columns of the eigenvector matrix). So, we took these two columns and scaled them by the first two singular vectors of the singular value matrix $D$. The final embedding is that scaled matrix, and the plot you see takes the rows of that matrix and puts them into Euclidean space (an x-y axis) as points. This matrix is called the *latent position matrix*, and the embeddings for the nodes are called the *latent positions*. Underneath the figure is a list that explains how the algorithm works, step-by-step." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/alex/.pyenv/versions/3.9.0/lib/python3.9/site-packages/beartype/_util/hint/pep/utilpeptest.py:373: BeartypeDecorHintPep585DeprecationWarning: PEP 484 type hint typing.List[scipy.sparse.csr.csr_matrix] deprecated by PEP 585 scheduled for removal in the first Python version released after October 5th, 2025. To resolve this, either drop Python < 3.9 support and globally replace this hint by the equivalent PEP 585 type hint (e.g., \"typing.List[int]\" by \"list[int]\") or see this discussion topic for saner and more portable solutions:\n", " https://github.com/beartype/beartype#pep-484-deprecations\n", " warn(\n", "/Users/alex/.pyenv/versions/3.9.0/lib/python3.9/site-packages/beartype/_util/hint/pep/utilpeptest.py:373: BeartypeDecorHintPep585DeprecationWarning: PEP 484 type hint typing.List[numpy.ndarray] deprecated by PEP 585 scheduled for removal in the first Python version released after October 5th, 2025. To resolve this, either drop Python < 3.9 support and globally replace this hint by the equivalent PEP 585 type hint (e.g., \"typing.List[int]\" by \"list[int]\") or see this discussion topic for saner and more portable solutions:\n", " https://github.com/beartype/beartype#pep-484-deprecations\n", " warn(\n", "/Users/alex/.pyenv/versions/3.9.0/lib/python3.9/site-packages/beartype/_util/hint/pep/utilpeptest.py:373: BeartypeDecorHintPep585DeprecationWarning: PEP 484 type hint typing.List[typing.Union[networkx.classes.graph.Graph, networkx.classes.ordered.OrderedGraph, networkx.classes.digraph.DiGraph, networkx.classes.ordered.OrderedDiGraph]] deprecated by PEP 585 scheduled for removal in the first Python version released after October 5th, 2025. To resolve this, either drop Python < 3.9 support and globally replace this hint by the equivalent PEP 585 type hint (e.g., \"typing.List[int]\" by \"list[int]\") or see this discussion topic for saner and more portable solutions:\n", " https://github.com/beartype/beartype#pep-484-deprecations\n", " warn(\n", "/Users/alex/.pyenv/versions/3.9.0/lib/python3.9/site-packages/beartype/_util/hint/pep/utilpeptest.py:373: BeartypeDecorHintPep585DeprecationWarning: PEP 484 type hint typing.List[typing.Tuple[graspologic.pipeline.embed.embeddings.Embeddings, graspologic.pipeline.embed.embeddings.Embeddings]] deprecated by PEP 585 scheduled for removal in the first Python version released after October 5th, 2025. To resolve this, either drop Python < 3.9 support and globally replace this hint by the equivalent PEP 585 type hint (e.g., \"typing.List[int]\" by \"list[int]\") or see this discussion topic for saner and more portable solutions:\n", " https://github.com/beartype/beartype#pep-484-deprecations\n", " warn(\n", "/Users/alex/.pyenv/versions/3.9.0/lib/python3.9/site-packages/beartype/_util/hint/pep/utilpeptest.py:373: BeartypeDecorHintPep585DeprecationWarning: PEP 484 type hint typing.Tuple[graspologic.pipeline.embed.embeddings.Embeddings, graspologic.pipeline.embed.embeddings.Embeddings] deprecated by PEP 585 scheduled for removal in the first Python version released after October 5th, 2025. To resolve this, either drop Python < 3.9 support and globally replace this hint by the equivalent PEP 585 type hint (e.g., \"typing.List[int]\" by \"list[int]\") or see this discussion topic for saner and more portable solutions:\n", " https://github.com/beartype/beartype#pep-484-deprecations\n", " warn(\n", "/Users/alex/.pyenv/versions/3.9.0/lib/python3.9/site-packages/beartype/_util/hint/pep/utilpeptest.py:373: BeartypeDecorHintPep585DeprecationWarning: PEP 484 type hint typing.Tuple[int, int] deprecated by PEP 585 scheduled for removal in the first Python version released after October 5th, 2025. To resolve this, either drop Python < 3.9 support and globally replace this hint by the equivalent PEP 585 type hint (e.g., \"typing.List[int]\" by \"list[int]\") or see this discussion topic for saner and more portable solutions:\n", " https://github.com/beartype/beartype#pep-484-deprecations\n", " warn(\n" ] }, { "data": { "image/png": "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gPqP250AAACAEpkxY0bijoN79+5d5GgAAKVGkgYAAAAokY8//jhRuWbNmmmHHXYocjQAgFIjSQMAAACUyPTp0xOVa9KkCY/fBoAGgD5pAACoJevXr9ecOXO0Zs2aUodSEs2aNVP37t1VXl5e6lCAVFi1apUWLVqUuHy3bt2KGA0AIA1I0gAAUEvmzJmj1q1bq2fPng3uMbrOOS1ZskRz5szRjjvuWOpwgFR455131KJFCy1fvrxg2bVr19KSBgAaAG53AgCglqxZs0bt27dvcAkaSTIztW/fvsG2IgKyeeutt7R+/fpEZcvLy7XddtsVOSIAQKmRpAEAoBY1xARNpYY870A2r7zySuLHb++yyy5sQwDQAJCkAYAS+XjxSt00frr+/e78UocCACiBSZMmJS67//77FzESAEBakKQBgBIZ/d9Z+uP4D/WD+97Uh5+tKHU4KJEFCxbo+OOP10477aS99tpLw4YN04cffljqsLKaN2+ejjnmGEn+No1x48aVOCKg7tq4caM++uijRGVbtWqlffbZp8gRAQDSgCQNAJTIti2bSJK2aV6ulk0alzgalIJzTkcffbSGDh2qjz76SK+//rp+//vf67PPPit1aFl17dpVDz/8sCSSNEB1ffTRR4mfdGZm2n333YsbEAAgFfI+3WnR4oraiqPB2fHAHqUOoV4ys8Mk3SipsaS/Oeeuyhj/E0lnStogaZGkUc65T2o9UEDSGYN3VL+ubbX9ti3UbZsWpQ4HJfD888+rvLxcZ5999pfv7bbbbnLO6aKLLtJTTz0lM9Mll1yi4447Ti+88IJ+/etfq127dnrnnXd07LHHasCAAbrxxhu1evVqjR07VjvttJNGjhyp5s2b680339TChQt1xx136B//+Idefvll7bvvvho9erQk/+v8ypUrJUkPP/ywnnzySY0ePVojR45UmzZtNHnyZC1YsEDXXHONjjnmGM2aNUtHHHGE3njjDV166aVavXq1XnrpJf3iF7/QJZdcov/973/q2LGjNm3apJ133lkvv/yyOnbsWIpFC6Te22+/rUaNkv1eumbNGvXt27fIEQEA0oCWNKg3NrlNkvRnSYdL6ifpBDPrl1HsTUmDnHMDJT0s6ZpaDRKIadW0XN/ot536dm5d6lBQIu+++6722muvrd5/5JFH9NZbb+ntt9/W+PHjddFFF2n+fN930dtvv61bb71V7733nu6++259+OGHmjRpks4880z96U9/+rKOL774Qi+//LKuv/56HXXUUTr//PM1depUvfPOO3rrrbcKxjZ//ny99NJLevLJJ/Xzn/98i3FNmjTRFVdcoeOOO05vvfWWjjvuOJ188sm69957JUnjx4/XbrvtRoIGyOP111//MklayA477JC41Q0AoG4jSYN6Y+HSmZI0wzk30zm3TtIDkr4dL+Oce945V9lE7BVJ3Ws3SgAo7KWXXtIJJ5ygxo0ba7vtttOQIUP02muvSZL23ntvdenSRU2bNtVOO+2kQw89VJI0YMAAzZo168s6jjzySJmZBgwYoO22204DBgxQo0aN1L9//y3K5TJ8+HA1atRI/fr1S3T71ahRo/SPf/xDknTHHXfo9NNPD59xoAF56aWX5JxLVHbvvfcucjQAgLQgSYN6o2LNF5I0O/bWHEnd8nzkDElPFTMmAMinf//+ev3114M+07Rp0y9fN2rU6Mv/GzVqpA0bNmxVLl4ms1z8cb5r1qzJOZ0kF5I9evTQdtttp+eee06TJk3S4YcfHjJbQIOybt26xNt+s2bNeLITADQgJGnQIJnZyZIGSfpDnjJnmdlkM5u8aNGi2gsOQINx8MEHa+3atbrtttu+fG/KlClq166dxowZo40bN2rRokV68cUXi/Jkl+22207vvfeeNm3apEcffTTos61bt9aKFVs+lezMM8/UySefrBEjRqhxYzrDBnJ5+eWX1aRJk0RlmzRpoj322KPIEQEA0oIkDeqNFs22kaR4j8zdJc3NLGdmh0i6WNJRzrm1uepzzt3mnBvknBtEvwoAisHM9Oijj2r8+PHaaaed1L9/f/3iF7/QiSeeqIEDB2q33XbTwQcfrGuuuUadO3eu8elfddVVOuKII/TVr35VXbp0CfrsQQcdpGnTpmn33XfXmDFjJElHHXWUVq5cya1OQAFPPvmkVq1alajs6tWrNXDgwCJHBABIC8vXhPmjj5Yku1EWwf7woydLHUK9s2nTRt3+1BkfS/q6fHLmNUknOuemVpYxsz3kOww+zDk3PWndgwYNcpMnT67pkFGL1qzfqGemfaY2zcp04M4dt7jNA6gt7733nnbddddSh1E0kydP1vnnn6+JEyfmLJNtGZjZ6865QcWOL4bzG5RUnz59NGPGjERlu3Tponnz5hU5IgBo8FJzcZD3EdxAXdKoUWNJOlfS0/KP4L7DOTfVzK6QNNk597j87U2tJD0UXaR/6pw7qkQhoxY98sYc/fLRdyVJ931vX311pw4ljgioX6666irdcsstXz7hCUB2ixYt0uzZswsXlG9tN2zYsCJHBABIE5I0qFecc+Mkjct479LY60NqPSikwoaNm384X78xHT+iT571ue555RP179ZWp3+1p8oacwcq6q6f//znWz2qG8DWnnnmGTVp0kRr1+a84/pLrVu31vDhw4sfFAAgNUjSAGgQjt6zm5qUN1KbZuU6oHc6WtE8/PocjX1rnsa+NU9f7dVe/bu1LXVIAIAie+SRR7bqdDuXNWvWaOjQocUNCACQKiRpADQIrZuV6/i9ty91GFvYa/tt9OnnFdq2Rbk6t21W6nAAAEXmnNP48eMTlx8wYIBatWpVxIgAAGmTN0nTsUOL2oqjwfnkf1s9dAhAA1OxfoP+99ES7dq5tTZuSsctWACA4nnnnXe0cePGRGWbNm2qY445psgRAQDShg4QAKBE3p/vm7u/t2CFFq0s3DcBAKBue+KJJ7R+/fpEZcvKyug0GAAaIJI0AFAix++zvU7YZ3v95tv9tWvnNqUOB8jq3//+t/r27avevXvrqquuKnU4QJ3lnNOtt96aqMNgySdpBgwYUOSoAABpQ580AFAiu/Vop916tCt1GEBOGzdu1A9+8AM988wz6t69u/bee28dddRR6tevX6lDA+qcV155RUuXLk1c/tBDD5WZFS8gAEAqkaQBgBKZ80WFnnpngfps10pD+3YqdTio48a+OVd/ePoDzVu6Wl3bNddF3+yr4Xt0q1adkyZNUu/evdWrVy9J0vHHH6/HHnuMJA1QBTfffLNWrVqVqGzr1q31ne98p8gRAQDSiNudAKBE7vzvLP123Hv63j8ma8bClaUOB3XY2Dfn6hePvKO5S1fLSZq7dLV+8cg7Gvtm9Tqpnzt3rnr06PHl/927d9fcuXR8D4RauXKlHn30UTmXrJP4tWvX6hvf+EaRowIApBFJGgAokeZNGvu/5Y3VpIzdMaruD09/oNXrt3xizOr1G/WHpz8oUUQA4h566CE1btw4cflddtlF7du3L2JEAIC04nYnACiRfp3baEifjuqzXUu1a1Fe6nBQh81bujro/aS6deum2bNnf/n/nDlz1K1b9W6hAhqim266SStXJmsx2apVK/3whz8sckQAgLTip1sAKJEXPlyoCdMX6W8vzdKnSypKHQ7qsK7tmge9n9Tee++t6dOn6+OPP9a6dev0wAMP6KijjqpWnUBD8+GHH+r9999PXH7jxo067rjjihgRACDNSNIAQIkc/pXO6tm+hU7dfwf16tCy1OGgDrvom33VvHzLWymalzfWRd/sW616y8rKdPPNN+ub3/ymdt11Vx177LHq379/teoEGprbb79dGzduLFxQkpnp6KOPVqtWrYocFQAgrbjdCQBK5KBdttOBO3dS40Y8YhXVU/kUp5p+upMkDRs2TMOGDat2PUBDtG7dOv3tb3/T+vXrE5Vv0aKFzj333CJHBQBIM5I0AIpm9bqNeuC1T7Vy7QaduM/2at+qaalDSp20JmjWbdik5z9YqBZNGmtwn46lDgcJDN+jW40kZQDUnNtvvz1xgkaStt12W+23335FjAgAkHYkaUpk9RdrSh0CUHQvfLBQlz8xTZLUskmZRh2wY4kjQlKPvTVXFz08RWbSPWfso6/1JlEDACHWrFmjSy+9VKtWrUpUvnnz5jrvvPNkls7kPQCgdtAnDYCi6dC6icob+5PNTm1oRVOXrIke5+yctGb9phJHAwB1zy233KK1a9cmLr9p0yaddtppRYwIAFAX0JIGQNHs3bO9Hjnnq1q9fqP27rltqcNBgG/v0U1mplZNG2vIzrSiAYAQFRUVuvzyyxO3opGkIUOGqFOnTkWMCgBQF5CkAVBUA7q3K3UIqII2zcp18n47lDoMAKiTbr755qC+aFq3bq0f/ehHRYwIAFBXcLsTAAAAUENWrlypK6+8UhUVFYk/07x5c33zm98sYlQAgLqCJA0AAMhq1KhR6tSpk77yla+UOhSgzrjhhhu0YcOGxOVbtmyp3//+92rcuHERowIA1BUkaQAAQFYjR47Uv//971KHAdQZy5cv19VXX63Vq1cn/ky7du106qmnFjEqAEBdQpIGAID6YMqD0vVfkS5r5/9OebDaVR544IHadls6/QaS+vGPfxzciuYPf/iDysroJhIA4HFEAACgrpvyoPTED6X10a/3y2b7/yVp4LGliwtoQJ577jmNGTNGa9asSfyZjh076rjjjitiVACAuoaWNAAA1HXPXrE5QVNp/Wr/PoCiW7lypU488cSgzoJbtWql6667To0acToOANiMowIAAHXdsjlh7wOoUeeff76WLVsW9JmuXbvq6KOPLlJEAIC6itudSqRNt1alDgEAUF+07e5vccr2PoCimjBhgu69996g25xatmypG264QWZWxMgAAHURLWkAAKjrvn6pVN58y/fKm/v3q+GEE07Q/vvvrw8++EDdu3fX3//+92rVB9Q3q1at0nHHHRf0NCdJ6tWrlw477LAiRQUAqMtoSQMAQF1X2Tnws1f4W5zadvcJmmp2Gnz//ffXQHBA/fWTn/wk+DanFi1a6KabbqIVDQAgK5I0AIpq3tLVWrdhk3p2aFnqUID6beCxPMkJqEVPP/207r777qDbnJo2barvfve7Gjp0aPECAwDUadzuBKBops5dpiP/9JIOvf5FvfjhwlKHAwBAjZg6daq++93vBt/m1KZNG918881FigoAUB+QpAFQNB8tWqUlq9Zp3cZNem/+ilKHA6SCc67UIZRMQ5531B+fffaZDj74YK1atSrocy1atNB9992nNm3aFCkyAEB9wO1OAIrmgD4ddPaQXlq5doMO+0rnUocDlFyzZs20ZMkStW/fvsH1R+Gc05IlS9SsWbNShwJU2erVq3XIIYfo888/D/pcs2bNdOyxx+qQQw4pUmQAgPqCJA2Aotm2ZRP9/PBdSx0GkBrdu3fXnDlztGjRolKHUhLNmjVT9+48Fhx106ZNmzRixAjNmDFDGzZsCPpsmzZtdNNNNxUpMgBAfUKSBgCAWlJeXq4dd9yx1GEAqIKf/exnev7554M6Cpb8bU7333+/WrduXaTIAAD1CX3SAAAAAHn8/e9/11/+8hdVVFQEfa5Zs2Y6/vjjdfDBBxcpMgBAfUNLGgAAACCH+++/X+edd17wk5wkqW3btrrxxhuLEBUAoL6iJQ0AAACQxY033qgzzjijSgmali1b6umnn1arVq2KEBkAoL7K25KmcWNyOMWydtm6UocAAACALJxzuvjii3XjjTdWKUHTvHlzPfjgg9ptt92KEB0AoD7jdicAAAAgsnHjRp111ll64IEHgvugkXxHwVdffbWGDRtWhOgAAPUdSRoAAABA0tq1a3XMMcfoueeeq3KC5vTTT9e5555bhOgAAA0B9zOhXjGzw8zsAzObYWY/zzL+QDN7w8w2mNkxpYgRAACkz4oVK3TQQQfp2WefrVKCplmzZho8eDAdBQMAqoUkDeoN5zZJ0p8lHS6pn6QTzKxfRrFPJY2UdF+tBgcAAFJrypQpGjhwoN54440q9UFTVlamXr166ZFHHlHjxo2LECEAoKEgSYN6Y9mmOZI0wzk30zm3TtIDkr4dL+Ocm+WcmyJpUwlCBIB65/n3F+rSx97Vix8uLHUoQLBNmzbpuuuu03777adZs2Zp7dq1Vapnm2220bPPPqsWLVrUcIQAgIaGPmlQb6xxyyVpduytOZL2rWp9ZnaWpLMkafvtt69WbABQH1Ws26CfPTJFC5ev1bPvfabnLxyqJmW0IkDdMH/+fB177LFVbj0jSY0aNVLbtm31wgsvqHPnzjUcIQCgIaIlDZCDc+4259wg59ygjh07ljocAEidpmWNNWiHbSRJg3bYVuWNOa1A3fD4449rl1120SuvvFKl/mckqby8XF26dNHrr7+ufv0y764GAKBqaEmDeqOZtZGkHrG3ukuaW5poAKD+a9zI9NvhAzTyqz2183atZWalDgk1YP369ZoxY4Z23XXXUodS4yoqKnTuuedqzJgxVU7OSFLTpk3Vq1cvTZgwQfyQAwCoSfzkhXqjTaNuktTHzHY0syaSjpf0eGmjAoD6bZuWTbTPju3VrkWTUoeCGuCc0xlnnKHDDjus1KHUKOecHn/8ce288866//77q5Wgad68ufbaay+9+uqrJGgAADWOJA3qjUbWWJLOlfS0pPckPeicm2pmV5jZUZJkZnub2RxJIyT91cymlixgAABS5o9//KMefPBBrVixotSh1JhJkyZp0KBBOvHEEzV37lytWbOmynW1aNFChx56qJ5//nm1bt26BqMEAMDjdifUK865cZLGZbx3aez1a/K3QQEAgJinnnpKv/rVr7R27dp68Rjpjz76SD/60Y/03HPPVblj4LgWLVro5JNP1i233KJGjfidEwBQHHmTNI3pALBoWnZsXuoQAAAAJEnvvfeejj322C+TGevWrStxRFW3ePFiXXzxxbr77ru1bt06bdy4sdp1Nm/eXD/72c/0q1/9ir6XAABFRUsaAACABmzJkiX6+te/rlWrVn353oYNG7Rp06Y61WJkyZIluvnmm3XNNddo48aNWrt2bbXrLC8vV4sWLXTPPffoiCOOqIEoAQDIjyQNAABAA7V8+XINGTJES5YskXPuy/fLysq0evVqtWzZsoTRFeac06uvvqrrrrtOTz75pMys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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from graspologic.simulations import sbm\n", "from graphbook_code import heatmap, cmaps, plot_latents\n", "from graspologic.utils import to_laplacian\n", "from scipy.linalg import svd\n", "import seaborn as sns\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import matplotlib.patches as patches\n", "\n", "def rm_ticks(ax, x=False, y=False, **kwargs):\n", " if x is not None:\n", " ax.axes.xaxis.set_visible(x)\n", " if y is not None:\n", " ax.axes.yaxis.set_visible(y)\n", " sns.despine(ax=ax, **kwargs)\n", "\n", "# Make network\n", "B = np.array([[0.8, 0.1], \n", " [0.1, 0.8]])\n", "n = [10, 10]\n", "A, labels = sbm(n=n, p=B, return_labels=True)\n", "L = to_laplacian(A)\n", "U, E, Ut = svd(L)\n", "n_components = 2\n", "Uc = U[:, :n_components]\n", "Ec = E[:n_components]\n", "latents = Uc @ np.diag(Ec)\n", " \n", "fig = plt.figure();\n", "\n", "ax = fig.add_axes([.06, -.06, .8, .8]) \n", "ax = heatmap(L, ax=ax, cbar=False)\n", "ax.set_title(\"Network Representation\", loc=\"left\", fontsize=16)\n", "\n", "\n", "# add arrow\n", "arrow_ax = fig.add_axes([.8, .3, .3, .1])\n", "rm_ticks(arrow_ax, left=True, bottom=True)\n", "plt.arrow(x=0, y=0, dx=1, dy=0, width=.1, color=\"black\") \n", "\n", "# add joint matrix\n", "ax = fig.add_axes([1, -.02*3, .8, .8])\n", "ax = heatmap(U, ax=ax, cbar=False)\n", "ax.set_title(\"Left Singular vector matrix $U$\", loc=\"left\")\n", "\n", "ax = fig.add_axes([1.55, -.06, .8, .8])\n", "ax = heatmap(np.diag(E), ax=ax, cbar=False)\n", "ax.set_title(\"Singular value matrix $S$\", loc=\"left\")\n", "\n", "ax = fig.add_axes([2.1, -.06, .8, .8])\n", "ax = heatmap(Ut, ax=ax, cbar=False)\n", "ax.set_title(\"Right singular vector matrix $V^T$\", loc=\"left\")\n", " \n", "# add second arrow\n", "arrow_ax = fig.add_axes([1.5, -1.2, 1.2, 1])\n", "rm_ticks(arrow_ax, left=True, bottom=True)\n", "style = \"Simple, tail_width=10, head_width=40, head_length=20\"\n", "kw = dict(arrowstyle=style, color=\"k\", alpha=1)\n", "text_arrow = patches.FancyArrowPatch((0.33, .9), (.1, .5), connectionstyle=\"arc3, rad=-.55\", **kw)\n", "arrow_ax.add_patch(text_arrow)\n", "\n", "\n", "# Embedding\n", "ax = fig.add_axes([.185, -1.2, .4, .8])\n", "cmap = cmaps[\"sequential\"]\n", "ax = sns.heatmap(latents, cmap=cmap, \n", " ax=ax, cbar=False, xticklabels=False, yticklabels=False)\n", "ax.set_title(\"Latent Positions \\n(matrix representation)\", loc=\"left\")\n", "ax.set_xlabel(\"First two scaled columns of $U$\")\n", "\n", "ax = fig.add_axes([.185+.45, -1.2, .8, .8])\n", "plot_latents(latents, ax=ax, labels=labels)\n", "ax.set_title(\"Latent Positions (Euclidean representation)\", loc=\"left\")\n", "ax.set_xlabel(\"Plotting the rows of U as points in space\")\n", "\n", "fig.suptitle(\"The Spectral Embedding Algorithm\", fontsize=32, x=1.5);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```{admonition} The Spectral Embedding Algorithm\n", "1. Take a network's adjacency matrix. Optionally take its Laplacian as a network representation.\n", "2. Decompose it into a a singular vector matrix, a singular value matrix, and the singular vector matrix's transpose.\n", "3. Remove every column of the singular vector matrix except for the first $k$ vectors, corresponding to the $k$ largest singular values.\n", "4. Scale the $k$ remaining columns by their corresponding singular values to create the embedding.\n", "5. The rows of this embedding matrix are the locations in Euclidean space for the nodes of the network (called the latent positions). The embedding matrix is an estimate of the latent position matrix (which we talked about in the 'why embed networks' section)\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We need to dive into a few specifics to understand spectral embedding better. We need to figure out how to find our network's singular vectors, for instance, and we also need to understand why those singular vectors can be used to form a representation of our network. To do this, we'll explore a few concepts from linear algebra like matrix rank, and we'll see how understanding these concepts connects to understanding spectral embedding.\n", "\n", "Let's scale down and make a simple network, with only six nodes. We'll take its Laplacian just to show what that optional step looks like, and then we'll find its singular vectors with a technique we'll explore called Singular Value Decomposition. Then, we'll explore why we can use the first $k$ singular values and vectors to find an embedding. Let's start with creating the simple network." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## A Simple Network" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Say we have the simple network below. There are six nodes total, numbered 0 through 5, and there are two distinct connected groups (called \"connected components\" in network theory land). Nodes 0 through 2 are all connected to each other, and nodes 3 through 5 are also all connected to each other. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from itertools import combinations\n", "import numpy as np\n", "\n", "def add_edge(A, edge: tuple):\n", " \"\"\"\n", " Add an edge to an undirected graph.\n", " \"\"\"\n", " i, j = edge\n", " A[i, j] = 1\n", " A[j, i] = 1\n", " return A\n", "\n", "A = np.zeros((6, 6))\n", "\n", "for edge in combinations([0, 1, 2], 2):\n", " add_edge(A, edge)\n", " \n", "for edge in combinations([3, 4, 5], 2):\n", " add_edge(A, edge)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can see the adjacency matrix and network below. Notice that there are two distrinct blocks in the adjacency matrix: in its upper-left, you can see the edges between the first three nodes, and in the bottom right, you can see the edges between the second three nodes." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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AGDSmbECAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoSbACAACoqeNIjTfcuHqi6gBOUzd9es1kl8BJ7so3njvZJQBAbWasAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAahKsAAAAauqY7ALgdHLTp9dMdgknnRtuXD3ZJZxU/IwAwOnJjBUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNghUAAEBNHZNdAACcrhqNRtavX5+771uTnbt3Z2Skkak9U7Liogvyute+Nj09PZNdIgAtIlgBQIsNDQ3ljm/fmTvuujs7h9vzQP+s9FY9aaSkO8N5zdP352u33paLL744b7/uLZk7d+5klwxATYIVALRQf39/Pv6pP8sjWwdz18C52V5NO6TPpv45mZKhLF+zNY89/rH89Pt/PEuWLJn4YgFoGddYAUCLDA4O5mOf+FTufCG5uX/pmKFqnz3pzP1DC/KV3nPzqb/4dJ577rkJrBSAVhOsAKBFbvryV/LQS418e+/CJOWYztncmJmv9S3OJ//8LzM8PDy+BQIwbiwFBIAWGBgYyMNr1+b2gRUZK1Td/m+uS+/e4TQaVYYbVd71h3e80vZMY3ZeGtqWdevW5dJLL53AqgFoFcEKAFrg/gceyPONmdmTzsP2ufF/35WX+4fGbLu3f06W3H6nYAVwirIUEABa4I7v3JMHBk58d79nGrOzbfvLeemll1pYFQATRbACgBbo792Vl6vD35eqqpI/+2dvyE2/fHVuvGLxoe0p6W+bmp07d45nmQCME0sBAaAFqpHhDB/h3yvf87++nRd37c3caV358w+9IRu29uXup7Yf0GeoasvQ0NhLBQE4uZmxAoAWaOvoSmdGDtv+4q69SZJtfYP56toXsnrRrEP6dJWRdHd3j1eJAIwjM1bAuLrp02smu4STyg03rp7sEhgns+fOy9l9u7OpMeeQtp7O9rSVpG9wJD2d7XnzhWfmD25Zf0Cfjoxk2khv5s2bN1ElA9BC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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from graphbook_code import draw_multiplot\n", "import networkx as nx\n", "\n", "draw_multiplot(A, pos=nx.kamada_kawai_layout, title=\"Our Simple Network\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Building the Laplacian" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With spectral embedding, we'll either find the singular vectors of the Laplacian or the singular vectors of the Adjacency Matrix itself (For undirected Laplacians, the singular vectors are the same thing as the eigenvectors). Since we already have the adjacency matrix, let's take the Laplacian just to see what that looks like.\n", "\n", "Remember from chapter four that there are a few different types of Laplacian matrices. By default, for undirected networks, Graspologic uses the normalized Laplacian $L = D^{-1/2} A D^{-1/2}$, where $D$ is the degree matrix. Remember that the degree matrix has the degree, or number of edges, of each node along the diagonals. Variations on the normalized Laplacian are generally what we use in practice, but for simplicity and illustration, we'll just use the basic, cookie-cutter version of the Laplacian $L = D - A$." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Build the degree matrix D\n", "degrees = np.count_nonzero(A, axis=0)\n", "D = np.diag(degrees)\n", "\n", "# Build the Laplacian matrix L\n", "L = D - A" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below, you can see these matrices visually." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Finding Singular Vectors With Singular Value Decomposition" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-input" ] }, "source": [ "Now that we have a Laplacian matrix, we'll want to find its singular vectors. To do this, we'll need to use a technique called *Singular Value Decomposition*, or SVD. \n", "\n", "SVD is a way to break a single matrix apart (also known as factorizing) into three distinct new matrices -- In our case, the matrix will be the Laplacian we just built. These three new matrices correspond to the singular vectors and singular values of the original matrix: the algorithm will collect all of the singular vectors as columns of one matrix, and the singular values as the diagonals of another matrix.\n", "\n", "In the case of the Laplacian (as with all symmetric matrices that have real, positive eigenvalues), remember that the singular vectors/values and the eigenvectors/values are the same thing. For more technical and generalized details on how SVD works, or for explicit proofs, we would recommend a Linear Algebra textbook [Trefethan, LADR]. Here, we'll look at the SVD with a bit more detail here in the specific case where we start with a matrix which is square, symmetric, and has real eigenvalues.\n", "\n", "**Singular Value Decomposition** Suppose you have a square, symmetrix matrix $X$ with real eigenvalues. In our case, $X$ corresponds to the Laplacian $L$ (or the adjacency matrix $A$).\n", "\n", "\\begin{align*}\n", "\\begin{bmatrix}\n", " x_{11} & & & \" \\\\\n", " & x_{22} & & \\\\\n", " & & \\ddots & \\\\\n", " \" & & & x_{nn}\n", " \\end{bmatrix}\n", "\\end{align*}\n", "\n", "Then, you can find three matrices - one which rotates vectors in space, one which scales them along each coordinate axis, and another which rotates them back - which, when you multiply them all together, recreate the original matrix $X$. This is the essence of singular value decomposition: you can break down any linear transformation into a rotation, a scaling, and another rotation. Let's call the matrix which rotates $U$ (this type of matrix is called \"orthogonal\"), and the matrix that scales $S$.\n", "\n", "\\begin{align*}\n", " X &= U S V^T\n", "\\end{align*}\n", "\n", "Since $U$ is a matrix that just rotates any vector, all of its column-vectors are orthogonal (all at right angles) from each other and they all have the unit length of 1. These columns are more generally called the **singular vectors** of X. In some specific cases, these are also called the eigenvectors. Since $S$ just scales, it's a diagonal matrix: there are values on the diagonals, but nothing (0) on the off-diagonals. The amount that each coordinate axis is scaled are the values on the diagonal entries of $S$, $\\sigma_{i}$. These are **singular values** of the matrix $X$, and, also when some conditions are met, these are also the eigenvalues. Assuming our network is undirected, this will be the case with the Laplacian matrix, but not necessarily the adjacency matrix.\n", "\n", "\\begin{align*}\n", " X &= \\begin{bmatrix}\n", " \\uparrow & \\uparrow & & \\uparrow \\\\\n", " u_1 & \\vec u_2 & ... & \\vec u_n \\\\\n", " \\downarrow & \\downarrow & & \\downarrow\n", " \\end{bmatrix}\\begin{bmatrix}\n", " \\sigma_1 & & & \\\\\n", " & \\sigma_2 & & \\\\\n", " & & \\ddots & \\\\\n", " & & & \\sigma_n\n", " \\end{bmatrix}\\begin{bmatrix}\n", " \\leftarrow & \\vec u_1^T & \\rightarrow \\\\\n", " \\leftarrow & \\vec u_2^T & \\rightarrow \\\\\n", " & \\vdots & \\\\\n", " \\leftarrow & \\vec u_n^T & \\rightarrow \\\\\n", " \\end{bmatrix}\n", "\\end{align*}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Breaking Down Our Network's Laplacian matrix" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we know how to break down any random matrix into singular vectors and values with SVD, so let's apply it to our toy network. We'll break down our Laplacian matrix into $U$, $S$, and $V^\\top$. The Laplacian is a special case where the singular values and singular vectors are the same as the eigenvalues and eigenvectors, so we'll just refer to them as eigenvalues and eigenvectors from here on, since those terms are more common. For similar (actually the same) reasons, in this case $V^\\top = U^\\top$.\n", "\n", "Here, the leftmost column of $U$ (and the leftmost eigenvalue in $S$) correspond to the eigenvector with the highest eigenvalue, and they're organized in descending order (this is standard for Singular Value Decomposition)." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "from scipy.linalg import svd\n", "U, S, Vt = svd(L)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, axs = plt.subplots(1, 5, figsize=(25, 5))\n", "from matplotlib.colors import Normalize\n", "from matplotlib import cm\n", "from graphbook_code import GraphColormap\n", "\n", "# First axis (Laplacian)\n", "heatmap(L, ax=axs[0], cbar=False, title=\"$L$\")\n", "\n", "# Second axis (=)\n", "axs[1].text(x=.5, y=.5, s=\"=\", fontsize=200, \n", " va='center', ha='center')\n", "axs[1].get_xaxis().set_visible(False)\n", "axs[1].get_yaxis().set_visible(False)\n", "sns.despine(ax=axs[1], left=True, bottom=True)\n", "\n", "# Third axis (U)\n", "U_ax = heatmap(U, ax=axs[2], cbar=False, title=\"$U$\")\n", "U_ax.set_xlabel(\"Columns of eigenvectors\")\n", "\n", "# Third axis (S)\n", "E_ax = heatmap(np.diag(S), ax=axs[3], cbar=False, title=\"$S$\")\n", "E_ax.set_xlabel(\"Eigenvalues on diagonal\")\n", "\n", "# Fourth axis (V^T)\n", "Ut_ax = heatmap(Vt, ax=axs[4], cbar=False, title=\"$V^T$\")\n", "Ut_ax.set_xlabel(\"Rows of eigenvectors\")\n", "\n", "# Colorbar\n", "vmin, vmax = np.array(L).min(), np.array(L).max()\n", "norm = Normalize(vmin=vmin, vmax=vmax)\n", "im = cm.ScalarMappable(cmap=GraphColormap(\"sequential\").color, norm=norm)\n", "fig.colorbar(im, ax=axs, shrink=0.8, aspect=10);\n", "\n", "fig.suptitle(\"Decomposing our simple Laplacian into eigenvectors and eigenvalues with SVD\", fontsize=24);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So now we have a collection of eigenvectors organized into a matrix with $U$, and a collection of their corresponding eigenvalues organized into a matrix with $S$. Remember that with Spectral Embedding, we keep only the largest eigenvalues/vectors and \"clip\" columns off of $U$. \n", "\n", "Why exactly do these matrices reconstruct our Laplacian when multiplied together? Why does the clipped version of $U$ give us a lower-dimensional representation of our network? To answer that question, we'll need to start talking about a concept in linear algebra called the *rank* of a matrix. \n", "\n", "The essential idea is that you can turn each eigenvector/eigenvalue pair into a low-information matrix instead of a vector and number. Summing all of these matrices lets you reconstruct $L$. Summing only a few of these matrices lets you get *close* to $L$. In fact, if you were to unwrap the two matrices into single vectors, the vector you get from summing is as close in Euclidean space as you possibly can get to $L$ given the information you deleted when you removed the smaller eigenvectors. \n", "\n", "Let's dive into it!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Why We Care About Taking Eigenvectors: Matrix Rank" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When we embed anything to create a new representation, we're essentially trying to find a simpler version of that thing which preserves as much information as possible. This leads us to the concept of **matrix rank**.\n", "\n", "**Matrix Rank**: The rank of a matrix $X$, defined $rank(X)$, is the number of linearly independent rows and columns of $X$. \n", "\n", "At a very high level, we can think of the matrix rank as telling us just how \"simple\" $X$ is. A matrix which is rank $1$ is very simple: all of its rows or columns can be expressed as a weighted sum of just a single vector. On the other hand, a matrix which has \"full rank\", or a rank equal to the number of rows (or columns, whichever is smaller), is a bit more complex: no row nor column can be expressed as a weighted sum of other rows or columns.\n", "\n", "There are a couple ways that the rank of a matrix and the singular value decomposition interact which are critical to understand: First, you can make a matrix from your singular vectors and values (eigenvectors and values, in our Laplacian's case), and summing all of them recreates your original, full-rank matrix. Each matrix that you add to the sum increases the rank of the result by one. Second, summing only a few of them gets you to the best estimation of the original matrix that you can get to, given the low-rank result. Let's explore this with a bit more depth.\n", "\n", "We'll be using the Laplacian as our examples, which has the distinctive quality of having its eigenvectors be the same as its singular vectors. For the adjacency matrix, this theory all still works, but you'd just have to replace $\\vec u_i \\vec u_i^\\top$ with $\\vec u_i \\vec v_i^\\top$ throughout (the adjacency matrices' SVD is $A = U S V^\\top$, since the right singular vectors might be different than the left singular vectors)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Summing Rank 1 Matrices Recreates The Original Matrix" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can actually create an $n \\times n$ matrix using any one of the original Laplacian's eigenvectors $\\vec u_i$ by taking its outer product $\\vec{u_i} \\vec{u_i}^T$. This creates a rank one matrix which only contains the information stored in the first eigenvector. Scale it by its eigenvalue $\\sigma_i$ and you have something that feels suspiciously similar to how we take the first few singular vectors of $U$ and scale them in the spectral embedding algorithm. \n", "\n", "It turns out that we can express any matrix $X$ as the sum of all of these rank one matrices.\n", "Take the $i^{th}$ column of $U$. Remember that we've been calling this $\\vec u_i$: the $i^{th}$ eigenvector of our Laplacian. Its corresponding eigenvalue is the $i^{th}$ element of the diagonal eigenvalue matrix $E$. You can make a rank one matrix from this eigenvalue/eigenvector pair by taking the outer product and scaling the result by the eigenvalue: $\\sigma_i \\vec u_i \\vec u_i^T$.\n", "\n", "It turns out that when we take the sum of all of these rank $1$ matrices--each one corresponding to a particular eigenvalue/eigenvector pair--we'll recreate the original matrix.\n", "\n", "\\begin{align*}\n", " X &= \\sum_{i = 1}^n \\sigma_i \\vec u_i \\vec u_i^T = \\sigma_1 \\begin{bmatrix}\\uparrow \\\\ \\vec u_1 \\\\ \\downarrow\\end{bmatrix}\\begin{bmatrix}\\leftarrow & \\vec u_1^T & \\rightarrow \\end{bmatrix} + \n", " \\sigma_2 \\begin{bmatrix}\\uparrow \\\\ \\vec u_2 \\\\ \\downarrow\\end{bmatrix}\\begin{bmatrix}\\leftarrow & \\vec u_2^T & \\rightarrow \\end{bmatrix} + \n", " ... + \n", " \\sigma_n \\begin{bmatrix}\\uparrow \\\\ \\vec u_n \\\\ \\downarrow\\end{bmatrix}\\begin{bmatrix}\\leftarrow & \\vec u_n^T & \\rightarrow \\end{bmatrix}\n", "\\end{align*}\n", "\n", "Here are all of the $\\sigma_i \\vec u_i \\vec u_i^T$ for our Laplacian L. Since there were six nodes in the original network, there are six eigenvalue/vector pairs, and six rank 1 matrices." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "n_nodes = U.shape[0]\n", "\n", "# For each eigenvector/value,\n", "# find its outer product,\n", "# and append it to a list.\n", "low_rank_matrices = []\n", "for node in range(n_nodes):\n", " ui = np.atleast_2d(U[:, node]).T\n", " vi = np.atleast_2d(Vt.T[:, node]).T\n", " low_rank_matrix = S[node] * ui @ vi.T\n", " low_rank_matrices.append(low_rank_matrix)\n", " \n", "# Take the elementwise sum of every matrix in the list.\n", "laplacian_sum = np.array(low_rank_matrices).sum(axis=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can see the result of the sum below. On the left are all of the low-rank matrices - one corresponding to each eigenvector - and on the right is the sum of all of them. You can see that the sum is just our Laplacian!" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from matplotlib.gridspec import GridSpec\n", "import warnings\n", "\n", "fig = plt.figure(figsize=(10, 6))\n", "gs = GridSpec(3, 5)\n", "ax_laplacian = fig.add_subplot(gs[:, 2:])\n", "\n", "# Plot low-rank matrices\n", "i = 0\n", "for row in range(3):\n", " for col in range(2):\n", " ax = fig.add_subplot(gs[row, col])\n", " title = f\"$\\sigma_{i+1} u_{i+1} v_{i+1}^T$\"\n", " heatmap(low_rank_matrices[i], ax=ax, cbar=False, title=title)\n", " i += 1\n", " \n", "# Plot Laplacian\n", "heatmap(laplacian_sum, ax=ax_laplacian, cbar=False, title=\"$L = \\sum_{i = 1}^n \\sigma_i u_i v_i^T$\")\n", "\n", "# # Colorbar\n", "cax = fig.add_axes([1, 0, .04, .8])\n", "vmin, vmax = np.array(laplacian_sum).min(), np.array(laplacian_sum).max()\n", "norm = Normalize(vmin=vmin, vmax=vmax)\n", "im = cm.ScalarMappable(cmap=GraphColormap(\"sequential\").color, norm=norm)\n", "fig.colorbar(im, cax=cax, use_gridspec=False);\n", "\n", "\n", "fig.suptitle(\"We can recreate our simple Laplacian by summing all the low-rank matrices\", fontsize=24)\n", "\n", "with warnings.catch_warnings():\n", " warnings.simplefilter(\"ignore\")\n", " plt.tight_layout();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next up, we'll estimate the Laplacian by only taking a few of these matrices. You can already kind of see in the figure above that this'll work - the last two matrices don't even have anything in them (they're just 0)!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### We can approximate our simple Laplacian by only summing a few of the low-rank matrices" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When you sum the first few of these low-rank $\\sigma_i u_i u_i^T$, you can *approximate* your original matrix.\n", "\n", "This tells us something interesting about Spectral Embedding: the information in the first few eigenvectors of a high rank matrix lets us find a more simple approximation to it. You can take a matrix that's extremely complicated (high-rank) and project it down to something which is much less complicated (low-rank).\n", "\n", "Look below. In each plot, we're summing more and more of these low-rank matrices. By the time we get to the fourth sum, we've totally recreated the original Laplacian." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axs = plt.subplots(2, 3, figsize=(9,6))\n", "\n", "current = np.zeros(L.shape)\n", "for i, ax in enumerate(axs.flat):\n", " new = low_rank_matrices[i]\n", " current += new\n", " heatmap(current, ax=ax, cbar=False, \n", " title=f\"$\\sum_{{i = 1}}^{i+1} \\sigma_i u_i u_i^T$\")\n", " \n", "fig.suptitle(\"Each of these is the sum of an \\nincreasing number of low-rank matrices\", fontsize=16)\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Approximating becomes extremely useful when we have a bigger (now regularized) Laplacian" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This becomes even more useful when we have huge networks with thousands of nodes, but only a few communities. It turns out, especially in this situation, we can usually sum a very small number of low-rank matrices and get to an excellent approximation for our network that uses much less information.\n", "\n", "Take the network below, for example. It's generated from a Stochastic Block Model with 1000 nodes total (500 in one community, 500 in another). We took its normalized Laplacian (remember that this means $L = D^{-1/2} A D^{-1/2}$), decomposed it, and summed the first two low-rank matrices that we generated from the eigenvector columns.\n", "\n", "The result is not exact, but it looks pretty close. And we only needed the information from the first two singular vectors instead of all of the information in our full $n \\times n$ matrix! " ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from graspologic.simulations import sbm\n", "from graspologic.utils import to_laplacian\n", "\n", "# Make network\n", "B = np.array([[0.8, 0.1], \n", " [0.1, 0.8]])\n", "n = [25, 25]\n", "A2, labels2 = sbm(n=n, p=B, return_labels=True)\n", "\n", "# Form new laplacian\n", "L2 = to_laplacian(A2)\n", "\n", "# decompose\n", "k = 2\n", "U2, E2, Ut2 = svd(L2)\n", "\n", "k_matrices = U2[:, k]\n", "low_rank_approximation = U2[:,0:k] @ (np.diag(E2[0:k]) @ Ut2[0:k, :])\n", "\n", "\n", "# Plotting\n", "fig, axs = plt.subplots(1, 2, figsize=(12, 6))\n", "l2_hm = heatmap(L2, ax=axs[0], cbar=False, title=\"$L$\")\n", "l2approx_hm = heatmap(low_rank_approximation, ax=axs[1], cbar=False, title=\"$\\sum_{{i = 1}}^{2} \\sigma_i u_i u_i^T$\")\n", "\n", "l2_hm.set_xlabel(\"Full-rank Laplacian for a 50-node matrix\", fontdict={'size': 15})\n", "l2approx_hm.set_xlabel(\"Sum of only two low-rank matrices\", fontdict={'size': 15});\n", "\n", "fig.suptitle(\"Summing only two low-rank matrices approximates the normalized Laplacian pretty well!\", fontsize=24)\n", "\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is where a lot of the power of an SVD comes from: you can approximate extremely complicated (high-rank) matrices with extremely simple (low-rank) matrices." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## How This Matrix Rank Stuff Helps Us Understand Spectral Embedding" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Remember the actual spectral embedding algorithm: we take a network, decompose it with Singular Value Decomposition into its singular vectors and values, and then cut out everything but the top $k$ singular vector/value pairs. Once we scale the columns of singular vectors by their corresponding values, we have our embedding. That embedding is called the latent position matrix, and the locations in space for each of our nodes are called the latent positions.\n", "\n", "Let's go back to our original, small (six-node) network and make an estimate of the latent position matrix from it. We'll embed down to three dimensions." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "k = 3\n", "U_cut = U[:, :k]\n", "E_cut = E[:k]\n", "\n", "latents_small = U_cut @ np.diag(E_cut)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(4, 8))\n", "cmap = cmaps[\"sequential\"]\n", "ax = sns.heatmap(latents_small, cmap=cmap, ax=ax, cbar=False, \n", " xticklabels=1, yticklabels=1)\n", "ax.set_xlabel(\"Eigenvector\")\n", "ax.set_ylabel(\"Node\")\n", "\n", "ax.set_title(\"Latent Position Matrix\", fontsize=22, y=1.01)\n", "plt.tight_layout();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How does what we just talked about help us understand spectral embedding?\n", "\n", "Well, each column of the latent position matrix is the $i^{th}$ eigenvector scaled by the $i^{th}$ eigenvalue: $\\sigma_i \\vec{u_i}$. If we right-multiplied one of those columns by its unscaled transpose $\\vec{u_i}^\\top$, we'd have one of our rank one matrices. This means that you can think of our rank-one matrices as essentially just fancy versions of the columns of a latent position matrix (our embedding). They contain all the same information - they're just matrices instead of vectors!" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, axs = plt.subplots(1, 4, figsize=(20, 5))\n", "\n", "# First axis (Degree)\n", "first_col = E[0] * latents_small[:, 0, None]\n", "first_mat = first_col @ first_col.T\n", "ax = sns.heatmap(first_col, cmap=cmap, ax=axs[0], cbar=False, \n", " xticklabels=1, yticklabels=1)\n", "ax.set_aspect(1.5)\n", "ax.set_xlabel(\"First Eigenvector\")\n", "ax.set_ylabel(\"Node\")\n", "ax.set_title(\"First column of \\nlatent position matrix $u_0$\", fontsize=12, y=1.01)\n", "\n", "# Third axis (Adjacency matrix)\n", "ax = sns.heatmap(first_col.T, cmap=cmap, ax=axs[1], cbar=False, \n", " xticklabels=1, yticklabels=1, square=False)\n", "ax.set_aspect(1)\n", "ax.set_xlabel(\"Node\")\n", "ax.set_title(\"First column of latent position matrix $u_0^T$\", fontsize=12, y=1.01)\n", "\n", "# Third axis (=)\n", "axs[2].text(x=.5, y=.5, s=\"=\", fontsize=200,\n", " va='center', ha='center')\n", "axs[2].get_xaxis().set_visible(False)\n", "axs[2].get_yaxis().set_visible(False)\n", "sns.despine(ax=axs[2], left=True, bottom=True)\n", "\n", "# Fourth axis\n", "heatmap(first_mat, ax=axs[3], cbar=False, title=\"First low-rank \\nmatrix $\\sigma_0 u_0 u_0^T$\")\n", "\n", "# Colorbar\n", "vmin, vmax = np.array(L).min(), np.array(L).max()\n", "norm = Normalize(vmin=vmin, vmax=vmax)\n", "im = cm.ScalarMappable(cmap=GraphColormap(\"sequential\").color, norm=norm)\n", "fig.colorbar(im, ax=axs, shrink=0.8, aspect=10);\n", "\n", "fig.suptitle(\"Our low-rank matrices contain the same information\\n as the columns of the latent position matrix\", fontsize=22, y=1.1);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In fact, you can express the sum we did earlier - our lower-rank estimation of L - with just our latent position matrix! Remember that $U_k$ is the first $k$ eigenvectors of our Laplacian, and $S_k$ is the diagonal matrix with the first $k$ eigenvalues (and that we named them $\\sigma_1$ through $\\sigma_k$).\n" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, axs = plt.subplots(1, 5, figsize=(20, 5))\n", "from matplotlib.transforms import Affine2D\n", "import mpl_toolkits.axisartist.floating_axes as floating_axes\n", "\n", "# First axis (sum matrix)\n", "current = np.zeros(L.shape)\n", "for i in range(2):\n", " new = low_rank_matrices[i]\n", " current += new\n", " \n", "heatmap(current, ax=axs[0], cbar=False, title=\"$\\sum_{i=1}^2 \\sigma_i u_i u_i^T$\")\n", "\n", "# Second axis (=)\n", "axs[1].text(x=.5, y=.5, s=\"=\", fontsize=200,\n", " va='center', ha='center')\n", "axs[1].get_xaxis().set_visible(False)\n", "axs[1].get_yaxis().set_visible(False)\n", "sns.despine(ax=axs[1], left=True, bottom=True)\n", "\n", "# Third axis (Uk)\n", "k = 2\n", "Uk = U[:, :k]\n", "Ek = np.diag(E)[:k, :k]\n", "ax = sns.heatmap(Uk, cmap=cmap, ax=axs[2], cbar=False, \n", " xticklabels=1, yticklabels=1)\n", "ax.set_box_aspect(2)\n", "ax.set_xlabel(\"Eigenvector\")\n", "ax.set_title(\"$U_k$\", fontsize=12, y=1.01)\n", "\n", "\n", "# Ek\n", "ax = sns.heatmap(Ek, cmap=cmap, ax=axs[3], cbar=False, \n", " xticklabels=1, yticklabels=1, square=True)\n", "ax.set_title(\"$S_k$\", fontsize=12, y=1.01)\n", "sns.despine(bottom=False, top=False, right=False, left=False, ax=ax)\n", "\n", "# Uk^T\n", "# TODO: make this the same size as Uk, just rotated (currently too small)\n", "# Will probably involve revamping all this code to make subplots differently,\n", "# because the reason it's that size is that the dimensions are constrained by the `plt.subplots` call.\n", "transform = Affine2D().rotate_deg(90)\n", "axs[4].set_transform(transform)\n", "ax = sns.heatmap(Uk.T, cmap=cmap, ax=axs[4], cbar=False, \n", " xticklabels=1, yticklabels=1)\n", "ax.set_box_aspect(.5)\n", "ax.set_title(\"$U_k^T$\", fontsize=12, y=1.01)\n", "sns.despine(bottom=False, top=False, right=False, left=False, ax=ax)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This helps gives an intuition for why our latent position matrix gives a representation of our network. You can take columns of it, turn those columns into matrices, and sum those matrices, and then estimate the Laplacian for the network. That means the columns of our embedding network contain all of the information necessary to estimate the network!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Figuring Out How Many Dimensions To Embed Your Network Into" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One thing we haven't addressed is how to figure out how many dimensions to embed down to. We've generally been embedding into two dimensions throughout this chapter (mainly because it's easier to visualize), but you can embed into as many dimensions as you want.\n", "\n", "If you don't have any prior information about the \"true\" dimensionality of your latent positions, by default you'd just be stuck guessing. Fortunately, there are some rules-of-thumb to make your guess better, and some methods people have developed to make fairly decent guesses automatically.\n", "\n", "The most common way to pick the number of embedding dimensions is with something called a scree plot. Essentially, the intuition is this: the top singular vectors of an adjacency matrix contain the most useful information about your network, and as the singular vectors have smaller and smaller singular values, they contain less important and so are less important (this is why we're allowed to cut out the smallest $n-k$ singular vectors in the spectral embedding algorithm).\n", "\n", "The scree plot just plots the singular values by their indices: the first (biggest) singular value is in the beginning, and the last (smallest) singular value is at the end.\n", "\n", "You can see the scree plot for the Laplacian we made earlier below. We're only plotting the first ten singular values for demonstration purposes." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# from graspologic.plot import screeplot\n", "from matplotlib.patches import Circle\n", "from matplotlib.patheffects import withStroke\n", "from mpl_toolkits.axes_grid1.anchored_artists import AnchoredDrawingArea\n", "from scipy.linalg import svdvals\n", "\n", "fig, ax = plt.subplots(figsize=(8, 5))\n", "\n", "# eigval plot\n", "D = svdvals(L2)\n", "ax.plot(D[:10])\n", "ax.set_xlabel(\"Singular value index\")\n", "ax.set_ylabel(\"Singular value\")\n", "\n", "# plot circle\n", "x, y = .15, .15\n", "radius = .15\n", "ada = AnchoredDrawingArea(150, 150, 0, 0, loc='lower left', pad=0., frameon=False)\n", "circle = Circle((105, 35), 20, clip_on=False, zorder=10, linewidth=1,\n", " edgecolor='black', facecolor=(0, 0, 0, .0125),\n", " path_effects=[withStroke(linewidth=5, foreground='w')])\n", "ada.da.add_artist(circle)\n", "ax.add_artist(ada)\n", "\n", "# add text\n", "def text(x, y, text):\n", " ax.text(x, y, text, backgroundcolor=\"white\",\n", " ha='center', va='top', color='blue')\n", " \n", "text(2, .19, \"Elbow\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You'll notice that there's a marked area called the \"elbow\". This is an area where singular values stop changing in magnitude as much when they get smaller: before the elbow, singular values change rapidly, and after the elbow, singular values barely change at all. (It's called an elbow because the plot kind of looks like an arm, viewed from the side!)\n", "\n", "The location of this elbow gives you a rough indication for how many \"true\" dimensions your latent positions have. The singular values after the elbow are quite close to each other and have singular vectors which are largely noise, and don't tell you very much about your data. It looks from the scree plot that we should be embedding down to two dimensions, and that adding more dimensions would probably just mean adding noise to our embedding.\n", "\n", "One drawback to this method is that a lot of the time, the elbow location is pretty subjective - real data will rarely have a nice, pretty elbow like the one you see above. The advantage is that it still generally works pretty well; embedding into a few more dimensions than you need isn't too bad, since you'll only have a few noies dimensions and there still may be *some* signal there.\n", "\n", "In any case, Graspologic automates the process of finding an elbow using a popular method developed in 2006 by Mu Zhu and Ali Ghodsi at the University of Waterloo. We won't get into the specifics of how it works here, but you can usually find fairly good elbows automatically." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using Graspologic to embed networks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It's pretty straightforward to use graspologic's API to embed a network. The setup works like an SKlearn class: you instantiate an AdjacencySpectralEmbed class, and then you use it to transform data. You set the number of dimensions to embed to (the number of eigenvector columns to keep!) with `n_components`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Adjacency Spectral Embedding" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "from graspologic.embed import AdjacencySpectralEmbed as ASE\n", "\n", "# Generate a network from an SBM\n", "B = np.array([[0.8, 0.1], \n", " [0.1, 0.8]])\n", "n = [25, 25]\n", "A, labels = sbm(n=n, p=B, return_labels=True)\n", "\n", "# Instantiate an ASE model and find the embedding\n", "ase = ASE(n_components=2)\n", "embedding = ase.fit_transform(A)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "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k52dzbXXXnto2siRIxk3bhw333wzw4cPZ8SIEcyZMweAV155hQkTJjB58mT69evHzJkzeeSRRxgzZgwjRoxgzZo1AEyfPp1vfOMbnHLKKfTr149XXnmFq6++miFDhjB9+vRDdbVu3frQ8OOPP35o3vTp07nxxhs59dRT6dev36Ekv379eoYPH87+/fu59dZbmTNnDqNGjWLOnDkMHDiQg/ciVVVVMWDAAJJxb1KjXocvItJQ3nvvPU466aQjpj/xxBMsWbKEpUuX8umnnzJ69GjGjx8PwNKlS1mxYgUdO3akX79+zJgxg4ULF/Kzn/2MX/ziF9x1110AbNu2jTfffJN58+YxadIk3njjDe69915Gjx7NkiVLGDVq1FFj27hxI6+//jrvv/8+kyZNOtSUA5CTk8Ptt99OcXExd999NwDvv/8+jzzyCN/+9rd58cUXGTlyJF26dEl4G2kPX0RS2uuvv87UqVPJzMykW7duTJgwgUWLFgEwevRoevToQW5uLv379+fcc88FYMSIEaxfv/7QOi666CLMjBEjRtCtWzdGjBhBRkYGw4YNO6xcTS6++GIyMjIYOnRonZqYrr76ah566CEA7r//fr7yla/U/4PHoYQvIilh2LBhLF68uF7L5ObmHhrOyMg4NJ6RkUFFRcUR5WLLVC8Xe5lk9evjY5dxr70TgYKCArp168ZLL73EwoULueCCC+rzsWqkhC8iKeHMM8+kvLyc2bNnH5r27rvv0r59e+bMmUNlZSVlZWW8+uqrjBkzJun1d+vWjRUrVlBVVcWTTz5Zr2XbtGnDrl27Dps2Y8YMrrrqKi6//HIyMzOTEqMSvoikBDPjySef5MUXX6R///4MGzaMW265hSuvvJLjjz+ekSNHcuaZZ/LjH/+Y7t27J73+WbNm8fnPf55TTz2VHj161GvZM844g+XLlx86aQswadIkdu/enbTmHACry+FFFIqKiry4uDjqMESkiVqxYgVDhgyJOowGU1xczE033cRrr71WY5l428DMFrt7UbzyukpHRKSJmTVrFr/61a945JFHkrpeNemIiDQxM2fO5MMPP2TcuHFJXa8SvohImlDCFxFJE0r4IiJpQglfRCRNKOGLiDSSZ599lsGDBzNgwABmzZrV6PXrskwRkWqeeqeUnzy3ko+376Vn+xbcfN5gLj6hV0LrrKys5Prrr+eF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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_latents(embedding, labels=labels, title=\"Adjacency Spectral Embedding\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Laplacian Spectral Embedding" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "from graspologic.embed import LaplacianSpectralEmbed as LSE\n", "\n", "embedding = LSE(n_components=2).fit_transform(A)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_latents(embedding, labels=labels, title=\"Laplacian Spectral Embedding\")" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## When should you use ASE and when should you use LSE?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Throughout this article, we've primarily used LSE, since Laplacians have some nice properties (such as having singular values being the same as eigenvalues) that make stuff like SVD easier to explain. However, you can embed the same network with either ASE or LSE, and you'll get two different (but equally true) embeddings.\n", "\n", "Since both embeddings will give you a reasonable clustering, how are they different? When should you use one compared to the other?\n", "\n", "Well, it turns out that LSE and ASE capture different notions of \"clustering\". Carey Priebe and collaborators at Johns Hopkins University investigated this recently - in 2018 - and discovered that LSE lets you capture \"affinity\" structure, whereas ASE lets you capture \"core-periphery\" structure (their paper is called \"On a two-truths phenomenon in spectral graph clustering\" - it's an interesting read for the curious). The difference between the two types of structure is shown in the image below.\n", "\n", "\n", "```{figure} ../../Images/two-truths.jpeg\n", "---\n", "height: 400px\n", "name: two-truths\n", "---\n", "Affinity vs. Core-periphery Structure \n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The \"affinity\" structure - the one that LSE is good at finding - means that you have two groups of nodes which are well-connected within the groups, and aren't very connected with each other. Think of a friend network in two schools, where people within the same school are much more likely to be friends than people in different schools. This is a type of structure we've seen a lot in this book in our Stochastic Block Model examples. If you think the communities in your data look like this, you should apply LSE to your network.\n", "\n", "The name \"core-periphery\" is a good description for this type of structure (which ASE is good at finding). In this notion of clustering, you have a core group of well-connected nodes surrounded by a bunch of \"outlier\" nodes which just don't have too many edges with anything in general. Think of a core of popular, well-liked, and charismatic kids at a high school, with a periphery of loners or people who prefer not to socialize as much." ] } ], "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.9.0" } }, "nbformat": 4, "nbformat_minor": 4 }