From 017b6bc6e3e3887acb7c813980f3af1f20e202c6 Mon Sep 17 00:00:00 2001 From: Christian Risi <75698846+CnF-Gris@users.noreply.github.com> Date: Sun, 9 Nov 2025 18:54:50 +0100 Subject: [PATCH] Added small experiments for Laplacian Matrix --- .../python-experiments/laplacian_graph.ipynb | 254 ++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100644 Chapters/14-GNN-GCN/python-experiments/laplacian_graph.ipynb diff --git a/Chapters/14-GNN-GCN/python-experiments/laplacian_graph.ipynb b/Chapters/14-GNN-GCN/python-experiments/laplacian_graph.ipynb new file mode 100644 index 0000000..d0f71f5 --- /dev/null +++ b/Chapters/14-GNN-GCN/python-experiments/laplacian_graph.ipynb @@ -0,0 +1,254 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "218c5394", + "metadata": {}, + "source": [ + "# Laplacian Matrix powers\n", + "\n", + "For these experiments, I'll use this graph taken from wikipedia\n", + "\n", + "![graph image](https://en.wikipedia.org/wiki/Laplacian_matrix#/media/File:6n-graf.svg)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "c717d831", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Normal L\n", + "tensor([[ 2, -1, 0, 0, -1, 0],\n", + " [-1, 3, -1, 0, -1, 0],\n", + " [ 0, -1, 2, -1, 0, 0],\n", + " [ 0, 0, -1, 3, -1, -1],\n", + " [-1, -1, 0, -1, 3, 0],\n", + " [ 0, 0, 0, -1, 0, 1]])\n", + "\n", + "\n", + "L squared\n", + "tensor([[ 6, -4, 1, 1, -4, 0],\n", + " [-4, 12, -5, 2, -5, 0],\n", + " [ 1, -5, 6, -5, 2, 1],\n", + " [ 1, 2, -5, 12, -6, -4],\n", + " [-4, -5, 2, -6, 12, 1],\n", + " [ 0, 0, 1, -4, 1, 2]])\n", + "\n", + "\n", + "L cubic\n", + "tensor([[ 20, -15, 5, 6, -15, -1],\n", + " [-15, 50, -24, 16, -25, -2],\n", + " [ 5, -24, 22, -24, 15, 6],\n", + " [ 6, 16, -24, 51, -33, -16],\n", + " [-15, -25, 15, -33, 51, 7],\n", + " [ -1, -2, 6, -16, 7, 6]])\n", + "\n", + "\n", + "L forth\n", + "tensor([[ 70, -55, 19, 29, -56, -7],\n", + " [ -55, 214, -114, 99, -126, -18],\n", + " [ 19, -114, 92, -115, 88, 30],\n", + " [ 29, 99, -115, 226, -172, -67],\n", + " [ -56, -126, 88, -172, 226, 40],\n", + " [ -7, -18, 30, -67, 40, 22]])\n", + "\n", + "\n", + "L fifth\n", + "tensor([[ 251, -198, 64, 131, -212, -36],\n", + " [-198, 937, -541, 555, -636, -117],\n", + " [ 64, -541, 413, -555, 474, 145],\n", + " [ 131, 555, -555, 1032, -870, -293],\n", + " [-212, -636, 474, -870, 1032, 212],\n", + " [ -36, -117, 145, -293, 212, 89]])\n", + "\n", + "\n", + "L sixth\n", + "tensor([[ 912, -697, 195, 577, -820, -167],\n", + " [ -697, 4186, -2574, 2959, -3202, -672],\n", + " [ 195, -2574, 1922, -2697, 2454, 700],\n", + " [ 577, 2959, -2697, 4814, -4328, -1325],\n", + " [ -820, -3202, 2454, -4328, 4814, 1082],\n", + " [ -167, -672, 700, -1325, 1082, 382]])\n", + "\n", + "\n" + ] + } + ], + "source": [ + "import torch\n", + "\n", + "L = torch.tensor([\n", + " [2, -1, 0, 0, -1, 0],\n", + " [-1, 3, -1, 0, -1, 0],\n", + " [0, -1, 2, -1, 0, 0],\n", + " [0, 0, -1, 3, -1, -1],\n", + " [-1, -1, 0, -1, 3, 0],\n", + " [0, 0, 0, -1, 0, 1]\n", + "])\n", + "L_2 = L@L\n", + "L_3 = L_2@L\n", + "L_4 = L_3@L\n", + "L_5 = L_4@L\n", + "L_6 = L_5@L\n", + "print(\"Normal L\")\n", + "print(L)\n", + "print(\"\\n\")\n", + "print(\"L squared\")\n", + "print(L_2)\n", + "print(\"\\n\")\n", + "print(\"L cubic\")\n", + "print(L_3)\n", + "print(\"\\n\")\n", + "print(\"L forth\")\n", + "print(L_4)\n", + "print(\"\\n\")\n", + "print(\"L fifth\")\n", + "print(L_5)\n", + "print(\"\\n\")\n", + "print(\"L sixth\")\n", + "print(L_6)\n", + "print(\"\\n\")\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "1b01bf03", + "metadata": {}, + "source": [ + "## More experiments\n", + "\n", + "Hee we'll connect each node is connected to the previous and next" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "dd51c047", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Normal L\n", + "tensor([[ 1, -1, 0, 0, 0, 0],\n", + " [-1, 1, -1, 0, 0, 0],\n", + " [ 0, -1, 1, -1, 0, 0],\n", + " [ 0, 0, -1, 1, -1, 0],\n", + " [ 0, 0, 0, -1, 1, -1],\n", + " [ 0, 0, 0, 0, -1, 1]])\n", + "\n", + "\n", + "L squared\n", + "tensor([[ 2, -2, 1, 0, 0, 0],\n", + " [-2, 3, -2, 1, 0, 0],\n", + " [ 1, -2, 3, -2, 1, 0],\n", + " [ 0, 1, -2, 3, -2, 1],\n", + " [ 0, 0, 1, -2, 3, -2],\n", + " [ 0, 0, 0, 1, -2, 2]])\n", + "\n", + "\n", + "L cubic\n", + "tensor([[ 4, -5, 3, -1, 0, 0],\n", + " [-5, 7, -6, 3, -1, 0],\n", + " [ 3, -6, 7, -6, 3, -1],\n", + " [-1, 3, -6, 7, -6, 3],\n", + " [ 0, -1, 3, -6, 7, -5],\n", + " [ 0, 0, -1, 3, -5, 4]])\n", + "\n", + "\n", + "L forth\n", + "tensor([[ 9, -12, 9, -4, 1, 0],\n", + " [-12, 18, -16, 10, -4, 1],\n", + " [ 9, -16, 19, -16, 10, -4],\n", + " [ -4, 10, -16, 19, -16, 9],\n", + " [ 1, -4, 10, -16, 18, -12],\n", + " [ 0, 1, -4, 9, -12, 9]])\n", + "\n", + "\n", + "L fifth\n", + "tensor([[ 21, -30, 25, -14, 5, -1],\n", + " [-30, 46, -44, 30, -15, 5],\n", + " [ 25, -44, 51, -45, 30, -14],\n", + " [-14, 30, -45, 51, -44, 25],\n", + " [ 5, -15, 30, -44, 46, -30],\n", + " [ -1, 5, -14, 25, -30, 21]])\n", + "\n", + "\n", + "L sixth\n", + "tensor([[ 51, -76, 69, -44, 20, -6],\n", + " [ -76, 120, -120, 89, -50, 20],\n", + " [ 69, -120, 140, -126, 89, -44],\n", + " [ -44, 89, -126, 140, -120, 69],\n", + " [ 20, -50, 89, -120, 120, -76],\n", + " [ -6, 20, -44, 69, -76, 51]])\n", + "\n", + "\n" + ] + } + ], + "source": [ + "L = torch.tensor([\n", + " [1, -1, 0, 0, 0, 0],\n", + " [-1, 1, -1, 0, 0, 0],\n", + " [0, -1, 1, -1, 0, 0],\n", + " [0, 0, -1, 1, -1, 0],\n", + " [0, 0, 0, -1, 1, -1],\n", + " [0, 0, 0, 0, -1, 1]\n", + "])\n", + "L_2 = L@L\n", + "L_3 = L_2@L\n", + "L_4 = L_3@L\n", + "L_5 = L_4@L\n", + "L_6 = L_5@L\n", + "print(\"Normal L\")\n", + "print(L)\n", + "print(\"\\n\")\n", + "print(\"L squared\")\n", + "print(L_2)\n", + "print(\"\\n\")\n", + "print(\"L cubic\")\n", + "print(L_3)\n", + "print(\"\\n\")\n", + "print(\"L forth\")\n", + "print(L_4)\n", + "print(\"\\n\")\n", + "print(\"L fifth\")\n", + "print(L_5)\n", + "print(\"\\n\")\n", + "print(\"L sixth\")\n", + "print(L_6)\n", + "print(\"\\n\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "deep_learning", + "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.13.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}