Skip to main content
  • Home
  • Development
  • Documentation
  • Donate
  • Operational login
  • Browse the archive

swh logo
SoftwareHeritage
Software
Heritage
Archive
Features
  • Search

  • Downloads

  • Save code now

  • Add forge now

  • Help

Raw File Download
Permalink

To reference or cite the objects present in the Software Heritage archive, permalinks based on SoftWare Hash IDentifiers (SWHIDs) must be used.
Select below a type of object currently browsed in order to display its associated SWHID and permalink.

  • content
content badge Iframe embedding
swh:1:cnt:35cffa6d322d1fd746513cba8d23e2f87e36fbcb
Citations

This interface enables to generate software citations, provided that the root directory of browsed objects contains a citation.cff or codemeta.json file.
Select below a type of object currently browsed in order to generate citations for them.

  • content
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Sobol Indices"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Sobol's method* is one of the most popular for global sensitivity analysis. It builds on the [ANOVA decomposition](anova.ipynb)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "20D TT tensor:\n",
       "\n",
       " 32  32  32  32  32  32  32  32  32  32  32  32  32  32  32  32  32  32  32  32\n",
       "  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |\n",
       " (0) (1) (2) (3) (4) (5) (6) (7) (8) (9) (10)(11)(12)(13)(14)(15)(16)(17)(18)(19)\n",
       " / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\\n",
       "1   10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  1"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import tntorch as tn\n",
    "import torch\n",
    "import time\n",
    "\n",
    "N = 20\n",
    "t = tn.rand([32]*N, ranks_tt=10)\n",
    "t"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "With *tntorch* we can handle *all* Sobol indices (i.e. for all subsets $\\alpha \\subseteq \\{0, \\dots, N-1\\}$) at once. We can access and aggregate them using the function `sobol()` and whatever [mask](logic.ipynb) is appropriate."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Single Variables\n",
    "\n",
    "### Variance Components\n",
    "\n",
    "The relative influence (proportion of the overall model variance) attributable to one variable $n$ only, without interactions with others, is known as its *variance component* and denoted as $S_n$. Let's compute it for the first variable $x$:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor(0.1882)\n",
      "This compressed tensor has 58240 parameters; computing this index took only 0.0380359s\n"
     ]
    }
   ],
   "source": [
    "x, y, z = tn.symbols(N)[:3]\n",
    "start = time.time()\n",
    "print(tn.sobol(t, mask=tn.only(x)))\n",
    "print('This compressed tensor has {} parameters; computing this index took only {:g}s'.format(t.numcoef(), time.time()-start))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Input parameters $x, y, \\dots$ are assumed independently distributed. By default, uniform marginal distributions are used, but you can specify others with the `marginals` argument (list of vectors). For instance, if the first variable can take one value only, then its sensitivity indices will be 0 (no matter how strong its effect on the multidimensional model is!):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(0.)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "marginals = [None]*N  # By default, None means uniform\n",
    "marginals[0] = torch.zeros(t.shape[0])\n",
    "marginals[0][0] = 1  # This marginal's PMF is all zeros but the first value\n",
    "tn.sobol(t, tn.only(x), marginals=marginals)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Total Sobol Indices\n",
    "\n",
    "The effect that also includes $x$'s interaction with other variables is called *total Sobol index* (it's always larger or equal than the corresponding variance component):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(0.2150)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tn.sobol(t, x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tuples of variables\n",
    "\n",
    "What are the indices for the first and third variables $x$ and $z$?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(0.0005)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tn.sobol(t, tn.only(x & z))  # Variance component"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(0.2401)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tn.sobol(t, x | z)  # Total index"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "What's the relative importance of $x$ with respect to the group $\\{y, z\\}$?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(0.1638)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tn.sobol(t, x & (y|z)) / tn.sobol(t, y|z)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Closed Sobol Indices\n",
    "\n",
    "For tuples of variables two additional kinds of indices exist. The *closed index* aggregates all components for tuples *included* in $\\alpha$, and for tuple $\\{x, z\\}$ it can be computed as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(0.2100)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tn.sobol(t, tn.only(x | z))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Superset Indices\n",
    "\n",
    "The *superset index* aggregates all components for tuples *that include* $\\alpha$:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(0.0009)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tn.sobol(t, x & z)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Counting $k$-plets of Variables\n",
    "\n",
    "We can also easily count the influence of all $k$-plets of variables combined:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(0.9222)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tn.sobol(t, tn.weight_mask(N, weight=[1]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Often, there are different ways to express the same mask. For example, these three are equivalent:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor(0.2401)\n",
      "tensor(0.2401)\n",
      "tensor(0.2401)\n"
     ]
    }
   ],
   "source": [
    "print(tn.sobol(t, x | z))\n",
    "print(tn.sobol(t, x & ~z) + tn.sobol(t, ~x & z) + tn.sobol(t, x & z))\n",
    "print(tn.sobol(t, x) + tn.sobol(t, z) - tn.sobol(t, x & z))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### The Mean Dimension\n",
    "\n",
    "Variance components are the basis for an important advanced sensitivity metric, the [*mean dimension*](https://www.jstor.org/stable/27590729). It's defined as $D_S := \\sum_{\\alpha} |\\alpha| \\cdot S_{\\alpha}$ and computed as:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(1.0831)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tn.mean_dimension(t)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can also compute it in one line by weighting the Sobol indices by their tuple weight (according to the definition of mean dimension):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(1.0831)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tn.sobol(t, tn.weight(N))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The mean dimension is always greater or equal than 1. It gives a notion of *complexity* of a multidimensional function (the lower the mean dimension, the simpler it is). For example, rounding a tensor usually results in a lower mean dimension:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "\n",
    "errors = 10**np.linspace(-1, -3, 25)\n",
    "mean_dimensions = []\n",
    "for eps in errors:\n",
    "    mean_dimensions.append(tn.mean_dimension(tn.round(t, eps=eps)))\n",
    "    \n",
    "plt.figure()\n",
    "plt.plot(np.log10(errors), mean_dimensions)\n",
    "plt.xlabel('log10(rounding error)')\n",
    "plt.ylabel('Mean dimension')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can also compute the *restricted* mean dimension, i.e. impose certain conditions on the set of tuples that intervene. For example, we can see which of two variables tends to show up more with higher-order terms:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor(1.1355)\n",
      "tensor(1.3664)\n"
     ]
    }
   ],
   "source": [
    "print(tn.mean_dimension(t, mask=x))\n",
    "print(tn.mean_dimension(t, mask=y))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### The Dimension Distribution\n",
    "\n",
    "Last, the [*dimension distribution*](http://www3.stat.sinica.edu.tw/statistica/oldpdf/A13n11.pdf) gathers the relevance of $k$-tuples of variables for each $k = 1, \\dots, N$:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([9.2223e-01, 7.2741e-02, 4.7444e-03, 2.6979e-04, 1.3797e-05, 6.4638e-07,\n",
      "        2.8097e-08, 1.1428e-09, 4.3612e-11, 1.5722e-12, 5.3506e-14, 1.7216e-15,\n",
      "        5.2287e-17, 1.4966e-18, 4.0144e-20, 1.0023e-21, 2.3034e-23, 4.7723e-25,\n",
      "        8.6303e-27, 1.3940e-28])\n",
      "Time: 0.11500120162963867\n"
     ]
    }
   ],
   "source": [
    "start = time.time()\n",
    "dimdist = tn.dimension_distribution(t)\n",
    "print(dimdist)\n",
    "print('Time:', time.time() - start)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It can be viewed as a probability mass function, namely the probability of choosing a $k$-variable tuple, if tuples are chosen according to their variance components. The expected value of this random variable is the mean dimension. Naturally, the dimension distribution must sum to $1$:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(1.0000)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sum(dimdist)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Again, we can extract the dimension distribution with respect to any mask:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([0.0000, 0.6815, 0.2870, 0.0293, 0.0021, 0.0001, 0.0000, 0.0000, 0.0000,\n",
       "        0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "        0.0000, 0.0000])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tn.dimension_distribution(t, mask=y&z)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We just imposed that two variables ($y$ and $z$) appear. Note how, accordingly, the relevance of $1$-tuples has become zero since they have all been discarded."
   ]
  }
 ],
 "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.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}

Software Heritage — Copyright (C) 2015–2025, The Software Heritage developers. License: GNU AGPLv3+.
The source code of Software Heritage itself is available on our development forge.
The source code files archived by Software Heritage are available under their own copyright and licenses.
Terms of use: Archive access, API— Contact— JavaScript license information— Web API

back to top