GitHub_collection_pykan/tutorials/Example_9_singularity.ipynb
2024-08-11 13:02:16 -04:00

465 lines
40 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "134e7f9d",
"metadata": {},
"source": [
"# Example 9: Singularity"
]
},
{
"cell_type": "markdown",
"id": "2571d531",
"metadata": {},
"source": [
"Let's construct a dataset which contains singularity $f(x,y)=sin(log(x)+log(y))\n",
" (x>0,y>0)$"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "2075ef56",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"checkpoint directory created: ./model\n",
"saving model version 0.0\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"| train_loss: 2.89e-02 | test_loss: 3.78e-02 | reg: 6.39e+00 | : 100%|█| 20/20 [00:02<00:00, 7.05it"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.1\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"from kan import *\n",
"import torch\n",
"\n",
"# create a KAN: 2D inputs, 1D output, and 5 hidden neurons. cubic spline (k=3), 5 grid intervals (grid=5).\n",
"model = KAN(width=[2,1,1], grid=5, k=3, seed=2)\n",
"f = lambda x: torch.sin(2*(torch.log(x[:,[0]])+torch.log(x[:,[1]])))\n",
"dataset = create_dataset(f, n_var=2, ranges=[0.2,5])\n",
"\n",
"# train the model\n",
"model.fit(dataset, opt=\"LBFGS\", steps=20);"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "3f95fcdd",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 500x400 with 6 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"model.plot()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "ccb7ec43",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Best value at boundary.\n",
"r2 is 0.999884843826294\n",
"saving model version 0.2\n",
"Best value at boundary.\n",
"r2 is 0.9998899102210999\n",
"saving model version 0.3\n",
"r2 is 0.9975605010986328\n",
"saving model version 0.4\n"
]
},
{
"data": {
"text/plain": [
"tensor(0.9976)"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.fix_symbolic(0,0,0,'log')\n",
"model.fix_symbolic(0,1,0,'log')\n",
"model.fix_symbolic(1,0,0,'sin')"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "0937db67",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"| train_loss: 2.95e-07 | test_loss: 2.91e-07 | reg: 0.00e+00 | : 100%|█| 20/20 [00:01<00:00, 15.68it"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.5\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"model.fit(dataset, opt=\"LBFGS\", steps=20);"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "e959cda3",
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"$\\displaystyle 1.0 \\sin{\\left(2.0 \\log{\\left(9.993 x_{1} \\right)} + 2.0 \\log{\\left(10.0 x_{2} \\right)} - 9.209 \\right)}$"
],
"text/plain": [
"1.0*sin(2.0*log(9.993*x_1) + 2.0*log(10.0*x_2) - 9.209)"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ex_round(model.symbolic_formula()[0][0], 3)"
]
},
{
"cell_type": "markdown",
"id": "16e4da06",
"metadata": {},
"source": [
"We were lucky -- singularity does not seem to be a problem in this case. But let's instead consider $f(x,y)=\\sqrt{x^2+y^2}$. $x=y=0$ is a singularity point."
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "1ce52cec",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"checkpoint directory created: ./model\n",
"saving model version 0.0\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"| train_loss: 5.17e-03 | test_loss: 5.45e-03 | reg: 5.66e+00 | : 100%|█| 20/20 [00:02<00:00, 7.44it"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.1\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"from kan import *\n",
"import torch\n",
"\n",
"# create a KAN: 2D inputs, 1D output, and 5 hidden neurons. cubic spline (k=3), 5 grid intervals (grid=5).\n",
"model = KAN(width=[2,1,1], grid=5, k=3, seed=0)\n",
"f = lambda x: torch.sqrt(x[:,[0]]**2+x[:,[1]]**2)\n",
"dataset = create_dataset(f, n_var=2)\n",
"\n",
"# train the model\n",
"model.fit(dataset, opt=\"LBFGS\", steps=20);"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "3a69ec41",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 500x400 with 6 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"model.plot()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "abef7aa9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"r2 is 0.9999783635139465\n",
"saving model version 0.2\n",
"r2 is 0.9999676942825317\n",
"saving model version 0.3\n",
"r2 is 0.9997884631156921\n",
"saving model version 0.4\n"
]
},
{
"data": {
"text/plain": [
"tensor(0.9998)"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.fix_symbolic(0,0,0,'x^2')\n",
"model.fix_symbolic(0,1,0,'x^2')\n",
"model.fix_symbolic(1,0,0,'sqrt')"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "aa71848c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"rewind to model version 1.4, renamed as 2.4\n"
]
}
],
"source": [
"model = model.rewind('0.4')\n",
"model.get_act(dataset)"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "e14000d8",
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"$\\displaystyle 1.01334547419162 \\sqrt{0.999861446076389 \\left(7.53297050423062 \\cdot 10^{-5} - x_{2}\\right)^{2} + \\left(0.000104069324734005 - x_{1}\\right)^{2} + 0.00834810636784406} - 0.0170296430587769$"
],
"text/plain": [
"1.01334547419162*sqrt(0.999861446076389*(7.53297050423062e-5 - x_2)**2 + (0.000104069324734005 - x_1)**2 + 0.00834810636784406) - 0.0170296430587769"
]
},
"execution_count": 47,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"formula = model.symbolic_formula()[0][0]\n",
"formula"
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "c56ee3d5",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/latex": [
"$\\displaystyle 1.01 \\sqrt{x_{1}^{2} + 1.0 x_{2}^{2} + 0.01} - 0.02$"
],
"text/plain": [
"1.01*sqrt(x_1**2 + 1.0*x_2**2 + 0.01) - 0.02"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ex_round(formula, 2)"
]
},
{
"cell_type": "markdown",
"id": "1fd57d41",
"metadata": {},
"source": [
"w/ singularity avoiding (LBFGS may still get nan because of line search, but Adam won't get nan)."
]
},
{
"cell_type": "code",
"execution_count": 49,
"id": "de708f21",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"| train_loss: 1.09e-07 | test_loss: 1.48e-07 | reg: 0.00e+00 | : 100%|█| 1000/1000 [00:12<00:00, 83.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 1.5\n"
]
}
],
"source": [
"model.fit(dataset, opt=\"Adam\", steps=1000, lr=1e-3, update_grid=False, singularity_avoiding=True);"
]
},
{
"cell_type": "markdown",
"id": "6fd34c4c",
"metadata": {},
"source": [
"w/o singularity avoiding, nan may appear"
]
},
{
"cell_type": "code",
"execution_count": 50,
"id": "031fabd6",
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"| train_loss: nan | test_loss: nan | reg: nan | : 100%|█████████| 1000/1000 [00:11<00:00, 84.83it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 1.6\n"
]
}
],
"source": [
"model.fit(dataset, opt=\"Adam\", steps=1000, lr=1e-3, update_grid=False);"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "124c9ca4",
"metadata": {},
"outputs": [],
"source": []
}
],
"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.9.7"
}
},
"nbformat": 4,
"nbformat_minor": 5
}