|
6 | 6 | "metadata": {}, |
7 | 7 | "outputs": [], |
8 | 8 | "source": [ |
9 | | - "%%writefile fuzzy/rules.py\n", |
| 9 | + "%%writefile fuzzylogic/rules.py\n", |
10 | 10 | "\"\"\"Functions to evaluate, infer and defuzzify.\"\"\"\n", |
11 | 11 | "\n", |
12 | 12 | "from math import isinf\n", |
|
94 | 94 | "metadata": {}, |
95 | 95 | "outputs": [], |
96 | 96 | "source": [ |
97 | | - "%%writefile fuzzy/hedges.py\n", |
| 97 | + "%%writefile fuzzylogic/hedges.py\n", |
98 | 98 | "\n", |
99 | 99 | "\"\"\"\n", |
100 | 100 | "Lingual hedges modify curves of membership values.\n", |
|
134 | 134 | }, |
135 | 135 | { |
136 | 136 | "cell_type": "code", |
137 | | - "execution_count": 13, |
| 137 | + "execution_count": 11, |
138 | 138 | "metadata": {}, |
139 | 139 | "outputs": [ |
140 | 140 | { |
141 | 141 | "name": "stdout", |
142 | 142 | "output_type": "stream", |
143 | 143 | "text": [ |
144 | | - "Overwriting fuzzy/combinators.py\n" |
| 144 | + "Overwriting fuzzylogic/combinators.py\n" |
145 | 145 | ] |
146 | 146 | } |
147 | 147 | ], |
148 | 148 | "source": [ |
149 | | - "%%writefile fuzzy/combinators.py\n", |
| 149 | + "%%writefile fuzzylogic/combinators.py\n", |
150 | 150 | "\n", |
151 | 151 | "\"\"\"\n", |
152 | 152 | "Combine two linguistic terms.\n", |
|
165 | 165 | "from functools import reduce\n", |
166 | 166 | "from numpy import multiply\n", |
167 | 167 | "\n", |
168 | | - "from fuzzy.functions import noop\n", |
| 168 | + "from .functions import noop\n", |
169 | 169 | "\n", |
170 | 170 | "\n", |
171 | 171 | "\n", |
|
351 | 351 | "metadata": {}, |
352 | 352 | "outputs": [], |
353 | 353 | "source": [ |
354 | | - "%%writefile fuzzy/classes.py\n", |
| 354 | + "%%writefile fuzzylogic/classes.py\n", |
355 | 355 | "\n", |
356 | 356 | "\"\"\"\n", |
357 | 357 | "Domain and Set classes for fuzzy logic.\n", |
|
730 | 730 | }, |
731 | 731 | { |
732 | 732 | "cell_type": "code", |
733 | | - "execution_count": null, |
| 733 | + "execution_count": 6, |
734 | 734 | "metadata": { |
735 | 735 | "scrolled": true |
736 | 736 | }, |
737 | | - "outputs": [], |
| 737 | + "outputs": [ |
| 738 | + { |
| 739 | + "data": { |
| 740 | + "text/plain": [ |
| 741 | + "6.9" |
| 742 | + ] |
| 743 | + }, |
| 744 | + "execution_count": 6, |
| 745 | + "metadata": {}, |
| 746 | + "output_type": "execute_result" |
| 747 | + } |
| 748 | + ], |
738 | 749 | "source": [ |
739 | 750 | "%matplotlib inline\n", |
740 | 751 | "\n", |
741 | | - "from fuzzy.classes import Domain, Set\n", |
742 | | - "from fuzzy.functions import bounded_linear\n", |
743 | | - "from fuzzy.rules import rescale, round_partial\n", |
| 752 | + "from fuzzylogic.classes import Domain, Set\n", |
| 753 | + "from fuzzylogic.functions import bounded_linear\n", |
| 754 | + "from fuzzylogic.rules import rescale, round_partial\n", |
744 | 755 | "\n", |
745 | 756 | "rating = Domain(\"ratings\", 1, 10, res=0.1)\n", |
746 | 757 | "rating.norm = Set(bounded_linear(1,10))\n", |
|
774 | 785 | "metadata": {}, |
775 | 786 | "outputs": [], |
776 | 787 | "source": [ |
777 | | - "%%writefile fuzzy/truth.py\n", |
| 788 | + "%%writefile fuzzylogic/truth.py\n", |
778 | 789 | "\n", |
779 | 790 | "\"\"\"\n", |
780 | 791 | "Functions that transform a given membership value to a truth value.\n", |
|
812 | 823 | }, |
813 | 824 | { |
814 | 825 | "cell_type": "code", |
815 | | - "execution_count": null, |
| 826 | + "execution_count": 7, |
816 | 827 | "metadata": {}, |
817 | | - "outputs": [], |
| 828 | + "outputs": [ |
| 829 | + { |
| 830 | + "data": { |
| 831 | + "image/png": "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\n", |
| 832 | + "text/plain": [ |
| 833 | + "<Figure size 432x288 with 1 Axes>" |
| 834 | + ] |
| 835 | + }, |
| 836 | + "metadata": { |
| 837 | + "needs_background": "light" |
| 838 | + }, |
| 839 | + "output_type": "display_data" |
| 840 | + } |
| 841 | + ], |
818 | 842 | "source": [ |
819 | 843 | "%matplotlib inline\n", |
820 | 844 | "\n", |
821 | | - "from fuzzy.classes import Domain, Set\n", |
822 | | - "from fuzzy.functions import R, S, bounded_sigmoid\n", |
| 845 | + "from fuzzylogic.classes import Domain, Set\n", |
| 846 | + "from fuzzylogic.functions import R, S, bounded_sigmoid\n", |
823 | 847 | "\n", |
824 | 848 | "dist = Domain(\"distance\", 0, 1000, res=0.1)\n", |
825 | 849 | "dist.close = Set(bounded_sigmoid(3, 10, inverse=True))\n", |
|
829 | 853 | }, |
830 | 854 | { |
831 | 855 | "cell_type": "code", |
832 | | - "execution_count": 2, |
| 856 | + "execution_count": 8, |
833 | 857 | "metadata": {}, |
834 | 858 | "outputs": [ |
835 | 859 | { |
836 | 860 | "name": "stdout", |
837 | 861 | "output_type": "stream", |
838 | 862 | "text": [ |
839 | | - "Overwriting fuzzy/functions.py\n" |
| 863 | + "Overwriting fuzzylogic/functions.py\n" |
840 | 864 | ] |
841 | 865 | } |
842 | 866 | ], |
843 | 867 | "source": [ |
844 | | - "%%writefile fuzzy/functions.py\n", |
| 868 | + "%%writefile fuzzylogic/functions.py\n", |
845 | 869 | "\n", |
846 | 870 | "\"\"\"\n", |
847 | 871 | "General-purpose functions that map R -> [0,1].\n", |
|
1271 | 1295 | " return 1 / (1 + 9 * r)\n", |
1272 | 1296 | " return f\n", |
1273 | 1297 | "\n", |
| 1298 | + "def bounded_exponential(k=0.1, limit=1):\n", |
| 1299 | + " \"\"\"Function that goes through the origin and approaches a limit.\n", |
| 1300 | + " k determines the steepness. The function defined for [0, +inf).\n", |
| 1301 | + " Useful for things that can't be below 0 but may not have a limit like temperature\n", |
| 1302 | + " or time, so values are always defined.\n", |
| 1303 | + " f(x)=limit-limit/e^(k*x)\n", |
| 1304 | + "\n", |
| 1305 | + " Again: This function assumes x >= 0, there are no checks for this assumption!\n", |
| 1306 | + " \"\"\"\n", |
| 1307 | + " assert limit > 0\n", |
| 1308 | + " assert k > 0\n", |
| 1309 | + " def f(x):\n", |
| 1310 | + " return limit - limit/exp(k*x)\n", |
| 1311 | + " return f\n", |
1274 | 1312 | "\n", |
1275 | 1313 | "def simple_sigmoid(k=0.229756):\n", |
1276 | 1314 | " \"\"\"Sigmoid variant with only one parameter (steepness).\n", |
|
1377 | 1415 | "name": "python", |
1378 | 1416 | "nbconvert_exporter": "python", |
1379 | 1417 | "pygments_lexer": "ipython3", |
1380 | | - "version": "3.7.0" |
| 1418 | + "version": "3.7.3" |
1381 | 1419 | } |
1382 | 1420 | }, |
1383 | 1421 | "nbformat": 4, |
|
0 commit comments