{ "cells": [ { "source": [ "# Tutorial 1 - Bank decision loan problem with crisp inputs" ], "cell_type": "markdown", "metadata": {} }, { "source": [ "In this tutorial a fuzzy inference system for loan approbation is builded. The problem has three input variables: score, ratio, and credit; and one output variable: decision." ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import os\n", "\n", "os.chdir('/workspaces/fuzzy-expert')" ] }, { "cell_type": "code", "execution_count": 2, "id": "fda07d0f-3958-4ea3-9474-34a43adc175e", "metadata": {}, "outputs": [], "source": [ "import warnings\n", "\n", "warnings.filterwarnings(\"ignore\")" ] }, { "source": [ "## Variable specification\n", "\n", "In the following code, a dictionary containing the variables of the problem is defined. The keys of the dictionary are the names of the variables in the rules. For each variable is defined the limits of the universe of discourse, the terms, and the membership function for each term. Finally, the variable `score` is ploted." ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 3, "id": "d0b87f10-2777-43f0-ab20-9c516cf20dd3", "metadata": { "tags": [] }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n \n \n \n \n 2021-06-24T19:55:34.936397\n image/svg+xml\n \n \n Matplotlib v3.4.2, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "from fuzzy_expert.variable import FuzzyVariable\n", "\n", "variables = {\n", " \"score\": FuzzyVariable(\n", " universe_range=(150, 200),\n", " terms={\n", " \"High\": [(175, 0), (180, 0.2), (185, 0.7), (190, 1)],\n", " \"Low\": [(155, 1), (160, 0.8), (165, 0.5), (170, 0.2), (175, 0)],\n", " },\n", " ),\n", " \"ratio\": FuzzyVariable(\n", " universe_range=(0.1, 1),\n", " terms={\n", " \"Goodr\": [(0.3, 1), (0.4, 0.7), (0.41, 0.3), (0.42, 0)],\n", " \"Badr\": [(0.44, 0), (0.45, 0.3), (0.5, 0.7), (0.7, 1)],\n", " },\n", " ),\n", " #\n", " \"credit\": FuzzyVariable(\n", " universe_range=(0, 10),\n", " terms={\n", " \"Goodc\": [(2, 1), (3, 0.7), (4, 0.3), (5, 0)],\n", " \"Badc\": [(5, 0), (6, 0.3), (7, 0.7), (8, 1)],\n", " },\n", " ),\n", " #\n", " \"decision\": FuzzyVariable(\n", " universe_range=(0, 10),\n", " terms={\n", " \"Approve\": [(5, 0), (6, 0.3), (7, 0.7), (8, 1)],\n", " \"Reject\": [(2, 1), (3, 0.7), (4, 0.3), (5, 0)],\n", " },\n", " ),\n", "}\n", "\n", "plt.figure(figsize=(10, 2.5))\n", "variables[\"score\"].plot()" ] }, { "source": [ "## Rule specification\n", "\n" ], "cell_type": "markdown", "metadata": {} }, { "source": [ "The fuzzy inference system has two rules. They are directly stored in a list." ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 4, "id": "90ec945e-a099-42f2-97c7-9bf083bd6782", "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "IF score IS High\n AND ratio IS Goodr\n AND credit IS Goodc\nTHEN\n decision IS Approve\nCF = 1.00\nThreshold-CF = 0.00\n\n\nIF score IS Low\n AND ratio IS Badr\n OR credit IS Badc\nTHEN\n decision IS Reject\nCF = 1.00\nThreshold-CF = 0.00\n\n" ] } ], "source": [ "from fuzzy_expert.rule import FuzzyRule\n", "\n", "rules = [\n", " FuzzyRule(\n", " premise=[\n", " (\"score\", \"High\"),\n", " (\"AND\", \"ratio\", \"Goodr\"),\n", " (\"AND\", \"credit\", \"Goodc\"),\n", " ],\n", " consequence=[(\"decision\", \"Approve\")],\n", " ),\n", " FuzzyRule(\n", " premise=[\n", " (\"score\", \"Low\"),\n", " (\"AND\", \"ratio\", \"Badr\"),\n", " (\"OR\", \"credit\", \"Badc\"),\n", " ],\n", " consequence=[(\"decision\", \"Reject\")],\n", " )\n", "]\n", "\n", "print(rules[0])\n", "print()\n", "print(rules[1])" ] }, { "source": [ "## Inference system specification and computations\n", "\n", "Finally, the fuzzy inference system is specified. The model is used to evaluate the following crisp values for the input variables: `score=190`, `ratio=0.39`, and `credit=1.5`. The model returns a dictionary with the values of the variables in the consequence of the rules and the certainty factor of the conclusion." ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 5, "id": "04a10e39-ec50-42ad-99f8-2417b482f068", "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "({'decision': 8.010492631084489}, 1.0)" ] }, "metadata": {}, "execution_count": 5 } ], "source": [ "from fuzzy_expert.inference import DecompositionalInference\n", "\n", "model = DecompositionalInference(\n", " and_operator=\"min\",\n", " or_operator=\"max\",\n", " implication_operator=\"Rc\",\n", " composition_operator=\"max-min\",\n", " production_link=\"max\",\n", " defuzzification_operator=\"cog\",\n", ")\n", "\n", "model(\n", " variables=variables,\n", " rules=rules,\n", " score=190,\n", " ratio=0.39,\n", " credit=1.5,\n", ")" ] }, { "source": [ "## Visualization of the results\n", "\n", "The function plot can be used to obtain a graphical represntation of the results of the inference systems. It uses the same parameters used to the evaluation of the system.\n" ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n \n \n \n \n 2021-06-24T19:55:35.875459\n image/svg+xml\n \n \n Matplotlib v3.4.2, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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+/aRaNdffz2LFi1izZo1vqNIkjn33HN54oknOHjwoO8oIqH2yCOPMHToUBo1auQ7SsKpUEtR48eP54wzzqBmzZq+o6S82rVrM3LkSO69917fUSTJ9OnTh23btjFv3jzfUURCq6CggIkTJ3LTTTf5juKFCrUUtGvXLp588kny8vKoVq2a7zhp4aabbuK5555j2zad61nKLiMjgzPPPJNx48bhdD1YkWLNnTuXpk2b0qtXL99RvFChloKmT59Ojx49aNiwoQ4iSJDjjjuOK6+8kgceeMB3FEkyAwYM4O233+azzz7zHUUklMaPH8+oUel7ulYVaimmsLCQsWPHkpeXp4MIEuzWW29lypQp7Nq1y3cUSSL169cnJyeHsWPH+o4iEjqfffYZH3/8MRdffLHvKN6oUEsxCxcuBODEE09Ua1qCtWrVivPOO48HH3zQdxRJMoMGDWLWrFkq8kWKmDhxIsOHDycrK8t3FG9UqKWYcePGcdppp1GjRg3fUdLSbbfdxgMPPMD+/ft9R5Ek0qlTJ6pVq8b06dN9RxEJjd27d/P4449zww03lD5zClOhlkK++OIL3njjDXr16kVGRqmXcZU46NatG71792batGm+o0gSMTP69+/P1KlTOXLkiO84IqHw2GOPcdZZZ9GiRQvfUbxSoZZCHnzwQU4//XRq1arlO0paGzNmDH/961/1gSvl0q9fP9asWcMbb7zhO4qId845xo8fn3bX9SyOCrUUsX//fh555BHy8vLSui8/DE477TSaNm3KjBkzfEeRJJKdnc3pp5/O/fffr1N1SNpbvHgxVapU4V/+5V98R/FOhVqKeOaZZzjxxBM54YQTdBBBCIwZM4a7774bfdxKeQwYMIBFixaxadMm31FEvDramqbPMxVqKcE5xwMPPECfPn10EEFInHfeeRQUFPCq7yCSVJo0aULr1q0ZP3687ygi3mzatInXXnuNK6+80neUUFChlgLee+89vv32Wzp37kyVKvqThoGZRVrVfAeRpDNo0CCeffZZ9u7d6zuKiBcPPfQQV111lcZbB3RoYAoYN24c/fr1U2taYPPmzezevdt3DLp3784XwLtAH89ZJHn06NGDRx99lOeee45rr73WdxyRhDpw4ABTpkxh+vTpfPrpp95yNG7cmPr163tbfzQVaknu66+/Zu7cudxxxx26rmfgzTffZOfOnaFoXfwNcA/w3JEjOmWKlEmVKlU455xzmDx5MldddRVVq1b1HUkkYZ599llat27Nhg0b+PLLL71kOHToELm5ueTm5npZf1H65Ehy06ZNIzc3l7p16/qOEhrOOWrUqBGKwnUo8Edg3rx5nH/++b7jSJL42c9+xs0338yyZctC82Ehkghjx46lb9++1K1b19uX7T179nhZb0n8NzlIpbz00kt06tSJ7Oxs31GkGDWAYaBTdUi51KpVi549ezJlyhTfUUQS5rPPPmPTpk106dIlFD0iYaFXIokdPHiQpUuX0q5dOx3CHGK1Cd83NAm/Pn368Prrr+tyZJI2Zs2axUknnaSGhyJUqCWxd999l+bNm1O7dm3fUeQYqhMpqkXKo3v37mzatImPPvrIdxSRhJg5cyY5OTlkZmb6jhIqKtSS2KJFizjxxBO1U4dcdSKDUwsLC31HkSSSmZlJly5dePrpp31HEYm7zZs3s3btWjp06KAeoiJUqCWx+fPn06FDBx0VFnLVgcOHD1NQUOA7iiSZ3NxcFi9ezKFDh3xHEYmr2bNnq9uzBCrUktS+fftYsWIFbdu29R1FSnG0RU2FmpTXySefzOeff86aNWt8RxGJq/z8fDp37qxrVRdDhVqSevvtt2ndurXO3JwE1KImFVWzZk3atm3LM8884zuKSNx89913LF26lJycHHV7FkOFWpLS+LTkoUJNKiM3N5dXX31V+4+krLlz59KtWzeqV6/uO0ooqVBLUgsWLND4tCShQk0q45RTTmHlypVs3LjRdxSRuJg5c6bOB3oMKtSS0O7du1m1ahVt2rTxHUXKQIWaVEb9+vVp3Lgxs2bN8h1FJOb27t3LokWL6N69u05yWwK9KknozTffpF27droIe5LQwQRSWaeccgpz587VKV4k5cybN4/27dtrvPUxqFBLQosWLaJt27Y6OiZJHC3Ujhw54juKJKm8vDyWL1/O119/7TuKSEzNmjWLnJwcdXsegwq1JHR0fJqaiZODuj6lsho3bkytWrWYO3eu7ygiMXP48GHmzp1L9+7dNd76GPRJn2R27tzJ559/TqtWrXxHkTJS16fEwimnnMLs2bNxzvmOIhITr732Gk2aNKF+/fq+o4RamQo1MxtoZv8ws7VmNqaY5681s2/MbEVwGx77qALw+uuv06FDBx3GnETUoiaxkJuby9KlS9mx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uXNnjjvuOH2eBeJVL2WUYd25wFrn3PogyNPAUOCTqHmGAncE92cA483MXDkPMZo/f37Knuvnrbfe4sCBA+Tm5urbR5rKzs5m165dvPLKKzRq1Mh3nNCpVq0aAwYM8B0jpZ1xxhk899xzTJgwgXbt2vmOExft27enQ4cOvmPwz3/+k7ffftt3jLi5//77GTRokE7J8WNxqZfKUqg1A76MerwZyCtpHufcETPbBTQEvo2eycxGACMAJk2axIgRI360kLFjx7J58+YyREo+VatW5eKLL6ZKlSrezk7/8JQpkTsxXn9BQQG1atWK6TIro1q1auzZsycURX/0a169enWaN2/O/fff7zVTWGVnZ9O8eXNycop+AU28KlWqUFBQUOH/1Xj9r8XCBRdcwN///veUbQU57bTTGD9+vO8YbN++nT/84Q8pezqe5s2b07ZtW/bv3+87SswVFBQUe6Wg6BomMNk5NznqcczqpR+tt7RGLzO7CBjonBsePL4KyHPOjY6aZ1Uwz+bg8bpgnhJXDPxkxUeOHGHDhg3HzJPMatSokbJXIMjOzi5u3F0iPgl+sh/t3buXAwcOJGDV5Xfw4EFdRuoY2rRpQ0bGT74/xns/+sk+VFhYyM6dO1P2vGO7du2ioKDAd4y4qFmzJk2bNi3uqYTvR7t27WL79u1xXq0/9erVS9lLH9auXbu43q9j7kPxqpfK0qK2BWgR9bh5MK24eTabWQZQFyj3VYAzMjJo3759eX9N5Edq1qypgzWkUqpUqUKDBg18x4ibhg0b+o6QFurWrUvdunV9x5DEiUu9VJZSeCnQ3szamFkmcBkwp8g8c4BrgvsXAYvKOz5NREREJInFpV4qtUUt6EMdDcwDqgJTnXOrzewu4APn3BzgEeAxM1sLfBeEExEREUkL8aqXSh2jFi933nnnK4AOfUtt395+++0D47kC7UdpIa77kfahtKH9SCor7p9pxfFWqImIiIjIsaXm4RoiIiIiKUCFmoiIiEhIqVATERERCSkVaiIiIiIhpUJNREREJKRUqImIiIiElAo1ERERkZBSoSYiIiISUirUREREREJKhZqIiIhISKlQExEREQkpFWoiIiIiIaVCTURERCSkVKiJiIiIhJQKNREREZGQUqEmIiIiElIq1ERERERCKsPjup3HdUtiWALWof0o9cV7P9I+lB60H0llJeIz7SdKbVEzs6lmtt3MVpXwvJnZWDNba2Yfm9nJsY8pIiIiEl7xqpfK0vX5KDDwGM8PAtoHtxHAg2VZsYiIiEgKeZQ41Euldn065143s9bHmGUoMN0554B3zayemTVxzm0rS4BoTz75JAcOHCjTvDVq1OCiiy4iI8Nn761Iclq4cCEbN270HeNHMjMzufLKK33HkARYv349S5YsicuyTzrpJE466aS4LLs8tm/fzty5c+Oy7Pbt29OvX7+4LFsqLl71UiyqnGbAl1GPNwfTfrJiMxtBpIpk0qRJjBgx4kfPv//++3z//fdlWun777/P1q1bueWWWyoYOw1Z0L3uNJQiYUL4mk+dOpXbb7+d/v37+47yIzVr1kydQi2Ef/cwufrqq2nYsCENGzaM+bIbNmwYikJtz549vPnmm3FZ9q233sqaNWto1KhRXJYvxYuuYQKTnXOTy7GIMtdL0RLaHBVs0NGN+sk72P3331/mZa1Zs4a+ffvy85//nFatWsUmoEiKmzFjBv/1X//FkiVL6NChg+84koZWrFjBxo0bWbJkSUr3iLRt25apU6fGZdnOOR555BH+8z//My7Ll+IVqWESJhan59gCtIh63DyYFlft27fn5ptvZvTo0Th9axUp1bx58xg1ahQvvfSSijTxZsKECYwcOTKli7R4GzVqFA8++CAFBQW+o0j5VKheikWhNge4OjiaoQ+wqyLj0yritttuY926deTn5ydidSJJ66233uKqq64iPz+fnj17+o4jaeq7775jxowZDB8+3HeUpNa7d2+aNGkStzFwEjcVqpfKcnqOp4B3gI5mttnMrjOzG8zshmCWl4D1wFpgCnBjhTehnDIzM5k0aRL//u//zq5duxK1WpGksmLFCi688EIee+wxTjvtNN9xJI1NnTqVCy64gOOPP953lKQ3evRoxo8f7zuGRIlXvWQeuw1jtuLrr7+e7Oxsxo0bF6tFpqbED3DWCW89Dyr//PPPOfPMMxk7diwXXXSRlwwxkHwnKtXBBD9RUFBA+/bteeqpp8jLy/MRIfn2o2M4ePAgrVq1YvHixXTu3DmRq05n4TzhbTK45557mDFjBu+//77vKCKhsWnTJvr378+f/vSnZC7SJEW8/PLLNGzY0FeRlnKysrIYPnw4EydO9B1F4iwlWtQAnnjiCf7617+ydOlSqlWrFstFpw61qCWep5aV7du3069fP0aOHMnNN9+c0HXHQfK1hKhF7ScGDhzI5ZdfzjXXXOMrQvLtR6X48ssv6dGjBxs3bqR27dqJXn06UotaZfziF7/g+OOP54EHHvAdRcSrnTt3cu6553LZZZelQpEmKWDNmjUsX76cSy+91HeUlNKiRQvOOussHnvsMd9RJI5SpkUNYN26deTl5fHBBx/QunXrWC8++alFLfES/Jrv3buXc889l169enH//fdj5uULYKwlX0uIWtR+5D/+4z/Izs7mz3/+s88YybcflcGSJUu48cYbWb16dar8v4eZlxc4pQo1gP/5n//hrbfeYu7cudppi1KhlngJfM0PHjzIkCFDaNKkCVOnTqVKlZRpME++D1gVaj/Ys2cPrVq1Yvny5b5PTp58+1FZVuoc3bp144EHHuDss8/2ESGdqOszFn7zm9+wceNGZsyY4TuKSMIUFBRw5ZVXUrNmTR5++OFUKtIkyT3xxBOcccYZvou0lGVmjB49mgkTJviOInGSci1qEDm55yWXXMInn3xC3bp147Wa5KMWtcRLwGvunOP6669n48aNzJ07l6ysrLity5PkawlRixoQ2Te7d+/O/fffH4bWnuTbj8roaKvlhx9+SMuWLX3FSAdqUYuV0047jcGDB/Pb3/7WdxSRuHLOceutt7J69WpmzZqVikWaJLHXX3+dI0eOcNZZZ/mOktJq1arFVVddxUMPPeQ7isRBSraoAfzzn/+kS5cuzJw5k759+8ZzVclDLWqJF+fX/I9//CPPPfccr732GvXr14/LOkIg+VpC1KIGwMUXX8yZZ57JqFGjfEeBZNyPyuHzzz+nX79+bNy4kezsbJ9RUpla1GKpfv36/O1vf+NXv/oVhw8f9h1HJObGjh3L9OnTefXVV1O5SJMktXnzZhYuXMjVV1/tO0pa6NChAyeddBLPPPOM7ygSYylbqAFceumlNG3alL/97W++o4jE1LRp07j33ntZsGABjRs39h1H5CcmTZrEL37xC52INYFGjRqlgwpSUMp2fR61fv16TjnlFD744APatGmTiFWGl7o+Ey8Or/msWbO48cYbWbRoUbpc4y/5uqzSvOszpNehTL79qJwKCgpo164dzzzzDLm5ub7jpCJ1fcZD27ZtGTlyJPfee6/vKCKVtmDBAn71q1/x4osvhukDUORHZs6cSZcuXbSPJljV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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "plt.figure(figsize=(10, 6))\n", "model.plot(\n", " variables=variables,\n", " rules=rules,\n", " score=190,\n", " ratio=0.39,\n", " credit=1.5,\n", ")" ] }, { "source": [ "## User interaction\n", "\n", "Using the `ipywidgets` package in Jupyter Lab it is possible to obtain an interactive user interface for the user. The funtion `demo` is used to plot the results; following, the function `interact` is used to create the user interface." ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 7, "id": "1e33494a-2c04-4abd-9aa6-cdf830a99daa", "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "interactive(children=(FloatSlider(value=150.0, description='score', max=200.0, min=150.0), FloatSlider(value=0…", "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, "model_id": "a46273b1ed084c01837fe20fd13a1647" } }, "metadata": {} }, { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 7 } ], "source": [ "from ipywidgets import interact, widgets\n", "\n", "def demo(score, ratio, credit):\n", " plt.figure(figsize=(10,6)) \n", " model.plot(\n", " variables=variables,\n", " rules=rules,\n", " score=score,\n", " ratio=ratio,\n", " credit=credit,\n", " )\n", "\n", "interact(\n", " demo, \n", " score=widgets.FloatSlider(min=150, max=200),\n", " ratio=widgets.FloatSlider(min=0.1, max=1),\n", " credit=widgets.FloatSlider(min=0, max=10),\n", ")" ] }, { "source": [ "![inter](interact.png)" ], "cell_type": "markdown", "metadata": {} } ], "metadata": { "kernelspec": { "name": "python3", "display_name": "Python 3.9.5 64-bit" }, "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.5" }, "interpreter": { "hash": "4cd7ab41f5fca4b9b44701077e38c5ffd31fe66a6cab21e0214b68d958d0e462" } }, "nbformat": 4, "nbformat_minor": 5 }