Skip to content

Instantly share code, notes, and snippets.

@sofianehaddad
Created September 9, 2020 14:08
Show Gist options
  • Save sofianehaddad/f596a02474aba6ef501967afd41aa508 to your computer and use it in GitHub Desktop.
Save sofianehaddad/f596a02474aba6ef501967afd41aa508 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [
"# Polynômes de chaos avec bootstrap : application au cas de la poutre encastrée\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [
"## Résumé\n",
"\n",
"Dans ce notebook, nous présentons la décomposition en chaos polynomial du cas de la poutre encastrée. Nous montrons comment obtenir les indices de Sobol' à partir d'un chaos polynomial."
]
},
{
"cell_type": "markdown",
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [
"# Model definition"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [],
"source": [
"import openturns as ot\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [],
"source": [
"dist_E = ot.Beta(0.9, 3.1, 2.8e7, 4.8e7)\n",
"dist_E.setDescription([\"E\"])\n",
"F_para = ot.LogNormalMuSigma(3.0e4, 9.0e3, 15.0e3) # in N\n",
"dist_F = ot.ParametrizedDistribution(F_para)\n",
"dist_F.setDescription([\"F\"])\n",
"dist_L = ot.Uniform(250.0, 260.0) # in cm\n",
"dist_L.setDescription([\"L\"])\n",
"dist_I = ot.Beta(2.5, 4, 310.0, 450.0) # in cm^4\n",
"dist_I.setDescription([\"I\"])\n",
"\n",
"myDistribution = ot.ComposedDistribution([dist_E, dist_F, dist_L, dist_I])"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [],
"source": [
"dim_input = 4 # dimension of the input\n",
"dim_output = 1 # dimension of the output\n",
"\n",
"def function_beam(X):\n",
" E, F, L, I = X\n",
" Y = F * (L ** 3) / (3 * E * I)\n",
" return [Y]\n",
"\n",
"g = ot.PythonFunction(dim_input, dim_output, function_beam)\n",
"g.setInputDescription(myDistribution.getDescription())"
]
},
{
"cell_type": "markdown",
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [
"## Create a polynomial chaos decomposition"
]
},
{
"cell_type": "markdown",
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [
"On crée la base polynomiale multivariée par tensorisation de polynômes univariés avec la règle d'énumération linéaire par défaut."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [],
"source": [
"multivariateBasis = ot.OrthogonalProductPolynomialFactory(\n",
" [dist_E, dist_F, dist_L, dist_I]\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [
"Generate an training sample of size N with MC simulation (or retrieve the design from experimental data)."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [],
"source": [
"N = 20 # size of the experimental design\n",
"\n",
"inputTrain = myDistribution.getSample(N)\n",
"outputTrain = g(inputTrain)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [],
"source": [
"def ComputeSparseLeastSquaresChaos(\n",
" inputTrain, outputTrain, multivariateBasis, totalDegree, myDistribution\n",
"):\n",
" \"\"\"\n",
" Crée un polynôme du chaos creux par moindres carrés. \n",
" \n",
" Paramètres :\n",
" inputTrain : un Sample, le plan d'expériences des entrées\n",
" outputTrain : un Sample, le plan d'expériences des sorties\n",
" multivariateBasis : une Basis, la base multivariée du chaos\n",
" totalDegree : un entier, le degré total maximal du chaos\n",
" myDistribution : une Distribution, la loi du vecteur aléatoire en entrée\n",
" \n",
" Description : \n",
" * Utilise la règle d'énumération contenue dans multivariateBasis. \n",
" * Utilise LeastSquaresStrategy pour calculer les \n",
" coefficients par moindres carrés. \n",
" * Utilise LeastSquaresMetaModelSelectionFactory pour \n",
" obtenir la méthode de sélection de modèle LARS. \n",
" * Utilise FixedStrategy pour conserver tous les coefficients \n",
" que la méthode LARS a préalablement sélectionné. \n",
" \"\"\"\n",
" selectionAlgorithm = ot.LeastSquaresMetaModelSelectionFactory()\n",
" projectionStrategy = ot.LeastSquaresStrategy(\n",
" inputTrain, outputTrain, selectionAlgorithm\n",
" )\n",
" enumfunc = multivariateBasis.getEnumerateFunction()\n",
" P = enumfunc.getStrataCumulatedCardinal(totalDegree)\n",
" adaptiveStrategy = ot.FixedStrategy(multivariateBasis, P)\n",
" chaosalgo = ot.FunctionalChaosAlgorithm(\n",
" inputTrain, outputTrain, myDistribution, adaptiveStrategy, projectionStrategy\n",
" )\n",
" chaosalgo.run()\n",
" result = chaosalgo.getResult()\n",
" return result"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [],
"source": [
"totalDegree = 2"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [],
"source": [
"result = ComputeSparseLeastSquaresChaos(\n",
" inputTrain, outputTrain, multivariateBasis, totalDegree, myDistribution\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"hideCode": false,
"hidePrompt": false,
"scrolled": false
},
"outputs": [],
"source": [
"metamodel = result.getMetaModel() # get the metamodel"
]
},
{
"cell_type": "markdown",
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [
"## Validate the metamodel"
]
},
{
"cell_type": "markdown",
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [
"Generate a validation sample (which is independent of the training sample)."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [],
"source": [
"n_valid = 1000\n",
"inputTest = myDistribution.getSample(n_valid)\n",
"outputTest = g(inputTest)"
]
},
{
"cell_type": "markdown",
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [
"La classe `MetaModelValidation` permet de valider le métamodèle sur une base de validation."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [],
"source": [
"val = ot.MetaModelValidation(inputTest, outputTest, metamodel)"
]
},
{
"cell_type": "markdown",
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [
"Plot the observed versus the predicted outputs."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"hideCode": false,
"hidePrompt": false,
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAYAAAByNR6YAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzde1yUZf7/8deAiKCieYIhKc2w8hxZKm4eKkhL06XjWmmHVUo7mPWjNU2HVinNXC2/GZqVZWZbWVZrKpvmIbRMZDUrVzcz0yHTVPAECPfvj1tmnAAPMHAzM+/n48GDue77ntsPV1jvruua67YZhmEgIiIiIl4TZHUBIiIiIv5GAUtERETEyxSwRERERLxMAUtERETEyxSwRERERLxMAUtERETEyxSwRERERLxMAUskwKxbt45bb70Vu91O7dq1sdvt3Hbbbaxfv97juuXLl3Pfffdx6aWXUrduXc4//3wGDBjAhg0bvFZLQUEB48aNo2XLltSuXZsLL7yQ0aNHc+zYsVLX/ve//+Xmm2/mvPPOIzw8nC5duvDxxx+f9Z+1ceNGBg4cSHR0NOHh4Vx66aU888wzHD16tNS1hYWFTJ06lfbt2xMWFkbDhg2Jj48nMzPTdc3x48cZMWIETZs2pXnz5jzzzDP8cVvBnTt3Uq9ePT7//PNz6BUR8QuGiASMF1980QgKCjK6du1qvPnmm8bKlSuNt956y+jatasRFBRkpKenu6695ZZbjN69exsvv/yy8cUXXxjvvfee0bVrV6NWrVrG559/7pV6kpKSjDp16hhpaWlGRkaG8cwzzxi1a9c2+vfv73Hdjh07jEaNGhlt27Y1FixYYHz66afGjTfeaNhsNuP9998/45+zZcsWo06dOkbHjh2Nd9991/j888+N8ePHG8HBwcZNN93kce2JEyeMG2+80WjQoIExceJEY8WKFcann35qpKamGsuWLXNdl5qaakRFRRnvvfeeMWfOHCM8PNx46623PO7Vt29fY/DgwZXoIRHxVQpYIgFizZo1RlBQkNGvXz+jsLDQ41xhYaHRr18/Izg42Pj6668NwzCMX3/9tdQ98vLyjMjISOPaa6+tdD1r1641AOOFF17wOJ6WlmYAHmEmOTnZqFOnjvHLL7+4jp04ccK47LLLjJiYGKOoqOi0f9aYMWMMwNi+fbvH8WHDhhmA8fvvv7uO/eMf/zCCgoKMtWvXnvaeV111lZGWluZqDx061Lj99ttd7Xfeecdo3Lix8dtvv532PiLinzRFKBIgnn32WWw2GzNnzqRWrVoe52rVqsXLL7/sug6gWbNmpe5Rr1492rRpw65duypdz5dffgnADTfc4HG8X79+AHzwwQce13bs2JHzzz/fdSw4OJi+ffuya9cuvv7669P+WSEhIQA0aNDA43jDhg0JCgqidu3armPTp0+nR48edO3a9bT3PH78OHXr1nW169Wrx/HjxwE4ePAgI0eOZOrUqTRp0uS09xER/6SAJRIAioqKWLFiBZ07d6Z58+ZlXhMTE8MVV1zBv//9b4qLi8u85tChQ2RlZdG2bVuP48XFxZw4ceKMX0VFRa73FBQUABAaGupxr5L2pk2bPK7943XlXVuWIUOG0LBhQx588EF+/PFH8vLy+PTTT0lPT2fEiBGuoLRr1y5++ukn2rdvz1NPPUVkZCS1atWibdu2zJ071+Oe8fHxvPbaa+zcuZMtW7bw7rvvEh8fD0BKSgpt27Zl8ODBp61LRPyXApZIANi3bx9Hjx6lZcuWp72uZcuW5OXl8fvvv5d5fsSIERw5coQxY8Z4HL/vvvsICQk549e1117rek+bNm0A90hWiTVr1gCwf/9+j2s3bdrE4cOHz3htWVq0aMHatWv59ttvadWqFREREfTv358hQ4Ywffp013W7d+8GYO7cuSxatIgZM2awePFi2rRpwz333MPs2bNd1zocDmrXrk2LFi1o164dnTp14uGHH2b16tXMmzePV1555bQ1iYh/q3XmS0QkUBgnPwVns9lKnXv66ad5++23eemll7jiiis8zjkcDh566KEz3r9+/fqu13379uXiiy/mySefJDIykiuvvJJ169bx1FNPERwcTFCQ+///HnroIRYtWsTgwYOZMmUKdevWZcaMGa5P9Z16bVl++ukn+vfvT2RkJO+//z5Nmzblq6++YsKECRw+fJg5c+YAuEbujh8/zuLFi7nwwgsBSEhIoHPnzjzzzDMMHToUgMjISL766it27txJ7dq1iY6OpqCggOTkZMaOHUtsbCwffPAB48aNw+l0Eh8fz8yZM4mJiTljP4mIH7B6EZiIVL0TJ04Y4eHhRpcuXU573VVXXWWEhYWVOu5wOAzAmDhxYpnvKyoqMgoL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113w9tvm686dYd06CA62tiYRqZhqD1g9e/as7j9SRKRG27jR8xnMX38NV15pXT0iUnmWb9OwevVq7rrrLuLj49m9ezcAb731FmvWrLG4MhERL3M6zUfWOJ2A+Uib7t3d4erWW81jClcivs/SgPXBBx9w/fXXExYWRlZWFvn5+QDk5eWRVrK6U0TEXzidkJoKTicZGeb0X2ameeq//4V//hPOsERVRHyEpQFrwoQJvPLKK8yePZuQkBDX8fj4eLKysiysTESk6lx/vflQZoAnnjA3DI2NtbYmEfEuS/fB2rp1Kz08HvluioiI4ODBgxZUJCLiZU6na0pw3ctZdAVi9mVxOZCxDBq3swN2KysUkSpg6QiW3W5n+/btpY6vWbOGi079nLKIiK9KT4crroArrqDrnKEAvMpQsriCxolXmOdFxO9YOoKVnJzMo48+ymuvvYbNZmPPnj2sXbuWJ554gnHjxllZmohI5TmdrF+exxiWsI+mdLZlMcsYCrNnu1e22zV6JeKPLA1YKSkpHDp0iN69e3P8+HF69OhBaGgoTzzxBA899JCVpYmIVMqePdDvfCdZTGUfdzL6n3Hc2gq4AjNcnbovg4j4HcufRThx4kTGjBnDd999R3FxMW3atKFevXpWlyUiUmEPPwwzZsDlJ9tffQUhVwH67I5IwLA8YAGEh4fTuXNnq8sQEamUH36A3pc5sePkcuCdJ7JgCoRsyjL/bfvbbzBqlKYFRQJAtQespKSks7524cKFVViJiIh3GAbcdBN8+imMJx0HqeaJKScvGDrUffH48QpYIgGg2gNWgwYNXK8Nw+DDDz+kQYMGrhGsDRs2cPDgwXMKYiIiVsnMNHdjL3H758nQ8CazkZVlhistahcJONUesF5//XXX6yeffJLbbruNV155heCTTzQtKipi+PDhREREVHdpIiJn7cQJ6NQJtmwx2/ffD6++CuaeVn8IUVrULhJwLF2D9dprr7FmzRpXuAIIDg5m1KhRxMfH8/zzz1tYnYhI2RYtgoED3e2dO+GCC6yrR0RqHks3Gj1x4gTff/99qePff/89xcXFFbrns88+i81mY+TIka5jhmHgcDiIjo4mLCyMXr16saXkfztFRM7S0aNQt647XKWmmuuvyg1XdrvWXIkEKEtHsO69917uu+8+tm/fTteuXQFYt24dzz33HPfee+8532/9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\n",
"text/plain": [
"class=Graph name=Metamodel validation - Q2 = 0 % implementation=class=GraphImplementation name=Metamodel validation - Q2 = 0 % title=Q2=99.86% xTitle=model yTitle=metamodel axes=ON grid=ON legendposition= legendFontSize=1 drawables=[class=Drawable name=Unnamed implementation=class=Curve name=Unnamed derived from class=DrawableImplementation name=Unnamed legend= data=class=Sample name=Unnamed implementation=class=SampleImplementation name=Unnamed size=1000 dimension=2 data=[[31.9985,31.9985],[16.5643,16.5643],[11.0718,11.0718],...,[18.1398,18.1398],[12.2453,12.2453],[13.4515,13.4515]] color=blue fillStyle=solid lineStyle=solid pointStyle=none lineWidth=1,class=Drawable name=Unnamed implementation=class=Cloud name=Unnamed derived from class=DrawableImplementation name=Unnamed legend= data=class=Sample name=Unnamed implementation=class=SampleImplementation name=Unnamed size=1000 dimension=2 data=[[31.9985,32.0959],[16.5643,16.6235],[11.0718,11.1922],...,[18.1398,18.0169],[12.2453,12.2419],[13.4515,13.4968]] color=red fillStyle=solid lineStyle=solid pointStyle=plus lineWidth=1]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"graph = val.drawValidation()\n",
"Q2 = val.computePredictivityFactor()\n",
"graph.setTitle(\"Q2=%.2f%%\" % (Q2 * 100))\n",
"graph"
]
},
{
"cell_type": "markdown",
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [
"## Sensitivity analysis"
]
},
{
"cell_type": "markdown",
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [
"Retrieve Sobol' sensitivity measures associated to the polynomial chaos decomposition of the model."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"hideCode": false,
"hidePrompt": false,
"scrolled": true
},
"outputs": [],
"source": [
"chaosSI = ot.FunctionalChaosSobolIndices(result)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"hideCode": false,
"hidePrompt": false,
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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nk2bSp65upBhSIcOFc3r3dv03f/rX/9yen7XgAEDtHLlylLn9u3b1ynEZGRkqFWrVrrhhhtks9mcnmzeoEEDSVLdunXLffjqm2++qbNnz2r58uWqVauWJOmFF17QoEGDNHfuXIWFhUmSatWqpddee81x+e6VV15RQUGBXn/9dQUFBenaa6/V4cOHde+99zq2vXjxYnXp0kVPP/20Y+z1119XZGSkvv32W8eZsJYtW+qZZ56p2BuGEghYAICqx243d14l9enTR4sXL3YsF4ec0sTExDgtjx07VnFxcWrdurVuvvlm/fa3v1V8fHyl9r9v3z517NjRab89evRQYWGh9u/f7whY7du3d7o3qni9oKAgx1hsbKzTtnft2qUNGzaU+gDYH374wRGwLu4LlUPAAgBUPY0amTuvkmrVqqWWLVtWeO6FunTpogMHDujDDz/Uxx9/rOHDh+umm27Su+++W+H9G4ZR5pcmXzh+8b4r8miEwsJCx5mwizW64P0sL1Ti0ix5D9ann36qQYMGqXHjxhX+uGtaWpq6du2qwMBANW/eXC+99JIbKgUAXJaePYs+LVhGyJDNJkVGFs2rgkJCQjRixAi9+uqrWrFihd577z2dOHFCkuTv76+CS9w71rZtW+3evVs5OTmOsS1btsjHx8dxhqms9b744gudPXvWMbZ9+3anOV26dNHXX3+t6OhotWzZ0umHUGUeSwasnJwcdezYUS+88EKF5h84cEADBw5Uz549lZ6erhkzZmjixIl67733XFwpAOCy+PoWPYpBKhmyipeTk4vmVTELFizQ22+/rW+++UbffvutVq5cqfDwcNWtW1dS0ScJP/nkE2VmZuqXX34pdRt33HGHAgMDNWbMGH311VfasGGDHnjgAY0aNcpxebA0I0eOlI+Pj+6++27t3btX69at03PPPec057777tOJEyf0hz/8Qf/5z3/0448/KiUlRePGjbtk8EPFWTJgDRgwQHPmzNHQCj4D5aWXXlJUVJSSk5PVpk0bjR8/XuPGjSvxmw4AUIUMHSq9+67UpInzeERE0bgLn4N1JYKDgzV37lzFxMTouuuu08GDB7Vu3TrHd/XNmzdPqampioyMVOfOnUvdRlBQkNavX68TJ07ouuuu07Bhw9SvX79LnlgIDg7W+++/r71796pz58569NFHS1wKbNy4sbZs2aKCggL1799f7dq106RJk1SnTh2+N9JE1eIerG3btpW4wbB///5asmSJ8vLy5O/vX2Kd3Nxc5ebmOpazs7MlSXl5ecrLy3NtwSYortEKtV4Ob+6P3qzLm/u7nN5MeR+GDpUGDy76tKDdXnTPVc+eLj1ztWzZsjJf27hxo9PywYMHS8y55557dM8995S5jUGDBmnQoEGXrKN9+/b697//XebrZdXZrVu3El+Lc/G9Wa1atdKqcp4jdnGflWEYhgoLC5Wfn+/VfyYupVoErMzMzBKnVMPCwpSfn6+srCynm/qKJSUladasWSXGU1JSnD6dUdWlpqZ6ugSX8ub+6M26vLm/yvTm7+9f7uWsCvP1dcmjGOAaGRkZyszM1H/+8x8dOXJEUtFzvaqbahGwJJX4NEZxmi/rUxrTp09XYmKiYzk7O1uRkZGKj49XSEiI6wo1SV5enlJTUxUXF1fqGTqr8+b+6M26vLm/y+ntzJkz+v77711cGaqaqKgonTt3Ttdff706duwo6f+vAlUn1SJghYeHKzMz02ns2LFj8vPzU/369UtdJyAgQAEBASXG/f39LfUXp9XqrSxv7o/erMub+6tMb976HqB8NptNPj4+8vPzc/weqI6/F6rF3WyxsbElTmunpKQoJiamWh50AADgWpYMWKdPn9bu3bsdN/EdOHBAu3fvVkZGhqSiy3ujR492zJ8wYYJ++uknJSYmat++fXr99de1ZMmSEt/PBAAAYAZLXiLcuXOn+vTp41guvldqzJgxWrZsmex2uyNsSVKzZs20bt06TZkyRS+++KIaN26s559/XrfffrvbawcAAN7PkgGrd+/e5X4dQGkfXe3Vq5c+//xzF1YFAABQxJKXCAEAAKoyAhYAAB4WHR2t5ORkt+xr7Nixuu2229yyr+qMgAUAwP/YbLZyf8aOHXvJ9desWeOeYlGlWfIeLACA98vIkLKyyn49NFSKijJ3n3a73fHrFStW6PHHH9f+/fsdYzVr1jR3hy5U1lfBXSnDMFRQUCA/PyJEeTiDBQCocjIypNatpa5dy/5p3bponpnCw8MdP3Xq1JHNZnMa+8c//qEWLVqoRo0aat26tf7+97871o2OjpYkDRkyRDabzbH8ww8/aPDgwQoLC1NwcLCuu+46ffzxx5Wqq7CwULNnz1ZERIQCAgLUqVMnffTRR47XDx48KJvNpnfeeUe9e/dWYGCg3njjDRUUFCgxMVF169ZV/fr19fDDD5f4kJhhGHrmmWfUvHlz1axZUx07dtS7777reH3jxo2y2Wxav369YmJiFBAQoE2bNlXyna1+CFgAgConK0s6d678OefOlX+Gy2yrV6/WpEmTNHXqVH311Vf605/+pLvuuksbNmyQJO3YsUOStHTpUtntdsfy6dOnNXDgQH388cdKT09X//79NWjQIKfHCV3KwoULNW/ePD333HPas2eP+vfvr1tvvVXfffed07xp06Zp4sSJ2rdvn/r376958+Y5nv24efNmnThxQqtXr3Za589//rOWLl2qxYsX6+uvv9aUKVN05513Ki0tzWneww8/rKSkJO3bt08dOnSo9PtX3XB+DwCACnjuuec0duxYJSQkSCp6BuP27dv13HPPqU+fPmrQoIEkqW7dugoPD3es17FjR8d38knSnDlztHr1aq1du1b3339/hfc9bdo0/f73v5ckzZ07Vxs2bFBycrJefPFFx7zJkydr6NChjuXk5GRNnz7d8dzHl156SevXr3e8npOTo/nz5+vf//63YmNjJUnNmzfX5s2b9fLLL6tXr16OubNnz1ZcXFzF3ixwBgsAgIrYt2+fevTo4TTWo0cP7du3r9z1cnJy9PDDD6tt27aqW7eugoOD9c0331T4DFZ2draOHj1aoX3HxMQ4fn3y5EnZ7XZHcJIkPz8/pzl79+7VuXPnFBcXp+DgYMfP8uXL9cMPP5S5bVwaZ7AAAKggm83mtGwYRomxiz300ENav369nnvuObVs2VI1a9bUsGHDdP78edP3XatWrUpts7CwUJL0wQcfqEmTJk6vBQQEXNG2qzvOYAEAUAFt2rTR5s2bnca2bt2qNm3aOJb9/f1VUFDgNGfTpk0aO3ashgwZovbt2ys8PFwHDx6s8H5DQkLUuHHjS+77YnXq1FGjRo20fft2x1h+fr527drlWG7btq0CAgKUkZGhli1bOv1ERkZWuEaUxBksAAAq4KGHHtLw4cPVpUsX9evXT++//75WrVrl9InA6OhoffLJJ+rRo4cCAgJ01VVXqWXLllq1apUGDRokm82mxx57zHHmqDL7fuKJJ9SiRQt16tRJS5cu1e7du/Xmm2+Wu96kSZP0l7/8Ra1atVKbNm00f/58/frrr47Xa9eurQcffFBTpkxRYWGhbrjhBmVnZ2vr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TxH+5S9/cfx62LBhioyM1JYtW9SyZUvdeuut7ioDAADA5dwWsM6cOaOgoCDH8m9+8xv95je/cdfuAQAA3MZtlwgbNmyoO++8U+vXr1dhYaG7dgsAAOB2bgtYy5cvV25uroYMGaLGjRtr0qRJ2rFjh7t2DwAA4DZuC1hDhw7VypUr9fPPPyspKUn79u1T9+7ddfXVV2v27NnuKgMAAMDl3P5dhLVr19Zdd92llJQUffHFF6pVq5ZmzZrl7jIAAABcxu0B69y5c3rnnXd02223qUuXLjp+/LgefPBBd5cBAADgMm77FGFKSorefPNNrVmzRr6+vho2bJjWr1+vXr16uasEAAAAt3BbwLrtttt0yy236G9/+5tuueUW+fv7u2vXAAAAbuW2gJWZmamQkBB37Q4AAMBj3HYPFuEKAABUF26/yR0AAMDbEbAAAABMRsACAAAwmdsC1s8//1zma3v27HFXGQAAAC7ntoDVvn17rV27tsT4c889p9/85jfuKgMAAMDl3Bawpk2bphEjRmjChAk6e/asjhw5or59++rZZ5/VihUr3FUGAACAy7ktYE2dOlXbt2/Xli1b1KFDB3Xo0EE1a9bUnj17dOutt7qrDAAAAJdz603uzZs317XXXquDBw8qOztbw4cPV1hYmDtLAAAAcDm3BaziM1fff/+99uzZo8WLF+uBBx7Q8OHD9csvv7irDAAAAJdzW8Dq27evRowYoW3btqlNmzYaP3680tPTdfjwYbVv395dZQAAALic276LMCUlRb169XIaa9GihTZv3qynnnrKXWUAAAC4nNvOYBWHq++//17r16/X2bNnJUk2m02PPfaYu8oAAABwObcFrOPHj6tfv366+uqrNXDgQNntdknS+PHj9eCDD7qrDAAAAJdzW8CaMmWK/P39lZGRoaCgIMf4iBEj9OGHH7qrDAAAAJdz6z1Y69evV0REhNN4q1at9NNPP7mrDAAAAJdz2xmsnJwcpzNXxbKyshQQEOCuMgAAAFzObQHrxhtv1PLlyx3LNptNhYWFevbZZ9WnTx93lQEAAOBybrtE+Oyzz6p3797auXOnzp8/r4cfflhff/21Tpw4oS1btrirDAAAAJdz2xmstm3bas+ePbr++usVFxennJwcDR06VOnp6WrRooW7ygAAAHA5t53BkqTw8HDNmjXLnbsEAABwO5cGrD17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opiYGPn7+3uoKtdJT0+vUqfxixmGoQceeECrV6/Wxo0b1axZs0uuY5Vjdzm9laaqHrvSGIah3NzcUl+zynErS3m9laaqHrd+/frpyy+/dBq76667dM0112jatGny9fUtsY5Vjt3l9FaaqnrsLM9Td9fjypw6dcpIT0830tPTDUnG/PnzjfT0dOOnn34yDMMwHnnkEWPUqFGO+T/++KMRFBRkTJkyxdi7d6+xZMkSw9/f33j33Xc91UKZKtvbggULjNWrVxvffvut8dVXXxmPPPKIIcl47733PNVCme69916jTp06xsaNGw273e74OXPmjGOOVY/d5fRmpWM3ffp049NPPzUOHDhg7Nmzx5gxY4bh4+NjpKSkGIZh3eNmGJXvzUrHrTQXf9LOysfuYpfqzerHzkoIWBZV/FHbi3/GjBljGIZhjBkzxujVq5fTOhs3bjQ6d+5sqhUFSQAABDBJREFU1KhRw4iOjjYWL17s/sIroLK9zZ0712jRooURGBhoXHXVVcYNN9xgfPDBB54p/hJK60uSsXTpUsccqx67y+nNSsdu3LhxRtOmTY0aNWoYDRo0MPr16+cIIIZh3eNmGJXvzUrHrTQXhxArH7uLXao3qx87K7EZxv/u3AMAAIApuMkdAADAZAQsAAAAkxGwAAAATEbAAgAAMBkBCwAAwGQELAAAAJMRsAAAAExGwALgEb1799bkyZM9XQYAuAQPGgXgESdOnJC/v79q167ttn3OnDlTa9as0e7du922TwDVE1/2DMAj6tWr5+kSAMBluEQIwCMuvEQYHR2tp59+WuPGjVPt2rUVFRWlV155xTH34MGDstlsevvtt9W9e3cFBgbq2muv1caNGx1zli1bprp16zrtY82aNbLZbI7XZ82apS+++EI2m002m03Lli2TVHRmKyoqSgEBAWrcuLEmTpzo2uYBeD0CFoAqYd68eYqJiVF6eroSEhJ077336ptvvnGa89BDD2nq1KlKT09X9+7ddeutt+r48eMV2v6IESM0depUXXvttbLb7bLb7RoxYoTeffddLViwQC+//LK+++47rVmzRu3bt3dFiwCqEQIWgCph4MCBSkhIUMuWLTVt2jSFhoY6naGSpPvvv1+333672rRpo8WLF6tOnTpasmRJhbZfs2ZNBQcHy8/PT+Hh4QoPD1fNmjWVkZGh8PBw3XTTTYqKitL111+ve+65xwUdAqhOCFgAqoQOHTo4fm2z2RQeHq5jx445zYmNjXX82s/PTzExMdq3b98V7fd3v/udzp49q+bNm+uee+7R6tWrlZ+ff0XbBAACFoAqwd/f32nZZrOpsLDwkusV32Pl4+Ojiz8UnZeXd8n1IyMjtX//fr344ouqWbOmEhISdOONN1ZoXQAoCwELgGVs377d8ev8/Hzt2rVL11xzjSSpQYMGOnXqlHJychxzLn4cQ40aNVRQUFBiuzVr1tStt96q559/Xhs3btS2bdv05ZdfuqgLANUBj2kAYBkvvviiWrVqpTZt2mjBggX65ZdfNG7cOEnSb37zGwUFBWnGjBl64IEH9J///MfxKcFi0dHROnDggHbv3q2IiAjVrl1bb731lgoKChzr//3vf1fNmjXVtGnT/2vnDnEUhqIogN4lNAEW0AW0xaNw9d0QEtZQS1JNmtShWEC30KWMGDVqzE+YIef4l/znbu5P3hs2BD6FBgv4N67Xa263W7quy+v1yuPxyH6/T/J9V+t+v2dZljRNk2macrlcfswPw5C+73M+n3M4HDJNU6qqyjiOOZ1Oads2z+cz8zxnt9u9YUPgU7jkDvx527alruus65rj8fju5wD8SoMFAFCYgAUAUJgvQgCAwjRYAACFCVgAAIUJWAAAhQlYAACFCVgAAIUJWAAAhX0BCM9pFSPdFJMAAAAASUVORK5CYII=\n",
"text/plain": [
"class=Graph name=Sobol' indices implementation=class=GraphImplementation name=Sobol' indices title=Sobol' indices xTitle=inputs yTitle=index value axes=ON grid=ON legendposition=topright legendFontSize=1 drawables=[class=Drawable name=First order implementation=class=Cloud name=First order derived from class=DrawableImplementation name=First order legend=First order data=class=Sample name=Unnamed implementation=class=SampleImplementation name=Unnamed size=4 dimension=2 data=[[1,0.107178],[2,0.819744],[3,0.00944568],[4,0.0464192]] color=red fillStyle=solid lineStyle=solid pointStyle=circle lineWidth=1,class=Drawable name=Total order implementation=class=Cloud name=Total order derived from class=DrawableImplementation name=Total order legend=Total order data=class=Sample name=Unnamed implementation=class=SampleImplementation name=Unnamed size=4 dimension=2 data=[[1.1,0.119386],[2.1,0.836957],[3.1,0.0107012],[4.1,0.0501694]] color=blue fillStyle=solid lineStyle=solid pointStyle=square lineWidth=1,class=Drawable name=Unnamed implementation=class=Text name=Unnamed derived from class=DrawableImplementation name=Unnamed legend= data=class=Sample name=Unnamed implementation=class=SampleImplementation name=Unnamed size=4 dimension=2 data=[[1.2,0.113282],[2.2,0.82835],[3.2,0.0100734],[4.2,0.0482943]] color=black fillStyle=solid lineStyle=solid pointStyle=plus lineWidth=1]"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"chaosSI = ot.FunctionalChaosSobolIndices(result)\n",
"firstOrderIndices = ot.Point([chaosSI.getSobolIndex(i) for i in range(dim_input)])\n",
"totalOrderIndices = ot.Point([chaosSI.getSobolTotalIndex(i) for i in range(dim_input)])\n",
"input_names = g.getInputDescription()\n",
"ot.SobolIndicesAlgorithm.DrawSobolIndices(\n",
" input_names, firstOrderIndices, totalOrderIndices\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [
"## Par bootstrap"
]
},
{
"cell_type": "markdown",
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [
"La méthodologie à appliquer est la suivante :\n",
" - Calculer un modèle de chaos pour établir l'erreur & les indices \"nominaux\"\n",
" - S'appuyer sur le résultat précédent pour récupérer la base creuse utilisée. Les futurs calculs seront tout simplement vus comme un problème de moindres carrés\n",
" - Générer des échantillons bootstrap et calculer les coefficients sur la base creuse précédente\n",
" - En déduire les coefficients de Sobol"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [],
"source": [
"class BootstrapInputOutputSample:\n",
" \"\"\"\n",
" Creates Bootstrap input/output samples. \n",
" \"\"\"\n",
"\n",
" def __init__(self, inputSample, outputSample):\n",
" \"\"\"\n",
" Creates a Bootstrap input/output samples. \n",
" \n",
" Parameters :\n",
" inputSample : a Sample, the input\n",
" outputSample : a Sample, the output\n",
" \"\"\"\n",
" self.sampleSize = inputSample.getSize()\n",
" self.dimInput = inputSample.getDimension()\n",
" self.dimOutput = outputSample.getDimension()\n",
" self.dimTotal = self.dimInput + self.dimOutput\n",
" # Creates the full Sample by joining the input and output\n",
" fullSample = ot.Sample(self.sampleSize, self.dimTotal)\n",
" fullSample[:, 0 : self.dimInput] = inputSample\n",
" fullSample[:, self.dimInput : self.dimTotal] = outputSample\n",
" self.bootstrap = ot.BootstrapExperiment(fullSample)\n",
"\n",
" def generate(self):\n",
" \"\"\"\n",
" Returns a pair of (input, output) Sample by bootstraping the initial Sample.\n",
" \"\"\"\n",
" fullBootstrapSample = self.bootstrap.generate()\n",
" bootstrapInputSample = fullBootstrapSample[:, 0 : self.dimInput]\n",
" bootstrapOutputSample = fullBootstrapSample[:, self.dimInput : self.dimTotal]\n",
" return bootstrapInputSample, bootstrapOutputSample"
]
},
{
"cell_type": "markdown",
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [
"On definit une classe qui permet d'utiliser des élements de chaos (base creuse) avec un nouveau jeu de données pour effectuer le calcul (moindres carrés):"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [],
"source": [
"class BootstrapSensitivityPostFunctionalChaos(object):\n",
" \"\"\"\n",
" Compute new chaos model using an initial chaos result and new data which have same properties\n",
" as the ones used to define the initial model\n",
" \n",
" Thus apply the model to derive Sobol indices\n",
"\n",
" Parameters\n",
" ----------\n",
" result : FunctionalChaosResult object\n",
" Initial chaos result\n",
"\n",
"\n",
" \"\"\"\n",
" def __init__(self, functional_chaos_result):\n",
" self.result = functional_chaos_result\n",
"\n",
" def compute_model(self, X, Y):\n",
" \"\"\"\n",
" Run the new model\n",
"\n",
" Parameters\n",
" ----------\n",
" X : 2d-array like\n",
" Input data\n",
" Y : 2d-array like\n",
" Output data\n",
"\n",
" Returns\n",
" -------\n",
" new_result : FunctionalChaosResult object\n",
" New chaos result object\n",
" loo_error : array\n",
" LOO error obtained\n",
"\n",
" \"\"\"\n",
" # The objective hereafter is to define a functional chaos algorithm starting from different data and a\n",
" # FunctionalChaosResult class in order to get new model and new sensitivity but by using :\n",
" # - the data (input/output samples)\n",
" # - The input distribution\n",
" # - The orthogonal product basis defined using the collection of orthogonal univariate polynoms\n",
" # and the enumerate function (linear for example)\n",
" # Output data variance\n",
" x, y = np.array(X), np.array(Y)\n",
" var_i = np.var(y, axis=0, ddof=1)\n",
" var_i[var_i == 0] = ot.SpecFunc.ScalarEpsilon\n",
" # Retrieve all chaos result elements\n",
" model = self.result.getModel()\n",
" transformation = self.result.getTransformation()\n",
" inverseTransformation = self.result.getInverseTransformation()\n",
" composedModel = self.result.getComposedModel()\n",
" orthogonal_basis = self.result.getOrthogonalBasis()\n",
" distribution = self.result.getDistribution()\n",
" enumerate_function = self.result.getOrthogonalBasis().getEnumerateFunction()\n",
" coefficients = np.array(self.result.getCoefficients())\n",
" all_indices = self.result.getIndices()\n",
" reduced_basis = self.result.getReducedBasis()\n",
" # Let us first transform input data from initial space to the measure distribution space\n",
" # such as orthogonal basis could be evaluated correctly on this transformed sample\n",
" tX = np.array(transformation(x))\n",
" # The design proxy class in OpenTURNS is used when solving linear systems\n",
" # Indeed, chaos algorithm, using a FixedStrategy & LeastSquaresStrategy consists in solving\n",
" # a linear system Psi a = y where Psi_{i,j} = ProductBasis_{j} (transformation(x)_i)\n",
" # The design proxy allows to not compute once the elements of degree 0, 1, .., d. It can be considered\n",
" # as a cache mechanism\n",
" design_proxy = ot.DesignProxy(tX, ot.Basis(reduced_basis))\n",
" # Care! all_indices refers to the selected indices in sparse case\n",
" # We should consider a local enumeration to work on the built functions\n",
" lsm = ot.QRMethod(design_proxy, range(len(all_indices)))\n",
" # Basis funcions\n",
" try:\n",
" basis = lsm.buildCurrentBasis()\n",
" functions = ot.FunctionCollection(basis)\n",
" except AttributeError:\n",
" indices = lsm.getCurrentIndices()\n",
" functions = ot.FunctionCollection([lsm.getBasis()[i] for i in indices])\n",
" # New coefficients\n",
" new_coefficients = np.ndarray(coefficients.shape)\n",
" new_coefficients[:,:] = 0\n",
" # Define marginal indices\n",
" error = []\n",
" residuals = []\n",
" relativeErrors = []\n",
" # We work by marginal. For each marginal, we consider the same inputs (thus the\n",
" # same design proxy) ==> we reuse the same elements for output_dimension systems\n",
" for i in range(len(Y[0])):\n",
" # Identify active indices\n",
" non_zero_idx, = np.nonzero(coefficients[:,i])\n",
" non_zero_idx = non_zero_idx.tolist()\n",
" idx = [all_indices[k] for k in non_zero_idx]\n",
" # We compute the matrix Psi : number of columns is `basis_size`\n",
" # We define a LeastSquaresMethod (QR method). We fix the `basis_size` columns\n",
" # as we want to compute Psi_j for j in `idx`\n",
" # We can use another least squares method (SVD or Cholesky)\n",
" lsm = ot.QRMethod(design_proxy, non_zero_idx)\n",
" # Current basis $\\Psi$\n",
" basis = ot.Basis([reduced_basis[k] for k in non_zero_idx])\n",
" # Computing alpha : the chaos expansion is the measure space is \\sum_k alpha_k \\Psi_k(z)\n",
" alpha = lsm.solve(y[:,i])\n",
" metaModel = ot.LinearCombinationFunction(basis, alpha)\n",
" # new_coefficients[non_zero_idx,i] = alpha[:]\n",
" new_coefficients[non_zero_idx, i] = alpha[:]\n",
" z = metaModel(tX)\n",
" yhat = np.array(z).ravel()\n",
" # For the evaluation of the LOO error, we consider the diagonal of the `hat matrix`.\n",
" # LOO error when removing the ith point is the standard prediction error normalized\n",
" # by the ith element of the `diagonal hat matrix` (1 - diagonal of the Hat matrix)\n",
" # See reference below for more details\n",
" hi = np.array(lsm.getHDiag())\n",
" # Error\n",
" e = y[:,i] - yhat\n",
" loo_error = e / ((1.0 - hi) * var_i[i])\n",
" # We compute the L2 error over all the points for this marginal\n",
" error.append( np.mean(loo_error**2) )\n",
" # Residual errors\n",
" # \\frac{\\sqrt{\\sum_{i=1}^N (y_i - \\hat{y_i})^2}}{N}\n",
" residuals.append( np.sqrt(np.mean(np.square(e)) ) )\n",
" # relative errors\n",
" # \\frac{\\sum_{i=1}^N (y_i - \\hat{y_i})^2}{N \\mathbb{V}ar{{Y}}}\n",
" relativeErrors.append( np.mean(np.square(e)) / var_i[i] )\n",
" # define new chaos result\n",
" result = ot.FunctionalChaosResult(model, distribution, transformation, inverseTransformation,\\\n",
" composedModel, orthogonal_basis, all_indices, new_coefficients,\\\n",
" functions, residuals, relativeErrors)\n",
" return (result, np.array(error))\n",
"\n",
" def compute_sobol_indices(self, X, Y):\n",
" \"\"\"\n",
" Run a new model using X/Y & derive Sobol indices\n",
"\n",
" Parameters\n",
" ----------\n",
" X : 2d-array like\n",
" Input data\n",
" Y : 2d-array like\n",
" Output data\n",
"\n",
" Returns\n",
" -------\n",
" first_order : 1d-array like\n",
" First order sobol indices\n",
"\n",
" total_order : 1d-array like\n",
" Total order sobol indices\n",
" \"\"\"\n",
" result, e = self.compute_model(X, Y)\n",
" chaosSI = ot.FunctionalChaosSobolIndices(result)\n",
" dimInput = self.result.getDistribution().getDimension()\n",
" firstOrderIndices = ot.Point([chaosSI.getSobolIndex(i) for i in range(dim_input)])\n",
" totalOrderIndices = ot.Point([chaosSI.getSobolTotalIndex(i) for i in range(dim_input)])\n",
" return firstOrderIndices, totalOrderIndices\n",
"\n",
" def compute_bootstrap_sobol_indices(self, generator, size):\n",
" \"\"\"\n",
" Run a new model using X/Y & derive Sobol indices\n",
"\n",
" Parameters\n",
" ----------\n",
" generator : Bootstrap generator\n",
" Object providing a `generate` method\n",
" that returns x, y samples\n",
" X : 2d-array like\n",
" Input data\n",
" Y : 2d-array like\n",
" Output data\n",
"\n",
" Returns\n",
" -------\n",
" first_order : 2d-array like\n",
" First order sobol indices\n",
"\n",
" total_order : 2d-array like\n",
" Total order sobol indices\n",
" \"\"\"\n",
" \n",
" dimInput = self.result.getDistribution().getDimension()\n",
" sampleFirstOrderIndices = ot.Sample(size, dimInput)\n",
" sampleTotalOrderIndices = ot.Sample(size, dimInput)\n",
"\n",
" for i in range(size):\n",
" bootstrap_input_sample, bootstrap_output_sample = generator.generate()\n",
" # New chaos & thus new chaos result\n",
" first_order,total_order = self.compute_sobol_indices(bootstrap_input_sample, bootstrap_output_sample)\n",
"\n",
" sampleFirstOrderIndices[i] = first_order\n",
" sampleTotalOrderIndices[i] = total_order\n",
" return sampleFirstOrderIndices, sampleTotalOrderIndices\n",
"\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [],
"source": [
"bootstrapSample = BootstrapInputOutputSample(inputTrain, outputTrain)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [],
"source": [
"bootstrapInputSample, bootstrapOutputSample = bootstrapSample.generate()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [
{
"data": {
"text/html": [
"<TABLE><TR><TD></TD><TH>v0</TH><TH>v1</TH><TH>v2</TH><TH>v3</TH></TR>\n",
"<TR><TH>0</TH><TD>4.337717e+07</TD><TD>32286.37</TD><TD>251.0782</TD><TD>332.7192</TD></TR>\n",
"<TR><TH>1</TH><TD>3.801242e+07</TD><TD>33735.26</TD><TD>255.144</TD><TD>366.1866</TD></TR>\n",
"<TR><TH>2</TH><TD>3.801242e+07</TD><TD>33735.26</TD><TD>255.144</TD><TD>366.1866</TD></TR>\n",
"<TR><TH>3</TH><TD>3.801242e+07</TD><TD>33735.26</TD><TD>255.144</TD><TD>366.1866</TD></TR>\n",
"<TR><TH>4</TH><TD>3.181211e+07</TD><TD>43635.07</TD><TD>259.1172</TD><TD>344.4938</TD></TR>\n",
"</TABLE>"
],
"text/plain": [
"class=Sample name=Unnamed implementation=class=SampleImplementation name=Unnamed size=5 dimension=4 description=[v0,v1,v2,v3] data=[[4.33772e+07,32286.4,251.078,332.719],[3.80124e+07,33735.3,255.144,366.187],[3.80124e+07,33735.3,255.144,366.187],[3.80124e+07,33735.3,255.144,366.187],[3.18121e+07,43635.1,259.117,344.494]]"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"bootstrapInputSample[:5, :]"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [
{
"data": {
"text/html": [
"<TABLE><TR><TD></TD><TH>v4</TH></TR>\n",
"<TR><TH>0</TH><TD>11.80282</TD></TR>\n",
"<TR><TH>1</TH><TD>13.4181</TD></TR>\n",
"<TR><TH>2</TH><TD>13.4181</TD></TR>\n",
"<TR><TH>3</TH><TD>13.4181</TD></TR>\n",
"<TR><TH>4</TH><TD>23.09029</TD></TR>\n",
"</TABLE>"
],
"text/plain": [
"class=Sample name=Unnamed implementation=class=SampleImplementation name=Unnamed size=5 dimension=1 description=[v4] data=[[11.8028],[13.4181],[13.4181],[13.4181],[23.0903]]"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"bootstrapOutputSample[:5, :]"
]
},
{
"cell_type": "markdown",
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [
"## Analyse de sensibilité bootstrap"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:112: RuntimeWarning: invalid value encountered in true_divide\n",
"/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:112: RuntimeWarning: divide by zero encountered in true_divide\n"
]
}
],
"source": [
"bootstrapSampleSize = 500\n",
"bootstrap = BootstrapSensitivityPostFunctionalChaos(result)\n",
"sampleFirstOrderIndices, sampleTotalOrderIndices = bootstrap.compute_bootstrap_sobol_indices(bootstrapSample,\n",
" bootstrapSampleSize)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [],
"source": [
"def ComputeSobolIndicesConfidenceInterval(\n",
" sampleFirstOrderIndices, sampleTotalOrderIndices, alpha\n",
"):\n",
" \"\"\"\n",
" From a sample of first or total order indices, \n",
" compute a bilateral confidence interval of level alpha. \n",
" \n",
" Parameters:\n",
" sampleFirstOrderIndices: a Sample with dimension dimInput, the first order indices\n",
" sampleTotalOrderIndices: a Sample with dimension dimInput, the total order indices\n",
" \n",
" Description:\n",
" Estimates the distribution of the first and total order Sobol' indices \n",
" from a KernelSmoothing estimation. \n",
" Then computes a bilateral confidence interval for each marginal. \n",
" \"\"\"\n",
" kernel = ot.KernelSmoothing()\n",
" dimInput = sampleFirstOrderIndices.getDimension()\n",
" firstOrderIndicesLowerBound = ot.Point(dimInput)\n",
" firstOrderIndicesUpperBound = ot.Point(dimInput)\n",
" totalOrderIndicesLowerBound = ot.Point(dimInput)\n",
" totalOrderIndicesUpperBound = ot.Point(dimInput)\n",
" for i in range(dimInput):\n",
" fittedDist = kernel.build(sampleFirstOrderIndices[:, i])\n",
" firstOrderIndicesInterval_i = fittedDist.computeBilateralConfidenceInterval(\n",
" alpha\n",
" )\n",
" firstOrderIndicesLowerBound[i] = firstOrderIndicesInterval_i.getLowerBound()[0]\n",
" firstOrderIndicesUpperBound[i] = firstOrderIndicesInterval_i.getUpperBound()[0]\n",
" fittedDist = kernel.build(sampleTotalOrderIndices[:, i])\n",
" totalOrderIndicesInterval_i = fittedDist.computeBilateralConfidenceInterval(\n",
" alpha\n",
" )\n",
" totalOrderIndicesLowerBound[i] = totalOrderIndicesInterval_i.getLowerBound()[0]\n",
" totalOrderIndicesUpperBound[i] = totalOrderIndicesInterval_i.getUpperBound()[0]\n",
" # Create intervals\n",
" firstOrderIndicesInterval = ot.Interval(\n",
" firstOrderIndicesLowerBound, firstOrderIndicesUpperBound\n",
" )\n",
" totalOrderIndicesInterval = ot.Interval(\n",
" totalOrderIndicesLowerBound, totalOrderIndicesUpperBound\n",
" )\n",
" return firstOrderIndicesInterval, totalOrderIndicesInterval"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [],
"source": [
"alpha = 0.95\n",
"(\n",
" firstOrderIndicesInterval,\n",
" totalOrderIndicesInterval,\n",
") = ComputeSobolIndicesConfidenceInterval(\n",
" sampleFirstOrderIndices, sampleTotalOrderIndices, alpha\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [],
"source": [
"def PlotSobolSimulationResult(\n",
" firstOrderIndices,\n",
" totalOrderIndices,\n",
" firstOrderIndicesInterval,\n",
" totalOrderIndicesInterval,\n",
" input_names,\n",
" alpha,\n",
"):\n",
" dim = firstOrderIndices.getDimension()\n",
" graph = ot.Graph(\n",
" \"Sobol' sensivity indices\", \"Inputs\", \"Sensivity indices\", True, \"topright\"\n",
" )\n",
" # Indices\n",
" curve = ot.Cloud(range(dim), firstOrderIndices)\n",
" curve.setColor(\"red\")\n",
" curve.setLegend(\"First order\")\n",
" graph.add(curve)\n",
" curve = ot.Cloud(range(dim), totalOrderIndices)\n",
" curve.setColor(\"blue\")\n",
" curve.setLegend(\"Total order\")\n",
" graph.add(curve)\n",
" # Labels\n",
" x = ot.Point(range(dim)) + ot.Point([0.1] * dim)\n",
" text = ot.Text(x, totalOrderIndices, input_names)\n",
" text.setColor(\"black\")\n",
" text.setTextSize(1.0)\n",
" graph.add(text)\n",
" # Error bars\n",
" firstOrderIndicesLowerBound = firstOrderIndicesInterval.getLowerBound()\n",
" firstOrderIndicesUpperBound = firstOrderIndicesInterval.getUpperBound()\n",
" totalOrderIndicesLowerBound = totalOrderIndicesInterval.getLowerBound()\n",
" totalOrderIndicesUpperBound = totalOrderIndicesInterval.getUpperBound()\n",
" for i in range(dim):\n",
" fo_a = firstOrderIndicesLowerBound[i]\n",
" fo_b = firstOrderIndicesUpperBound[i]\n",
" to_a = totalOrderIndicesLowerBound[i]\n",
" to_b = totalOrderIndicesUpperBound[i]\n",
" curve = ot.Curve([i, i], [fo_a, fo_b])\n",
" curve.setColor(\"red\")\n",
" graph.add(curve)\n",
" curve = ot.Curve([i, i], [to_a, to_b])\n",
" curve.setColor(\"blue\")\n",
" graph.add(curve)\n",
" return graph"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"hideCode": false,
"hidePrompt": false,
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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rCfZvHkzxo0bh4kTJ+K3335DdHQ0hg4dir179wIAjh49CgCIi4uDWq3Wvb537x66dOmCH3/8EcePH0enTp3QrVu3x959pCQLFy7E/PnzMW/ePJw6dQqdOnVC9+7dcfHiRUm/999/H2PHjkVqaio6deqE+fPnY+XKlVixYgUOHDiArKwsbN68WbLN//3f/yEuLg5LlizBmTNn8M4772DgwIH46aefJP3ee+89xMTEIDU1FU2aNClz/iob7t8jIiIqhXnz5iEyMhKjRo0CUHg88C+//IJ58+ahXbt2qFGjBgCgevXqcHd312334osv6tAoHmgAACAASURBVC5XAABz5szB5s2bsXXrVowZM6bUc7///vv417/+BQD49NNPsXfvXsTGxuLLL7/U9Rs/fjx69+6tex0bG4spU6agT58+AIClS5di165duvfv37+PBQsWYM+ePWjRovCG8rVr18aBAwewbNkytG3bVtd31qxZCAsLK12yiAUWERGVT2r1P3usUlKkz0Dhfc/lvPd5amoqRo4cKWlr1aoVFi5c+MTt7t+/j5kzZ2L79u24ceMG8vPz8eDBg1LvwcrOzsaNGzfQqlUrvblPnjwpaQsJCdH9+86dO1Cr1brCCQAsLS0REhKiWyY8e/YsHj58qFc45eXlITAw8LFj09OxwCIqz+rXx77589Gqfn1TR0Iku2XLCpcFixsx4p9/T59eeFyWnMpykesi7777Lnbt2oV58+bB398fNjY26Nu3L/Ly8gw+d9WqVcs0ZkFBAQDghx9+0Dsu+dFrQZZ17MqOx2ARlWe2trhTpw5g4NszEZmD6GggObnw8fXXhW1ff/1PW3S0vPEEBATgwIEDkrZDhw4hICBA91qpVEKr1Ur67N+/H5GRkejVqxcaN24Md3d3pKWllXpee3t71KxZ86lzP8rBwQEeHh745ZdfdG35+flITk7WvW7YsCFUKhXS09Ph7+8veXh5eZU6RtLHPVhERFQulbQEGBRU+DCFd999F/3790dQUBA6dOiAbdu2YdOmTZIzAn19fbF79260atUKKpUKjo6O8Pf3x6ZNm9CtWzcoFApMmzZNt+eoLHNPnz4dderUQdOmTREXF4cTJ05gzZo1T9xu3Lhx+OSTT1C3bl0EBARgwYIF+Ouvv3TvV6tWDZMmTcI777yDgoICtG7dGtnZ2Th06BDs7Oww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\n",
"text/plain": [
"class=Graph name=Sobol' sensivity indices implementation=class=GraphImplementation name=Sobol' sensivity indices title=Sobol' sensivity indices - n=20 xTitle=Inputs yTitle=Sensivity indices axes=ON grid=ON legendposition=topright legendFontSize=1 drawables=[class=Drawable name=Unnamed implementation=class=Cloud name=Unnamed derived from class=DrawableImplementation name=Unnamed legend=First order data=class=Sample name=Unnamed implementation=class=SampleImplementation name=Unnamed size=4 dimension=2 data=[[0,0.107178],[1,0.819744],[2,0.00944568],[3,0.0464192]] color=red fillStyle=solid lineStyle=solid pointStyle=plus lineWidth=1,class=Drawable name=Unnamed implementation=class=Cloud name=Unnamed derived from class=DrawableImplementation name=Unnamed legend=Total order data=class=Sample name=Unnamed implementation=class=SampleImplementation name=Unnamed size=4 dimension=2 data=[[0,0.119386],[1,0.836957],[2,0.0107012],[3,0.0501694]] color=blue fillStyle=solid lineStyle=solid pointStyle=plus lineWidth=1,class=Drawable name=Unnamed implementation=class=Text name=Unnamed derived from class=DrawableImplementation name=Unnamed legend= data=class=Sample name=Unnamed implementation=class=SampleImplementation name=Unnamed size=4 dimension=2 data=[[0.1,0.119386],[1.1,0.836957],[2.1,0.0107012],[3.1,0.0501694]] color=black fillStyle=solid lineStyle=solid pointStyle=plus lineWidth=1,class=Drawable name=Unnamed implementation=class=Curve name=Unnamed derived from class=DrawableImplementation name=Unnamed legend= data=class=Sample name=Unnamed implementation=class=SampleImplementation name=Unnamed size=2 dimension=2 data=[[0,0.0969544],[0,0.119447]] color=red fillStyle=solid lineStyle=solid pointStyle=none lineWidth=1,class=Drawable name=Unnamed implementation=class=Curve name=Unnamed derived from class=DrawableImplementation name=Unnamed legend= data=class=Sample name=Unnamed implementation=class=SampleImplementation name=Unnamed size=2 dimension=2 data=[[0,0.10473],[0,0.150723]] color=blue fillStyle=solid lineStyle=solid pointStyle=none lineWidth=1,class=Drawable name=Unnamed implementation=class=Curve name=Unnamed derived from class=DrawableImplementation name=Unnamed legend= data=class=Sample name=Unnamed implementation=class=SampleImplementation name=Unnamed size=2 dimension=2 data=[[1,0.773458],[1,0.840036]] color=red fillStyle=solid lineStyle=solid pointStyle=none lineWidth=1,class=Drawable name=Unnamed implementation=class=Curve name=Unnamed derived from class=DrawableImplementation name=Unnamed legend= data=class=Sample name=Unnamed implementation=class=SampleImplementation name=Unnamed size=2 dimension=2 data=[[1,0.811109],[1,0.851541]] color=blue fillStyle=solid lineStyle=solid pointStyle=none lineWidth=1,class=Drawable name=Unnamed implementation=class=Curve name=Unnamed derived from class=DrawableImplementation name=Unnamed legend= data=class=Sample name=Unnamed implementation=class=SampleImplementation name=Unnamed size=2 dimension=2 data=[[2,0.0053249],[2,0.0162094]] color=red fillStyle=solid lineStyle=solid pointStyle=none lineWidth=1,class=Drawable name=Unnamed implementation=class=Curve name=Unnamed derived from class=DrawableImplementation name=Unnamed legend= data=class=Sample name=Unnamed implementation=class=SampleImplementation name=Unnamed size=2 dimension=2 data=[[2,0.00558524],[2,0.0205677]] color=blue fillStyle=solid lineStyle=solid pointStyle=none lineWidth=1,class=Drawable name=Unnamed implementation=class=Curve name=Unnamed derived from class=DrawableImplementation name=Unnamed legend= data=class=Sample name=Unnamed implementation=class=SampleImplementation name=Unnamed size=2 dimension=2 data=[[3,0.0383088],[3,0.0589639]] color=red fillStyle=solid lineStyle=solid pointStyle=none lineWidth=1,class=Drawable name=Unnamed implementation=class=Curve name=Unnamed derived from class=DrawableImplementation name=Unnamed legend= data=class=Sample name=Unnamed implementation=class=SampleImplementation name=Unnamed size=2 dimension=2 data=[[3,0.0410925],[3,0.0670278]] color=blue fillStyle=solid lineStyle=solid pointStyle=none lineWidth=1]"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"graph = PlotSobolSimulationResult(\n",
" firstOrderIndices,\n",
" totalOrderIndices,\n",
" firstOrderIndicesInterval,\n",
" totalOrderIndicesInterval,\n",
" input_names,\n",
" alpha,\n",
")\n",
"sampleSize = inputTrain.getSize()\n",
"graph.setTitle(\"Sobol' sensivity indices - n=%d\" % (sampleSize))\n",
"graph"
]
}
],
"metadata": {
"hide_code_all_hidden": false,
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment