{ "cells": [ { "cell_type": "markdown", "id": "ry3hhpk7fq", "metadata": {}, "source": [ "# Topological features for PyTorch classifiers\n", "\n", "This tutorial shows how to turn point cloud data into fixed-size topological feature vectors using masspcf, and feed them into a PyTorch neural network for classification.\n", "\n", "The pipeline looks like this:\n", "\n", "```\n", "Point clouds --> Persistent homology --> Functional summaries (PCFs)\n", " |\n", " Evaluate on grid\n", " |\n", " NumPy feature vectors\n", " |\n", " torch.from_numpy()\n", " |\n", " PyTorch model\n", "```\n", "\n", "The key insight is that functional summaries (stable ranks, Betti curves, APFs) are piecewise constant functions, and evaluating them on a fixed grid of time points produces ordinary numeric vectors that any neural network can consume." ] }, { "cell_type": "markdown", "id": "drilvr2bqnk", "metadata": {}, "source": [ "## Step 1: Generate data\n", "\n", "We create two classes of point clouds with different topological structure:\n", "- **Class 0**: points sampled uniformly from a filled disk (no persistent loop)\n", "- **Class 1**: points sampled from an annulus (one persistent H1 loop)" ] }, { "cell_type": "code", "execution_count": 1, "id": "5ong0skoch8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Point clouds: Shape(200), Labels: (200,)\n" ] } ], "source": [ "import numpy as np\n", "import masspcf as mpcf\n", "from masspcf import persistence as mpers\n", "\n", "rng = np.random.default_rng(42)\n", "n_samples = 200\n", "n_points = 60\n", "\n", "def sample_disk(n, rng):\n", " \"\"\"Uniform samples from a filled unit disk.\"\"\"\n", " r = np.sqrt(rng.uniform(0, 1, n))\n", " theta = rng.uniform(0, 2 * np.pi, n)\n", " return np.column_stack([r * np.cos(theta), r * np.sin(theta)]).astype(np.float32)\n", "\n", "def sample_annulus(n, rng):\n", " \"\"\"Uniform samples from an annulus (r in [0.8, 1.2]).\"\"\"\n", " r = np.sqrt(rng.uniform(0.8**2, 1.2**2, n))\n", " theta = rng.uniform(0, 2 * np.pi, n)\n", " return np.column_stack([r * np.cos(theta), r * np.sin(theta)]).astype(np.float32)\n", "\n", "pclouds = mpcf.zeros((n_samples,), dtype=mpcf.pcloud32)\n", "labels = np.zeros(n_samples, dtype=np.int64)\n", "\n", "for i in range(n_samples):\n", " if i < n_samples // 2:\n", " pclouds[i] = sample_disk(n_points, rng)\n", " labels[i] = 0\n", " else:\n", " pclouds[i] = sample_annulus(n_points, rng)\n", " labels[i] = 1\n", "\n", "print(f\"Point clouds: {pclouds.shape}, Labels: {labels.shape}\")" ] }, { "cell_type": "markdown", "id": "yddnkat0p4d", "metadata": {}, "source": [ "Let's visualize one example from each class:" ] }, { "cell_type": "code", "execution_count": 2, "id": "te7cbyw9gx", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "fig, axes = plt.subplots(1, 2, figsize=(8, 3.5))\n", "for ax, idx, title in zip(axes, [0, n_samples // 2], [\"Disk (class 0)\", \"Annulus (class 1)\"]):\n", " pts = pclouds[idx].to_numpy() if hasattr(pclouds[idx], 'to_numpy') else np.array(pclouds[idx])\n", " ax.scatter(pts[:, 0], pts[:, 1], s=10, alpha=0.7)\n", " ax.set_aspect(\"equal\")\n", " ax.set_title(title)\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "j9j97vlieoo", "metadata": {}, "source": [ "## Step 2: Compute topological features\n", "\n", "We compute persistent homology up to dimension 1, convert the barcodes to stable rank PCFs, and then evaluate them on a fixed grid to get feature vectors." ] }, { "cell_type": "code", "execution_count": 3, "id": "sgml4k2oeip", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Barcodes shape: Shape(200, 2)\n", "Stable ranks shape: Shape(200, 2)\n" ] } ], "source": [ "# Persistent homology (H0 and H1)\n", "barcodes = mpers.compute_persistent_homology(pclouds, max_dim=1)\n", "print(f\"Barcodes shape: {barcodes.shape}\") # (200, 2)\n", "\n", "# Convert to stable rank PCFs\n", "sranks = mpers.barcode_to_stable_rank(barcodes)\n", "print(f\"Stable ranks shape: {sranks.shape}\") # (200, 2)" ] }, { "cell_type": "code", "execution_count": 4, "id": "s28ugmja94f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Feature matrix shape: (200, 50)\n" ] } ], "source": [ "# Evaluate H1 stable ranks on a grid to get fixed-size feature vectors\n", "grid = np.linspace(0, 2.0, 50, dtype=np.float32)\n", "features = sranks[:, 1](grid) # shape (200, 50)\n", "print(f\"Feature matrix shape: {features.shape}\")" ] }, { "cell_type": "markdown", "id": "pq7hrxauzqb", "metadata": {}, "source": [ "Let's visualize the H1 stable ranks for each class. The annulus class should show more persistent H1 features (loops)." ] }, { "cell_type": "code", "execution_count": 5, "id": "g8tmclzn1ov", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA94AAAFUCAYAAADS2eS8AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAhGlJREFUeJzs3XmcHVWd///Xqaq79550ls5KWETWKCiCCyAoIDLAMC55OLKo6DjwHfwyOorfURydkVFHRr/KF9SfAiPjAojgNigii8qigKCACAnZl056u7fvfqvq/P6o7pvu9O0kTfqmE3g/H4/KvffUqVOnqm763E+dU1XGWmsRERERERERkaZwZroCIiIiIiIiIi9mCrxFREREREREmkiBt4iIiIiIiEgTKfAWERERERERaSIF3iIiIiIiIiJNpMBbREREREREpIkUeIuIiIiIiIg0kQJvERERERERkSZS4C0iIiIiIiLSRAq8RV6gk046iSOOOGKX+dasWYMxhhtuuKH5lWqCCy+8kJaWlpmuxi690P28dOlS3vrWt77g9YZhyBFHHMG//du/TWm5e++9F2MM99577wte90y68847aWlpYdu2bTNdFRHZh6mtFJjZ47t+/XqSySS//e1vp7Tcpz71KYwxTapV81133XUsXryYSqUy01WREQq8peluuOEGjDE88sgjDec3apR/8Ytf8N73vpcjjjgC13VZunTptNbp6aef5lOf+hRr1qyZ1nJl+hhj6pPneXR1dXHMMcdw2WWX8fTTT8909eq++93vsn79ei699NKZrsq0+fOf/8zpp59OS0sLXV1dvPvd754QYJ9++ukcdNBBXHXVVTNUS5EXF7WVsieGhoZIJpMYY/jzn/8809XZp3z605/muOOO47Wvfe1MV2VafP/73+dv//ZvOfjggzHGcNJJJzXMd+GFF1KtVvna1762dysok1LgLfuk73znO3znO9+hvb2dnp6eaS//6aef5l/+5V/0Y2If96Y3vYlvf/vbXH/99Xz605/mla98JTfeeCNHH300V1999bi8S5YsoVQq8e53v3uv1vELX/gC73znO2lvb9+r622WDRs28IY3vIGVK1fy2c9+lg9/+MP89Kc/5U1vehPVanVc3g984AN87WtfY3h4eIZqK/LSprZSRt1yyy0YY5g3bx7//d//PdPV2Wds27aNG2+8kb/7u7+b6apMm2uvvZY77riDRYsW0dnZOWm+ZDLJBRdcwNVXX421di/WUCajwFv2SZ/97GfJ5XL89re/5eijj57p6uzzfN+fEBS9GBxyyCH87d/+Le9+97u59NJL+cY3vsGqVat41atexT/+4z/ys5/9rJ7XGEMymcR13b1Wvz/84Q888cQTvP3tb99r62y2z372sxQKBX71q1/xD//wD3z84x/n5ptv5oknnpgwRPC8886jUqlwyy23zExlRV7i1FZOzYu1rQS46aabeMtb3sKKFSv4zne+M9PV2WfcdNNNeJ7HWWedNdNVmTbf/va3yWaz/OpXv9rlCbe3v/3trF27lnvuuWcv1U52RoG37JN6enqIxWIvePnvfe97HHPMMbS2ttLW1saRRx7Jl7/8ZSAazve2t70NgJNPPrk+nHn0Wts77riDM888k56eHhKJBAceeCCf+cxnCIKg4boeffRRTjjhBFKpFAcccADXXXfdbtXxmWee4W/+5m/o6uoimUxy7LHH8qMf/WiXy41eJ/Uf//EffOlLX+LAAw8kkUjw9NNPU61W+eQnP8kxxxxDe3s7mUyG17/+9RP+4I4t4+tf/3q9jFe96lX8/ve/32UdHn/8cbq7uznppJPI5/MAPPLII5x22mnMnj27vi/e8573jFtu8+bNPPPMM9Rqtd3aR43MmjWL733ve3ieN+666kbXj23ZsoWLLrqIhQsXkkgkmD9/PmefffYue29uvPFGPM/jIx/5yE7z3X777cTjcd7whjdMmLdx40be+9731r9HBxxwAB/84Ad3+qPv17/+NW9729tYvHgxiUSCRYsW8b//9/+mVCqNy7c727U7x6ORH/zgB7z1rW9l8eLF9bRTTz2VQw45hJtvvnlc3jlz5nDUUUdxxx137LJcEZl+aisn91JqK9etW8evf/1r3vnOd/LOd76T1atX88ADD0zIN3q5wtNPP83JJ59MOp1mwYIFfP7znx+Xb/QeJDfffDP/9m//xsKFC0kmk5xyyimsXLlyXN6lS5dy4YUXNlzXZEOgd5XnwgsvnHDZxM6+qztz++23c9xxxzW8/v7hhx/mLW95C52dnWQyGY466qhdlnn99dfzxje+kTlz5pBIJDjssMO49tprJ+TbneP8Qrdp0aJFOM7uhXDHHHMMXV1daqf3Ed5MV0BeOrLZLH19fRPS9yQIa+Suu+5ixYoVnHLKKXzuc58DomtWf/vb33LZZZfxhje8gX/4h3/g//7f/8vHP/5xXv7ylwPUX2+44QZaWlq4/PLLaWlp4Ve/+hWf/OQnyeVyfOELXxi3rsHBQd7ylrfw9re/nRUrVnDzzTfzwQ9+kHg8vtMg56mnnuK1r30tCxYs4GMf+xiZTIabb76Zc845hx/84Aece+65u9zO66+/nnK5zPvf/34SiQRdXV3kcjn+v//v/2PFihVcfPHFDA8P881vfpPTTjuN3/3udyxfvnxcGd/5zncYHh7mAx/4AMYYPv/5z/PXf/3XPP/885P+mPv973/PaaedxrHHHssdd9xBKpVi69atvPnNb6a7u5uPfexjdHR0sGbNGm677bZxy15xxRXceOONrF69eo+uRVy8eDEnnngi99xzD7lcjra2tob5zjvvPJ566in+1//6XyxdupStW7dy1113sW7duknX//Wvf52/+7u/4+Mf/zj/+q//utN6PPDAAxxxxBET9tWmTZt49atfzdDQEO9///s59NBD2bhxI7feeivFYpF4PN6wvFtuuYViscgHP/hBZs2axe9+9zu+8pWvsGHDhnG9yrvart09HjvauHEjW7du5dhjj50w79WvfvW4EQajjjnmGG6//fadlisiu09t5XZqK3evrfzud79LJpPhrW99K6lUigMPPJD//u//5oQTTpiQd3BwkNNPP52//uu/5u1vfzu33norH/3oRznyyCM544wzxuX993//dxzH4cMf/jDZbJbPf/7zvOtd7+Lhhx/eZZ2m066+q5Op1Wr8/ve/54Mf/GDDMt/61rcyf/58LrvsMubNm8ef//xnfvKTn+y0zGuvvZbDDz+cv/qrv8LzPH784x/z93//94RhyCWXXAKwW8f5hW7TC/HKV75yyjeWkyaxIk12/fXXW2Cn0+GHHz7p8meeeaZdsmTJbq/vsssus21tbdb3/Unz3HLLLRaw99xzz4R5xWJxQtoHPvABm06nbblcrqedeOKJFrBf/OIX62mVSsUuX77czpkzx1arVWuttatXr7aAvf766+v5TjnlFHvkkUeOKy8MQ3vCCSfYgw8+eKfbN1peW1ub3bp167h5vu/bSqUyLm1wcNDOnTvXvuc975lQxqxZs+zAwEA9/Y477rCA/fGPf1xPu+CCC2wmk7HWWvub3/zGtrW12TPPPHNc3X/4wx9awP7+97/fad0vuOACC9jVq1fvNJ+11gL2kksumXT+ZZddZgH7xBNPjNum0f08ODhoAfuFL3xhp+tZsmSJPfPMM6211n75y1+2xhj7mc98Zpf1s9bahQsX2vPOO29C+vnnn28dx2m4P8IwtNZae88990z4Djb67l111VXWGGPXrl2729u1u8djR7///e8tYP/rv/5rwryPfOQjFhh33K219rOf/awFbG9v75TWJSLjqa1UWzm2rN1tK6219sgjj7Tvete76p8//vGP29mzZ9tarTYu3+ixGPs3vlKp2Hnz5o1ry0bbp5e//OXj9tOXv/xlC9g//elP9bQlS5bYCy64YEKdTjzxRHviiSfWPzc6vjvmGXXBBReM+y7vzne1kZUrV1rAfuUrXxmX7vu+PeCAA+ySJUvs4ODguHmjbbS11l555ZV2x1Cp0ff+tNNOs8uWLat/3p3j/EK3aUeHH354w3041vvf/36bSqX2aD0yPTTUXPaaa665hrvuumvCdNRRR03rejo6OigUCtx1110vaPlUKlV/Pzw8TF9fH69//espFos888wz4/J6nscHPvCB+ud4PM4HPvABtm7dyqOPPtqw/IGBAX71q1/x9re/vV5+X18f/f39nHbaaTz33HNs3Lhxl/U877zz6O7uHpfmum69NzUMQwYGBvB9n2OPPZbHHntsQhnveMc7xt2Y4/Wvfz0Azz///IS899xzD6eddhqnnHIKt912G4lEoj6vo6MDgJ/85Cc77ZW54YYbsNZOy513R4eNTXZjr1QqRTwe595772VwcHCX5X3+85/nsssu43Of+xz//M//vFt16O/vn3BjkzAMuf322znrrLMa9hzv7NEkY797hUKBvr4+TjjhBKy1/OEPf9jt7drd47Gj0SHtY4/tqGQyOS7PqNHtb9RDJyJTp7YyorZy99rKP/7xj/zpT39ixYoV9bQVK1bQ19fHz3/+8wn5W1pa+Nu//dv653g8zqtf/eqG23LRRReNG6G1s+1uphf6Xe3v7weY0E7/4Q9/YPXq1XzoQx+qH5NRu3p82Njv/ejolBNPPJHnn3+ebDZbry/s/Djv6f+/qejs7KRUKlEsFpu+Ltk5Bd6y17z61a/m1FNPnTDt7I6ML8Tf//3fc8ghh3DGGWewcOFC3vOe93DnnXfu9vJPPfUU5557Lu3t7bS1tdHd3V1vpEb/qI7q6ekhk8mMSzvkkEMAJr2OeOXKlVhr+cQnPkF3d/e46corrwSiYUq7csABBzRMv/HGGznqqKNIJpPMmjWL7u5ufvrTn06oOzDuOl7Y3jjtGNCVy2XOPPNMXvGKV3DzzTdPGCp94oknct555/Ev//IvzJ49m7PPPpvrr7++qc+OHL1errW1teH8RCLB5z73Of7nf/6HuXPn8oY3vIHPf/7zbNmyZULe++67j49+9KN89KMf3eV13TuyO9wpdNu2beRyud16bu2O1q1bx4UXXkhXVxctLS10d3dz4oknAtu/e7uzXS/0eIz+oGiUr1wuj8szanT79+dnnYrsS9RWRtRW7p6bbrqJTCbDsmXLWLlyJStXriSZTLJ06dKGdzdfuHDhhL/XnZ2dDU/k7u52N9uefld3bKdXrVoF8ILa6d/+9receuqpZDIZOjo66O7u5uMf/ziw/Xu/O8d5T7dpKtRO7zsUeMuLzpw5c3j88cf50Y9+xF/91V9xzz33cMYZZ3DBBRfsctmhoSFOPPFEnnjiCT796U/z4x//mLvuuqt+/U0Yhntcv9EyPvzhDzfs1bjrrrs46KCDdlnOjgEQRA3whRdeyIEHHsg3v/lN7rzzTu666y7e+MY3Nqz7ZHcA37GRSiQSnHnmmTz88MMNGwZjDLfeeisPPvggl156KRs3buQ973kPxxxzTD1Anm5PPvkkrutO+qMK4EMf+hDPPvssV111Fclkkk984hO8/OUvr/cejzr88MN52ctexre//W1Wr16923WYNWvWtP0ACYKAN73pTfz0pz/lox/9KLfffjt33XVX/WZxY4/frrbrhR6P+fPnA9GNfXa0efNmurq6JvSGj27/7Nmz92j7RWTvUlu5/7eV1lq++93vUigUOOywwzj44IPr05o1a7jjjjsmlLu727K7eScL5ia7yd5Yu7vsC/2uzpo1C5i+EwWrVq3ilFNOoa+vj6uvvpqf/vSn3HXXXfzv//2/ge3f2d05znvy/2+qBgcHSafTDf8vyN6lm6vJi1I8Huess87irLPOIgxD/v7v/56vfe1rfOITn+Cggw6a9I/9vffeS39/P7fddtu4O1VPFoxt2rSJQqEw7kz+s88+CzDpELFly5YBEIvFOPXUU1/I5k3q1ltvZdmyZdx2223jtnG0d+CFMsbw3//935x99tm87W1v43/+538a3on0Na95Da95zWv4t3/7N77zne/wrne9i+9973u8733v26P172jdunXcd999HH/88ZP2eI868MAD+cd//Ef+8R//keeee47ly5fzxS9+kZtuuqmeZ/bs2dx666287nWv45RTTuE3v/nNbj0T99BDD53w3eju7qatrY0nn3xyStv0pz/9iWeffZYbb7yR888/v54+2TC03dmuqR6PBQsW0N3dzSOPPDJhXqMbDkH0f2P27NkThnKKyL5PbeX+3Vbed999bNiwgU9/+tP1m96NGhwc5P3vfz+33377uKHl062zs5OhoaEJ6WvXrq0fw50t22jY+tq1ayek7eq72sjixYtJpVITvpcHHnggEJ3An8p368c//jGVSoUf/ehH40YDTPaorl0d5xeyTS/E6tWrJ3w/ZGaox1tedEav6RnlOE792rjRYT6jjf+OjcXo2d2xZ3Or1Sr/7//9v4br8n2fr33ta+Pyfu1rX6O7u5tjjjmm4TJz5szhpJNO4mtf+1rDnsVt27btbPN2qlH9H374YR588MEXXOaoeDzObbfdxqte9SrOOussfve739XnDQ4OTjhbPhqkjR1aNR2PExsYGGDFihUEQcD/+T//Z9J8xWKxPjx61IEHHkhra2vDYX0LFy7kl7/8JaVSiTe96U0TvkeNHH/88Tz55JPjynMch3POOYcf//jHDQPYRr0K0PjYWWsnPFpkd7Zrd49HI+eddx4/+clPWL9+fT3t7rvv5tlnn60/WmisRx99lOOPP36nZYrIvkdt5f7fVo4OM//IRz7C3/zN34ybLr74Yg4++OCGw82n04EHHshDDz007lGZO7YhO1v2mWeeGXcsn3jiiQl34N6d72ojsViMY489dkJb/MpXvpIDDjiAL33pSxO+25O10dD4e5PNZrn++uvH5dud4/xCt+mFeOyxxxre4V72PvV4yz7pj3/8Y/05nStXriSbzdYf7XT00Udz1llnTbrs+973PgYGBnjjG9/IwoULWbt2LV/5yldYvnx5/Yzf8uXLcV2Xz33uc2SzWRKJBG984xs54YQT6Ozs5IILLuAf/uEfMMbw7W9/e9I/xD09PXzuc59jzZo1HHLIIXz/+9/n8ccf5+tf//pOn616zTXX8LrXvY4jjzySiy++mGXLltHb28uDDz7Ihg0beOKJJ17QfnvrW9/KbbfdxrnnnsuZZ57J6tWrue666zjssMOmZch3KpXiJz/5CW984xs544wzuO+++zjiiCO48cYb+X//7/9x7rnncuCBBzI8PMw3vvEN2traeMtb3lJffqqPSHn22We56aabsNaSy+V44oknuOWWW8jn81x99dWcfvrpO132lFNO4e1vfzuHHXYYnufxwx/+kN7eXt75znc2XOaggw7iF7/4BSeddBKnnXYav/rVryZ9VBnA2WefzWc+8xnuu+8+3vzmN9fTP/vZz/KLX/yCE088kfe///28/OUvZ/Pmzdxyyy385je/mXAzF4h6zw888EA+/OEPs3HjRtra2vjBD34wYYjc7mzX7h6PRj7+8Y9zyy23cPLJJ3PZZZeRz+f5whe+wJFHHslFF100Lu/WrVv54x//WH+EiojsXWorX7ptZaVS4Qc/+AFvetOb6je/3NFf/dVf8eUvf5mtW7cyZ86cPd6uRt73vvdx6623cvrpp/P2t7+dVatWcdNNN9V7lXfmPe95D1dffTWnnXYa733ve9m6dSvXXXcdhx9+OLlcbtw6dvVdnczZZ5/N//k//2fco0cdx+Haa6/lrLPOYvny5Vx00UXMnz+fZ555hqeeeqrhTekA3vzmN9d7qT/wgQ+Qz+f5xje+wZw5c8adHNqd47wn23T//fdz//33A9EJqEKhUP9//4Y3vGHcKJRHH32UgYEBzj777J2WKXvJ3rh1ury0jT4iZbLHKpx44okTHpGys8eqNHpsxVi33nqrffOb32znzJlj4/G4Xbx4sf3ABz5gN2/ePC7fN77xDbts2TLruu64x6X89re/ta95zWtsKpWyPT099p/+6Z/sz3/+8wmPVBmt9yOPPGKPP/54m0wm7ZIlS+xXv/rVcetp9AgNa61dtWqVPf/88+28efNsLBazCxYssG9961vtrbfeutPtGy2v0eOkwjC0n/3sZ+2SJUtsIpGwr3jFK+xPfvKTCY/m2FkZgL3yyivrn8c+ImVUX1+fPeyww+y8efPsc889Zx977DG7YsUKu3jxYptIJOycOXPsW9/6VvvII4+MW26qjxMbnRzHsR0dHfYVr3iFveyyy+xTTz016X4Z3c99fX32kksusYceeqjNZDK2vb3dHnfccfbmm28et9zYx4mNevjhh21ra6t9wxve0PDRIWMdddRR9r3vfe+E9LVr19rzzz/fdnd320QiYZctW2YvueSS+qNZGj1O7Omnn7annnqqbWlpsbNnz7YXX3yxfeKJJ6a8Xbt7PCbz5JNP2je/+c02nU7bjo4O+653vctu2bJlQr5rr73WptNpm8vldqtcEZmc2kq1lWPL2lVb+YMf/MAC9pvf/Oakee69914L2C9/+cvW2sbfodH1jd3u0fbplltuGZdvsmP0xS9+0S5YsMAmEgn72te+1j7yyCO79Tgxa6296aab7LJly2w8HrfLly+3P//5zyfUZ3e/q4309vZaz/Pst7/97QnzfvOb39g3velNtrW11WYyGXvUUUeNe/RYo8eJ/ehHP7JHHXWUTSaTdunSpfZzn/uc/da3vjXueO3Ocd6TbRqtV6Np7HfSWms/+tGP2sWLF497TJrMHGPtTsZUiIjITn3729/mkksuYd26dQ17sl/MXvGKV3DSSSfxn//5nzNdFRERkYbe+9738uyzz/LrX/96pquyV1UqFZYuXcrHPvYxLrvsspmujqBrvEVE9si73vUuFi9ezDXXXDPTVdmr7rzzTp577jmuuOKKma6KiIjIpK688kp+//vfT7h2/MXu+uuvJxaL8Xd/93czXRUZoR5vERERERERkSZSj7eIiIiIiIhIEynwFhEREREREWkiBd4iIiIiIiIiTaTAW0RERERERKSJvJmuwHQIw5BNmzbR2tqKMWamqyMiIjLjrLUMDw/T09OD4+z5eXa1tSIiIuNNpa19UQTemzZtYtGiRTNdDRERkX3O+vXrWbhw4R6Xo7ZWRESksd1pa18UgXdraysQbXBbW9sM10ZERGTm5XI5Fi1aVG8j95TaWhERkfGm0ta+KALv0SFvbW1t+jEgIiIyxnQNC1dbKyIi0tjutLW6uZqIiIiIiIhIEynwFhEREREREWkiBd4iIiIiIiIiTaTAW0RERERERKSJFHiLiIiIiIiINJECbxEREREREZEmUuAtIiIiIiIi0kQKvCcRhpYwtDNdDREREREREdnPeTNdgX1RGFrW9BcASMZcejpSM1wjERERERER2V+px3sXyrVAPd8iIiIiIiLyginwbsBxDEtmZWa6GiIiIiIiIvIiMOXA+/777+ess86ip6cHYwy33377uPnGmIbTF77whUnL/NSnPjUh/6GHHjrljZlOZkbXLiIiIiIiIi8WUw68C4UCRx99NNdcc03D+Zs3bx43fetb38IYw3nnnbfTcg8//PBxy/3mN7+ZatVERERERERE9jlTvrnaGWecwRlnnDHp/Hnz5o37fMcdd3DyySezbNmynVfE8yYsKyIiIiIiIrK/a+pdzXt7e/npT3/KjTfeuMu8zz33HD09PSSTSY4//niuuuoqFi9e3DBvpVKhUqnUP+dyuWmrs4iIiKitFRERmU5NvbnajTfeSGtrK3/913+903zHHXccN9xwA3feeSfXXnstq1ev5vWvfz3Dw8MN81911VW0t7fXp0WLFjWj+iIiIi9ZamtFRESmj7HWvuBnZRlj+OEPf8g555zTcP6hhx7Km970Jr7yla9MqdyhoSGWLFnC1VdfzXvf+94J8xudhV+0aBHZbJa2trYprWsyY5/lvXRWBsfR7dZERGT/kcvlaG9vf8Ft495oa0VERPZnU2lrmzbU/Ne//jV/+ctf+P73vz/lZTs6OjjkkENYuXJlw/mJRIJEIrGnVRQREZFJqK0VERGZPk0bav7Nb36TY445hqOPPnrKy+bzeVatWsX8+fObUDMRERERERGRvWfKgXc+n+fxxx/n8ccfB2D16tU8/vjjrFu3rp4nl8txyy238L73va9hGaeccgpf/epX658//OEPc99997FmzRoeeOABzj33XFzXZcWKFVOtnoiIiIiIiMg+ZcpDzR955BFOPvnk+ufLL78cgAsuuIAbbrgBgO9973tYaycNnFetWkVfX1/984YNG1ixYgX9/f10d3fzute9joceeoju7u6pVq8pXvBF8CIiIiIiIvKSt0c3V9tX7OkNZBoZe3M1gGTMpacjNS1li4iINNt0t43NaGtFRET2Z1NpG5v6OLH9meMYkjG3/rlcCwjD/f4chYiIiIiIiOxlCrx3oqcjxZJZmZmuhoiIiIiIiOzHFHjvgp7eLSIiIiIiIntCgbeIiIiIiIhIEynwFhEREREREWkiBd4iIiIiIiIiTaTAW0RERERERKSJFHiLiIiIiIiINJECbxEREREREZEmUuAtIiIiIiIi0kQKvEVERERERESayJvpCuyrfD+svw+txTFmBmsjIiIiIiIi+ysF3g34fshvV/UBEHMNtcCSiLnEPYeFnekZrp2IiIiIiIjsTzTUfBdqgcVzDZVaQLkWEIZ2pqskIiIiIiIi+xH1eDfgeQ4nHDibtQMFIBpqvnmoPMO1EhERERER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I5OM0ZqMk3A9knGPTMojmfDIpGKkky4x18EzI6/O6GS2v/eiyXUMjokmXdktIiIiIiLy0jHlwLtQKHD00UdzzTXXTJhXLBZ57LHH+MQnPsFjjz3Gbbfdxl/+8hf+6q/+apflHn744WzevLk+/eY3v5lq1URERERERET2OVMean7GGWdwxhlnNJzX3t7OXXfdNS7tq1/9Kq9+9atZt24dixcvnrwinse8efOmWh0RERERERGRfVrTb66WzWYxxtDR0bHTfM899xw9PT0sW7aMd73rXaxbt67ZVRMRERERERFpuqbeXK1cLvPRj36UFStW0NbWNmm+4447jhtuuIGXvexlbN68mX/5l3/h9a9/PU8++SStra0T8lcqFSqVSv1zLpdrSv1FREReqtTWioiITJ+m9XjXajXe/va3Y63l2muv3WneM844g7e97W0cddRRnHbaafzsZz9jaGiIm2++uWH+q666ivb29vq0aNGiZmyCiIjIS5baWhERkenTlMB7NOheu3Ytd9111057uxvp6OjgkEMOYeXKlQ3nX3HFFWSz2fq0fv366ai2iIiIjFBbKyIiMn2mfaj5aND93HPPcc899zBr1qwpl5HP51m1ahXvfve7G85PJBIkEok9raqIiIhMQm2tiIjI9Jlyj3c+n+fxxx/n8ccfB2D16tU8/vjjrFu3jlqtxt/8zd/wyCOP8N///d8EQcCWLVvYsmUL1Wq1XsYpp5zCV7/61frnD3/4w9x3332sWbOGBx54gHPPPRfXdVmxYsWeb6GIiIiIiIjIDJpyj/cjjzzCySefXP98+eWXA3DBBRfwqU99ih/96EcALF++fNxy99xzDyeddBIAq1atoq+vrz5vw4YNrFixgv7+frq7u3nd617HQw89RHd391SrN202DOTozVXA+vTnSxRrVbwq5ApVCiUfB8gXahRrNUq+T6nqU60ZXMdQSsaoBD4AlWqA74eEoSUILMaBILSE1gIj70NbX6/jmF3WbXfyiIiIiIiIyL7BWGvtrrPt23K5HO3t7WSz2SlfT97Imm1DnPWVB4niYQvW4rgOnuPgOuAYg+c4xBxg5H064dKWjOE6htaUR2ghHfNIxBx62lNYayn5AQfNaaUrE2MgX2VWy8QhfAnPYU5bcqf1S8ZcejpSe7ydIiLy4jXdbeN0lyciIrK/m0rb2PTneO+PHGNw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9zU/xGIxGDCGUi2Y0NNdrgWEoXq/RURkLyrnIfShVoYw3HV+ERGR/Yx6vBtIp2P846mHsG4o6q2e35rk1sfXUqkFrO0rsTlX4lVL2jmsp4PVA3ke/MtWOtti2NDy+5WDeI7B81wSruGwRZ1sHcpTqIRUQ/CDgIofkI7HOGBuK7Nbkrz20Fksbmnh6/euZGO2THd7jHItZPGsDIctbGdxW4YlszKsyxbZnC3T05JiS75CX77M8sUdHNTVCsDqgQLWghnZjsWdaTZkS1HQbqKh5Us6M6wf3a6OJEu7MvXtHu31FhERaTo3DnOPgKG10DpvpmsjIiLSVNPe47106VKMMROmSy65pGH+G264YULeZDI53dWaslTSIxFzScRckjGX1kSSTDJOPO6S9OK0ZVIs6GhlUVcrna1tzO9op7utjXQqTSadJJFMkEmn6WpJ055pIZ1OkUjEySSSpJNJkokELckkbakkPa2tzGtLk04lSCVjpBMJUrE4qXiMlniCtkyC9nSC1kScTCxGKuER9wwxxyXuusTj0ZSIucRjDrGYQyLukoi7xDwHzzV4joPnOLiOqW+jYwyOY+rXfouIiOxVjgsjo7BERERezKa9x/v3v/89QRDUPz/55JO86U1v4m1ve9uky7S1tfGXv/yl/tmoARYREREREZEXiWkPvLu7u8d9/vd//3cOPPBATjzxxEmXMcYwb56GmYmIiIiIiMiLT1NvrlatVrnpppt4z3ves9Ne7Hw+z5IlS1i0aBFnn302Tz31VDOrJSIiIiIiIrLXNPXmarfffjtDQ0NceOGFk+Z52ctexre+9S2OOuoostks//Ef/8EJJ5zAU089xcKFjR8pUqlUqFQq9c+5XG66qy4iIvKSprZWRERk+jS1x/ub3/wmZ5xxBj09PZPmOf744zn//PNZvnw5J554Irfddhvd3d187Wtfm3SZq666ivb29vq0aNGiZlRfRETkJUttrYiIyPRpWuC9du1afvnLX/K+971vSsvFYjFe8YpXsHLlyknzXHHFFWSz2fq0fv36Pa2uiIiIjKG2VkREZPo0baj59ddfz5w5czjzzDOntFwQBPzpT3/iLW95y6R5EokEiURiT6soIiIik1BbKyIiMn2a0uMdhiHXX389F1xwAZ43PrY///zzueKKK+qfP/3pT/OLX/yC559/nscee4y//du/Ze3a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kMrKShERWbJkiURFRZn1X7x4sQCQCxcuWI2DiIjIEbjOXrAaBxFZx2e8idzU8OHDTT/rdDoAQHNzs6ktJCQEAwcONN0/fvw42tra8MADD8Db29t0q6+vx+nTpwEAqampSEpKQnx8PLKzs03t3fr164ewsDCzx+1+zEuXLuHPP/9EXFyc2TZxcXGorq62egzV1dWIjY01a9Pr9XecAyIiIqVwnSWim/HD1Yjc1M0vTVOpVABuvPerW//+/c36t7W1QafTwWAwWOyr++tLMjMzMWPGDOzatQu7d+9GRkYGCgsL8fzzz1s8ZvfjiogjDoeIiOiewnWWiG7GZ7yJ6I6MGDECjY2N0Gg0CA8PN7v5+/ub+kVERCAlJQUlJSVISEjAli1b7mj/vr6+CA4ORnl5uVl7eXk5oqKirG4TGRmJI0eOmLUdPnzYxiMjIiLqeVxniVwbC28iuiPx8fHQ6/WYNm0aSkpK0NDQgIMHDyI9PR3Hjh3DlStXMH/+fBgMBpw5cwbl5eU4evQoIiMj7/gxFi1ahDVr1mD79u2oqalBWloajEYjFixYYLX/3LlzcerUKSxatAg1NTXYtm0b8vLyHHTEREREzsN1lsi18aXmRHRHVCoViouLkZ6ejtmzZ+Ovv/5CUFAQxowZg8DAQKjVavz999946aWX0NTUBH9/fyQkJGD58uV3/BhvvPEGLl68iDfffBPNzc2IiorCzp078dBDD1ntP3ToUOzYsQMpKSnYsGEDRo0ahaysLItPjiUiIrrXcZ0lcm0q4Rs/iIiIiIiIiBTDl5oTERERERERKYiFNxEREREREZGCWHgTERERERERKYiFNxEREREREZGCWHgTERERERERKYiFNxEREREREZGCWHgTERERERERKYiFNxEREREREZGCWHgTERERERERKYiFNxEREREREZGCWHgTERERERERKYiFNxEREREREZGC/gctsFoRXI04TAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from masspcf.plotting import plot as plotpcf\n", "\n", "fig, axes = plt.subplots(1, 2, figsize=(10, 3.5), sharey=True)\n", "\n", "half = n_samples // 2\n", "plotpcf(sranks[:half, 1], ax=axes[0], alpha=0.15, color=\"C0\")\n", "axes[0].set_title(\"H1 stable ranks: Disk (class 0)\")\n", "axes[0].set_xlabel(\"Threshold\")\n", "\n", "plotpcf(sranks[half:, 1], ax=axes[1], alpha=0.15, color=\"C1\")\n", "axes[1].set_title(\"H1 stable ranks: Annulus (class 1)\")\n", "axes[1].set_xlabel(\"Threshold\")\n", "\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "22bsm79zja", "metadata": {}, "source": [ "## Step 3: Train a PyTorch classifier\n", "\n", "Now we convert the features to PyTorch tensors and train a simple feedforward network." ] }, { "cell_type": "code", "execution_count": 6, "id": "a40i5sktbew", "metadata": {}, "outputs": [], "source": [ "import torch\n", "import torch.nn as nn\n", "from torch.utils.data import DataLoader, TensorDataset\n", "\n", "# Convert to PyTorch tensors\n", "X = torch.from_numpy(features)\n", "y = torch.from_numpy(labels)\n", "\n", "# Train/test split\n", "n_train = 160\n", "X_train, X_test = X[:n_train], X[n_train:]\n", "y_train, y_test = y[:n_train], y[n_train:]\n", "\n", "train_loader = DataLoader(\n", " TensorDataset(X_train, y_train),\n", " batch_size=32, shuffle=True\n", ")" ] }, { "cell_type": "code", "execution_count": 7, "id": "x4s6tk6y8jr", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 10 loss=0.1324 train_acc=100%\n", "Epoch 20 loss=0.0457 train_acc=100%\n", "Epoch 30 loss=0.0155 train_acc=100%\n", "Epoch 40 loss=0.0119 train_acc=100%\n", "Epoch 50 loss=0.0102 train_acc=100%\n" ] } ], "source": [ "# A small feedforward network\n", "model = nn.Sequential(\n", " nn.Linear(50, 32),\n", " nn.ReLU(),\n", " nn.Linear(32, 2),\n", ")\n", "\n", "optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)\n", "loss_fn = nn.CrossEntropyLoss()\n", "\n", "# Training loop\n", "for epoch in range(50):\n", " for X_batch, y_batch in train_loader:\n", " loss = loss_fn(model(X_batch), y_batch)\n", " optimizer.zero_grad()\n", " loss.backward()\n", " optimizer.step()\n", " if (epoch + 1) % 10 == 0:\n", " with torch.no_grad():\n", " train_acc = (model(X_train).argmax(1) == y_train).float().mean()\n", " print(f\"Epoch {epoch+1:3d} loss={loss.item():.4f} train_acc={train_acc:.0%}\")" ] }, { "cell_type": "code", "execution_count": 8, "id": "7rw9piacls4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Test accuracy: 100%\n" ] } ], "source": [ "# Evaluate on test set\n", "with torch.no_grad():\n", " preds = model(X_test).argmax(dim=1)\n", " acc = (preds == y_test).float().mean().item()\n", " print(f\"Test accuracy: {acc:.0%}\")" ] }, { "cell_type": "markdown", "id": "p83reoj5hrb", "metadata": {}, "source": [ "Because the annulus has a prominent H1 feature (a persistent loop) that the filled disk lacks, the stable rank vectors for the two classes are quite distinct, and even a small network can learn to separate them." ] }, { "cell_type": "markdown", "id": "igp6wtegl7h", "metadata": {}, "source": [ "## Variations\n", "\n", "### Different summaries\n", "\n", "Replace `barcode_to_stable_rank` with `barcode_to_betti_curve` or `barcode_to_accumulated_persistence` for alternative representations. You can also concatenate features from multiple summaries or homology dimensions.\n", "\n", "### Kernel methods\n", "\n", "Instead of vectorizing, use `mpcf.l2_kernel` to compute a kernel matrix directly from the PCFs, then convert to PyTorch. This is useful with kernel-based models or as a precomputed similarity matrix for contrastive learning." ] }, { "cell_type": "code", "execution_count": 9, "id": "uzuubjwjmce", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Kernel matrix shape: torch.Size([200, 200])\n" ] } ], "source": [ "K = mpcf.l2_kernel(sranks[:, 1]).to_dense()\n", "K_torch = torch.from_numpy(K)\n", "print(f\"Kernel matrix shape: {K_torch.shape}\")" ] }, { "cell_type": "markdown", "id": "6oj6txlk4e", "metadata": {}, "source": [ "### Distance matrices\n", "\n", "Similarly, `mpcf.pdist` gives pairwise distances that can be used for metric learning or as input to distance-based classifiers." ] }, { "cell_type": "code", "execution_count": 10, "id": "70mpnjdl7zr", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Distance matrix shape: torch.Size([200, 200])\n" ] } ], "source": [ "D = mpcf.pdist(sranks[:, 1]).to_dense()\n", "D_torch = torch.from_numpy(D)\n", "print(f\"Distance matrix shape: {D_torch.shape}\")" ] } ], "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.20" } }, "nbformat": 4, "nbformat_minor": 5 }