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

453 lines
145 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "134e7f9d",
"metadata": {},
"source": [
"# Example 3: Deep Formulas\n",
"\n",
"The orignal Kolmogorov-Arnold theorem says that it suffices to have 2-Layer function composition (inner and outer functions), but the functions might be non-smooth or even fractal. We generalize KA representation to arbitrary depths. An example a 2-Layer KAN (with smooth activations) is unable to do is: $f(x_1,x_2,x_3,x_4)={\\rm exp}({\\rm sin}(x_1^2+x_2^2)+{\\rm sin}(x_3^2+x_4^2))$, which requires at least 3-Layer KANs."
]
},
{
"cell_type": "markdown",
"id": "7854503c",
"metadata": {},
"source": [
"### Three-layer KAN"
]
},
{
"cell_type": "code",
"execution_count": 6,
"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.43e-02 | test_loss: 2.57e-02 | reg: 1.09e+01 | : 100%|█| 20/20 [00:17<00:00, 1.12it"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.1\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"from kan import *\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=[4,2,1,1], grid=3, k=3, seed=1)\n",
"f = lambda x: torch.exp((torch.sin(torch.pi*(x[:,[0]]**2+x[:,[1]]**2))+torch.sin(torch.pi*(x[:,[2]]**2+x[:,[3]]**2)))/2)\n",
"dataset = create_dataset(f, n_var=4, train_num=3000)\n",
"\n",
"# train the model\n",
"model.fit(dataset, opt=\"LBFGS\", steps=20, lamb=0.002, lamb_entropy=2.);"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "d81e80f7",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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ceMG1q5di08++QRZWVnYsWMHpk+ffkvvJCYmJucYi6+vL9q3b3/LcRWLxYItW7bA09MTly5dQq1atXhJGCrTOFuMyiSr1YpvvvkGffv2RbVq1fD666+jcuXKaNCgAVavXo2zZ88WeUqxiODgwYPYtWsX0tLS0Lp1azRo0AAffvghLl++bOd3QuScGC5Upvz3v//F2LFjUatWLXTs2BFHjx7F5MmTERsbi127dmHOnDlITk5GZGQkbt68WWjAiAji4+MxZswY3H///fjzzz+xfft2PPjgg3jnnXdQs2ZNPPPMM1i9ejXS09Md9C6JnIAQublr167Jxx9/LA8//LAAkLvuukuGDBkiBw8eFFVVb3muxWKRd999V7y9vaV3794SGxsrqqrK+fPn5f7775fg4GBp0aKFJCcni6qq8vvvv0v79u2levXq8sMPP9yyrKSkJPn000+lZcuWAkAqVqwor732mvz444+3rZfI3fDaYuSWLBYLduzYgejoaGzatAlWqxVPP/00wsPD0bVrV3h5eRX42szMTEyfPh0zZ87EPffcgyFDhqBDhw7w8vKC0WiE1WpFamoqNm7ciEWLFsHT0xOffvop2rVrV+Ay//jjDyxfvhzLly9HbGwswsLCYDKZMGDAANxzzz32+AiIdMVwIbdy7NgxREdH44svvkBCQgIaNmwIk8mEfv36oVq1akVejtVqzTmwf+TIEfj4+CA4OBh+fn5ISUnB5cuXYTQa8dxzz2HcuHGoU6dOkZarqir27t2LqKgorFu3DhkZGWjbti1MJhO6d+8OPz+/kr51IqfCcCGXd+XKFaxcuRLR0dE4evQogoKC0LdvX4SHh6Nx48almrVlNptx+PBhfP/99zhz5gzS09MRGBiIRo0a4cknn0SdOnVgNBpLtOyUlBR89dVXiIqKwn/+8x/4+/vjhRdegMlkwmOPPcarK5NLY7iQS8rKysLWrVsRHR2NrVu3AgC6dOkCk8mETp06oVy5cnZZr4jYZYpxTExMzrDZuXPnULt2bbz00kt46aWXEBISovn6iOyN4UIuQ0Rw9OhRREVFYeXKlbh27RqaNm0Kk8mEPn36oHLlynqXWGqqqmL//v2IiorCl19+idTUVDz++OMwmUx44YUXUL58eb1LJCoShgs5vb/++guff/45oqOjceLECVStWhX9+/eHyWRCw4YN9S7P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\n",
"text/plain": [
"<Figure size 500x600 with 16 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"model.plot(beta=10)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "b8c880c1",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.2\n"
]
}
],
"source": [
"model = model.prune(edge_th=1e-2)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "585b699c",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 500x600 with 16 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"model.plot()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "ee39c97b",
"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.40e-03 | test_loss: 5.50e-03 | reg: 1.08e+01 | : 100%|█| 50/50 [00:38<00:00, 1.30it\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.1\n",
"checkpoint directory created: ./model\n",
"saving model version 0.0\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"| train_loss: 2.10e-03 | test_loss: 2.13e-03 | reg: 1.09e+01 | : 100%|█| 50/50 [00:40<00:00, 1.25it\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.1\n",
"checkpoint directory created: ./model\n",
"saving model version 0.0\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"| train_loss: 1.80e-04 | test_loss: 1.68e-04 | reg: 1.09e+01 | : 100%|█| 50/50 [01:01<00:00, 1.23s/\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.1\n",
"checkpoint directory created: ./model\n",
"saving model version 0.0\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"| train_loss: 3.95e-05 | test_loss: 2.68e-05 | reg: 1.09e+01 | : 100%|█| 50/50 [01:06<00:00, 1.33s/\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.1\n",
"checkpoint directory created: ./model\n",
"saving model version 0.0\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"| train_loss: 2.86e-05 | test_loss: 3.86e-05 | reg: 1.09e+01 | : 100%|█| 50/50 [01:00<00:00, 1.21s/"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.1\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"grids = [3,5,10,20,50]\n",
"#grids = [5]\n",
"\n",
"train_rmse = []\n",
"test_rmse = []\n",
"\n",
"for i in range(len(grids)):\n",
" model = KAN(width=[4,2,1,1], grid=grids[i], k=3, seed=0).initialize_from_another_model(model, dataset['train_input'])\n",
" results = model.fit(dataset, opt=\"LBFGS\", steps=50, stop_grid_update_step=20);\n",
" train_rmse.append(results['train_loss'][-1].item())\n",
" test_rmse.append(results['test_loss'][-1].item())"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "94f3930a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0.005403829738497734, 0.0020968744065612555, 0.00017952092457562685, 3.950050086132251e-05, 2.864087036869023e-05]\n",
"[0.005496920086443424, 0.0021260427311062813, 0.00016824221529532224, 2.6780631742440164e-05, 3.8571961340494454e-05]\n"
]
},
{
"data": {
"image/png": "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APj6+uLsrHHFIiLyl86dO7N37166du1KWloajz32GG+++aa9y5Jiku/wsmnTJnr37k2NGjUwDIPly5dfdczs2bOpW7cu7u7uhISEsHnz5jyf/8iRI3h5edGnTx+Cg4N544038luiiIiUAVWrVmX16tW8/vrrVK1alUGDBtm7JCkm+Q4vKSkpNG/enPfff/+ary9evJjRo0czadIkIiMj6dChAz179iQmJsZ2TEhICIGBgVc9zpw5Q1ZWFps3byY8PJyff/6ZdevWsW7duuvWk5GRQWJiYq6HiIiUDSaTiRdffJEjR45Qq1YtW/v27dt1G8mBGdZb+K9rGAbLli2jb9++trZWrVoRHBzMBx98YGtr0qQJffv2ZerUqTc9588//8yUKVNYvXo1ADNmzADg+eefv+bxkydPZsqUKVe1JyQk4O3tnZ+PIyIiDmDFihXcd9999O/fn7lz5+q7oJRITEzEx8cnT9/fhTrmJTMzk4iICLp165arvVu3bmzbti1P5wgLC+PcuXNcunQJi8XCpk2baNKkyXWPnzhxIgkJCbbHyZMnb+kziIhI6Xb69GmcnZ356quvCAkJITIy0t4lSSEr1PASFxeH2WzGz88vV7ufnx9nz57N0zmcnZ1544036NixI82aNaNBgwbce++91z3ezc0Nb2/vXA8RESm7nnrqKTZt2oS/vz9Hjx6ldevWhIeH6zaSAymSaTx/X7Y5v0s59+zZk549e+brmuHh4YSHh2M2m/N0vNlsJisrK1/XkBwuLi621S5FREqiNm3aEBkZyaOPPsqKFSt4+umn+emnn5g3bx4VKlSwd3lyiwo1vFSuXBknJ6erelnOnz9/VW9MYRs1ahSjRo2y3TO7HqvVytmzZ4mPjy/SehxdhQoVqFatmvYXEZESy9fXl+XLlzNr1izGjx/P0qVLGTRoEPfff7+9S5NbVKjhxdXVlZCQENatW5frD8e6deu47777CvNSBXY5uFStWhVPT099+eaT1WolNTWV8+fPA1C9enU7VyQicn2GYTB69GjatWvHqlWrFFwcRL7DS3JyMkePHrU9P3bsGFFRUfj6+uLv78+YMWMYMmQIoaGhtGnThg8//JCYmBhGjhxZqIX/XV5uG5nNZltwqVSpUpHW48g8PDyAnB61qlWr6haSiJR4YWFhhIWF2Z6fPXuWF198kbfeegtfX187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QERERK5bQBEREdc9z/bt2/nqq6/4+uuvSU5OJisrC29vb/7zn/8U+WcQEZGSpUGDBjRo0MD2/Ouvv2bWrFl8+eWX1KpVy46VXV/JjVXFLCUl5bqP9PT0PB+blpaWp2MLIiIiAnd3d/7xj3/g7e3N//73PwAyMjI4cOBArp6XG5k6dSonT57k+PHjvPXWW4wYMULBRUREyMzMZOzYsWzdupWgoCC+//57e5d0TQovf/Ly8rru48EHH8x1bNWqVa97bM+ePXMdW6dOnWseVxB79uyhWbNmuLq6cv/99/PNN98A8Msvv5CVlUVISEjBPryIiAjg6urKhg0bCA0N5eLFi/Tp04exY8eSmZlp79JyUXgpRSIiImy9Kw888AArV64kIyODiIgIfH19qVOnTr7POXz4cN56661CrlREREqrevXqsXXrVkaPHg3AO++8Q4cOHTh+/Lhd67pSiRvzcujQIfr165fr+Zdffknfvn2L9LrJycnXfc3JySnX8/Pnz1/32L8PcCrM/9iRkZEMHDgQgE6dOuHq6sqaNWvYs2cPLVq0KLTriIhI2ebq6srMmTPp1KkTw4cPZ+fOnbRo0YJDhw7la2ZrUSlx4aVRo0ZERUUBOYGiTp06dO3atcivW65cObsfeyO///478fHxtp4XZ2dnevfuzdKlS9m/fz933313oVxHRETksvvuu4+oqCj69+9P69atS0RwgRIYXq60YsUK7rrrrkILAKVZREQErq6uBAYG2toefPBBhgwZQmpqKuPHj7djdSIi4qhq167Npk2bsFqt9i7FJt9jXjZt2kTv3r2pUaMGhmGwfPnyq46ZPXs2devWxd3dnZCQEDZv3lyg4pYsWZLrFlJZtmfPHgIDA3F1dbW1de3aFbPZTGZmZp5nGomIiOSXi4tLru8fe8t3eElJSaF58+a8//7713x98eLFjB49mkmTJhEZGUmHDh3o2bMnMTExtmNCQkIIDAy86nHmzBnbMYmJiWzdulXL1/9p6tSpV63d4ubmRmJiIlarNdccfREREUeW79tGPXv2vGo68JXeeecdHn/8cf7xj38A8O6777JmzRo++OAD23L0N1pA7bLvvvuO7t274+7ufsPjMjIycq0km5iYmJePISIiIqVUoU6VzszMJCIigm7duuVq79atW76Xoc/rLaOpU6fi4+Nje5TU1QBFRESkcBRqeImLi8NsNuPn55er3c/Pj7Nnz+b5PAkJCezcuZPu3bvf9NiJEyeSkJBge5w8eTLfdYuIiEjpUSSzjf6+M6XVas3XbpU+Pj6cO3cuT8e6ubnh5uaWr/pERESk9CrUnpfKlSvj5OR0VS/L+fPnr+qNKWzh4eEEBAQQFhZWpNcRERER+yrU8OLq6kpISAjr1q3L1b5u3Tratm1bmJe6yqhRo4iOjmbXrl03PbYkzVUvrfQzFBERe8n3baPk5GSOHj1qe37s2DGioqLw9fXF39+fMWPGMGTIEEJDQ2nTpg0ffvghMTExjBw5slALLwgXFxcAUlNT8fDwsHM1pVtqairw189URESkuOQ7vOzevZvOnTvbno8ZMwaAYcOGsWDBAvr168eFCxd45ZVXiI2NJTAwkFWrVlG7du3Cq/oawsPDCQ8Px2w2X/cYJycnKlSoYNubyNPTM19jcSSnxyU1NZXz589ToUKFq/Z9EhERKWqG1cH6/xMTE/Hx8SEhIQFvb++rXrdarZw9e5b4+PjiL86BVKhQgWrVqin8iYhIobjZ9/eVSvTeRkXBMAyqV69O1apVycrKsnc5pZKLi4t6XERExG7KXHi5zMnJSV/AIiIipVChzjayJ02VFhERKRvK3JgXERERKXny8/3tMD0vIiIiUjY43JiXyx1J2l1aRESk9Lj8vZ2XG0IOF16SkpIAtLu0iIhIKZSUlISPj88Nj3G4MS8Wi4UzZ85Qvnz5665BEhYWlqdtBEqaklS3vWop6usW1fkL87y3cq7ExERq1arFyZMnNSaslCpJfw/YS2n9GZSkukvi3+FWq5WkpCRq1KiByXTjUS0O1/NiMpmoWbPmDY9xcnIqlX9xl6S67VVLUV+3qM5fmOctjHN5e3uXmD9Lkj8l6e8BeymtP4OSVHdJ/Tv8Zj0ul5XJAbujRo2ydwkFUpLqtlctRX3dojp/YZ63JP05kOKn//6l92dQkuou7X+HO9xtIxG5Pi0lICKOoEz2vIiUVW5ubrz88su4ubnZuxQRkQJTz4uIiIiUKup5ERERkVJF4UVERERKFYUXERERKVUUXkRERKRUUXgRERGRUkXhRUQAOHnyJJ06dSIgIIBmzZrx9ddf27skEZFr0lRpEQEgNjaWc+fOERQUxPnz5wkODubQoUOUK1fO3qWJiOTicHsbiUjBVK9enerVqwNQtWpVfH19uXjxosKLiJQ4um0k4iA2bdpE7969qVGjBoZhsHz58quOmT17NnXr1sXd3Z2QkBA2b958zXPt3r0bi8VCrVq1irhqEZH8U3gRcRApKSk0b96c999//5qvL168mNGjRzNp0iQiIyPp0KEDPXv2JCYmJtdxFy5cYOjQoXz44YfFUbaISL5pzIuIAzIMg2XLltG3b19bW6tWrQgODuaDDz6wtTVp0oS+ffsydepUADIyMujatSsjRoxgyJAhxV22iEieqOdFpAzIzMwkIiKCbt265Wrv1q0b27ZtA8BqtTJ8+HC6dOmi4CIiJZrCi0gZEBcXh9lsxs/PL1e7n58fZ8+eBWDr1q0sXryY5cuXExQURFBQEPv27bNHuSIiN6TZRiJliGEYuZ5brVZbW/v27bFYLPYoS0QkX9TzIlIGVK5cGScnJ1svy2Xnz5+/qjdGRKSkU3gRKQNcXV0JCQlh3bp1udrXrVtH27Zt7VSViEjB6LaRiINITk7m6NGjtufHjh0jKioKX19f/P39GTNmDEOGDCE0NJQ2bdrw4YcfEhMTw8iRI+1YtYhI/mmqtIiD2LBhA507d76qfdiwYSxYsADIWaRu+vTpxMbGEhgYyMyZM+nYsWMxVyoicmsUXkRERKRU0ZgXERERKVUUXkRERKRUUXgRERGRUkXhRUREREoVhRcREREpVRReREREpFRReBEREZFSReFFREREShWFFxERESlVFF5ERESkVFF4ERERkVJF4UVERERKlf8HJG/EXTfBtNQAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"n_params = np.array(grids) * (4*2+2*1+1*1)\n",
"plt.plot(n_params, train_rmse, marker=\"o\")\n",
"plt.plot(n_params, test_rmse, marker=\"o\")\n",
"plt.plot(n_params, 10000*n_params**(-4.), color=\"black\", ls=\"--\")\n",
"plt.legend(['train', 'test', r'$N^{-4}$'], loc=\"lower left\")\n",
"plt.xscale('log')\n",
"plt.yscale('log')\n",
"print(train_rmse)\n",
"print(test_rmse)"
]
},
{
"cell_type": "markdown",
"id": "f53644fe",
"metadata": {},
"source": [
"### Two-layer KAN\n",
"\n",
"Now we show that a 2 two-layer KAN performs much worse for this task"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "ae7b654b",
"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: 7.59e-02 | test_loss: 7.80e-02 | reg: 1.17e+01 | : 80%|▊| 16/20 [00:20<00:05, 1.25s/\n"
]
},
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/var/folders/6j/b6y80djd4nb5hl73rv3sv8y80000gn/T/ipykernel_75196/1574544268.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;31m# train the model\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdataset\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mopt\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"LBFGS\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msteps\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlamb\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.002\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlamb_entropy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m2.\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m;\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbeta\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/Desktop/2022/research/code/pykan/kan/MultKAN.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, dataset, opt, steps, log, lamb, lamb_l1, lamb_entropy, lamb_coef, lamb_coefdiff, update_grid, grid_update_num, loss_fn, entropy_offset, lr, start_grid_update_step, stop_grid_update_step, batch, metrics, save_fig, in_vars, out_vars, beta, save_fig_freq, img_folder, singularity_avoiding, y_th, reg_metric, display_metrics)\u001b[0m\n\u001b[1;32m 955\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 956\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mopt\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"LBFGS\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 957\u001b[0;31m \u001b[0moptimizer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclosure\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 958\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 959\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mopt\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"Adam\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/optim/optimizer.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 383\u001b[0m )\n\u001b[1;32m 384\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 385\u001b[0;31m \u001b[0mout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 386\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_optimizer_step_code\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 387\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/utils/_contextlib.py\u001b[0m in \u001b[0;36mdecorate_context\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 113\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdecorate_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 114\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mctx_factory\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 115\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdecorate_context\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/Desktop/2022/research/code/pykan/kan/LBFGS.py\u001b[0m in \u001b[0;36mstep\u001b[0;34m(self, closure)\u001b[0m\n\u001b[1;32m 441\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mobj_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 442\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_directional_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclosure\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 443\u001b[0;31m loss, flat_grad, t, ls_func_evals = _strong_wolfe(\n\u001b[0m\u001b[1;32m 444\u001b[0m obj_func, x_init, t, d, loss, flat_grad, gtd)\n\u001b[1;32m 445\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_grad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/Desktop/2022/research/code/pykan/kan/LBFGS.py\u001b[0m in \u001b[0;36m_strong_wolfe\u001b[0;34m(obj_func, x, t, d, f, g, gtd, c1, c2, tolerance_change, max_ls)\u001b[0m\n\u001b[1;32m 48\u001b[0m \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclone\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmemory_format\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontiguous_format\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 49\u001b[0m \u001b[0;31m# evaluate objective and gradient using initial step\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 50\u001b[0;31m \u001b[0mf_new\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg_new\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mobj_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 51\u001b[0m \u001b[0mls_func_evals\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 52\u001b[0m \u001b[0mgtd_new\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mg_new\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/Desktop/2022/research/code/pykan/kan/LBFGS.py\u001b[0m in \u001b[0;36mobj_func\u001b[0;34m(x, t, d)\u001b[0m\n\u001b[1;32m 440\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 441\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mobj_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 442\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_directional_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclosure\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 443\u001b[0m loss, flat_grad, t, ls_func_evals = _strong_wolfe(\n\u001b[1;32m 444\u001b[0m obj_func, x_init, t, d, loss, flat_grad, gtd)\n",
"\u001b[0;32m~/Desktop/2022/research/code/pykan/kan/LBFGS.py\u001b[0m in \u001b[0;36m_directional_evaluate\u001b[0;34m(self, closure, x, t, d)\u001b[0m\n\u001b[1;32m 289\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_directional_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclosure\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 290\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_grad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 291\u001b[0;31m \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclosure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 292\u001b[0m \u001b[0mflat_grad\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_gather_flat_grad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 293\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_set_param\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/utils/_contextlib.py\u001b[0m in \u001b[0;36mdecorate_context\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 113\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdecorate_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 114\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mctx_factory\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 115\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdecorate_context\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/Desktop/2022/research/code/pykan/kan/MultKAN.py\u001b[0m in \u001b[0;36mclosure\u001b[0;34m()\u001b[0m\n\u001b[1;32m 935\u001b[0m \u001b[0mreg_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtensor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0.\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 936\u001b[0m \u001b[0mobjective\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtrain_loss\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mlamb\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mreg_\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 937\u001b[0;31m \u001b[0mobjective\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbackward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 938\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mobjective\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 939\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/_tensor.py\u001b[0m in \u001b[0;36mbackward\u001b[0;34m(self, gradient, retain_graph, create_graph, inputs)\u001b[0m\n\u001b[1;32m 520\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 521\u001b[0m )\n\u001b[0;32m--> 522\u001b[0;31m torch.autograd.backward(\n\u001b[0m\u001b[1;32m 523\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgradient\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mretain_graph\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcreate_graph\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 524\u001b[0m )\n",
"\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/autograd/__init__.py\u001b[0m in \u001b[0;36mbackward\u001b[0;34m(tensors, grad_tensors, retain_graph, create_graph, grad_variables, inputs)\u001b[0m\n\u001b[1;32m 264\u001b[0m \u001b[0;31m# some Python versions print out the first line of a multi-line function\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 265\u001b[0m \u001b[0;31m# calls in the traceback and some print out the last line\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 266\u001b[0;31m Variable._execution_engine.run_backward( # Calls into the C++ engine to run the backward pass\n\u001b[0m\u001b[1;32m 267\u001b[0m \u001b[0mtensors\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 268\u001b[0m \u001b[0mgrad_tensors_\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mKeyboardInterrupt\u001b[0m: "
]
}
],
"source": [
"from kan import KAN, create_dataset\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=[4,9,1], grid=3, k=3, seed=0)\n",
"f = lambda x: torch.exp((torch.sin(torch.pi*(x[:,[0]]**2+x[:,[1]]**2))+torch.sin(torch.pi*(x[:,[2]]**2+x[:,[3]]**2)))/2)\n",
"dataset = create_dataset(f, n_var=4, train_num=3000)\n",
"\n",
"# train the model\n",
"model.fit(dataset, opt=\"LBFGS\", steps=20, lamb=0.002, lamb_entropy=2.);\n",
"model.plot(beta=10)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "869828f2",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"train loss: 3.59e-02 | test loss: 5.23e-02 | reg: 1.04e+01 : 100%|██| 50/50 [01:18<00:00, 1.57s/it]\n",
"train loss: 2.28e-02 | test loss: 3.10e-02 | reg: 1.04e+01 : 100%|██| 50/50 [01:25<00:00, 1.70s/it]\n",
"train loss: 8.34e-03 | test loss: 1.09e-02 | reg: 1.03e+01 : 100%|██| 50/50 [01:32<00:00, 1.86s/it]\n",
"train loss: 5.71e-03 | test loss: 1.06e-02 | reg: 9.86e+00 : 100%|██| 50/50 [01:45<00:00, 2.10s/it]\n",
"train loss: 1.03e-02 | test loss: 6.30e-02 | reg: 9.68e+00 : 100%|██| 50/50 [01:57<00:00, 2.36s/it]\n"
]
}
],
"source": [
"grids = [3,5,10,20,50]\n",
"\n",
"train_rmse = []\n",
"test_rmse = []\n",
"\n",
"for i in range(len(grids)):\n",
" model = KAN(width=[4,9,1], grid=grids[i], k=3, seed=0).initialize_from_another_model(model, dataset['train_input'])\n",
" results = model.fit(dataset, opt=\"LBFGS\", steps=50, stop_grid_update_step=30);\n",
" train_rmse.append(results['train_loss'][-1].item())\n",
" test_rmse.append(results['test_loss'][-1].item())"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "4f0a99fd",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0.035936225205659866, 0.02279285155236721, 0.00833611935377121, 0.005708411335945129, 0.010341067798435688]\n",
"[0.05229281634092331, 0.031011207029223442, 0.010879972018301487, 0.010645035654306412, 0.06304473429918289]\n"
]
},
{
"data": {
"image/png": "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qlXw9PTE1q1boWPv/Yi0BsMLEVEV7Ozs8Ntvv+HgwYNo0aIFUlJSMGLECLzwwgu4cuWK2OUR6R2GFyKiaurTpw8uX76MRYsWwdzcHGFhYWjdujUDDFEd45wXIqLnkJiYiEmTJiE3Nxf79++HRCIRuyQircY5L0REatakSRP88ccf2LlzpzK4PHjwAIMHD0ZkZKTI1RHpNp0JL9xVmojEYGpqqvzzrFmz8OeffyIgIACTJ09GVlaWiJUR6S7eNiIiUpFbt27h448/xs6dOwEADRo0wFdffYU333yTt5WIqsDbRkREInB1dcWOHTuwf/9+eHh4IDk5GUOHDkWvXr0QFRUldnlEOoPhhYhIxfr3748rV65g3rx5MDU1xZEjR7BmzRqxyyLSGQwvRERqYGpqipkzZ+LatWsYPnw45s+fr3wsOzubC9wR1QLDCxGRGrm5ueGHH36Avb09AEChUOD1119H7969ce3aNZGrI9JODC9ERHUoNjYWx44dw+HDh+Hn54dp06YhJydH7LKItArDCxFRHfL09MTVq1cRHByMkpISLFmyBF5eXvj99995K4momhheiIjqWNOmTbF7927s3r0b7u7uuHv3Lt544w307dsXKSkpYpdHpPF0JrxwkToi0jbBwcG4evUqZs+eDRMTEyQmJsLW1lbssog0HhepIyLSADdu3EB6erryDVhxcTEOHjyIAQMGcIE70gtcpI6ISMs0a9aszMjxmjVrMHDgQLz44ouIjY0VsTIizcPwQkSkgYqLi2FsbIyDBw/C19cXM2bMQG5urthlEWkEhhciIg00bdo0XL16Ff3790dRUREWLlwIb29v7Ny5k11JpPcYXoiINJSHhwf27duHnTt3okmTJkhMTMSrr76KmTNnil0akagYXoiINJhEIsGgQYNw7do1zJgxAxYWFhg6dKjYZRGJit1GRERa5OHDh6hXr57yeNGiRfD29sbLL7/MriTSauw2IiLSUU8Gl0uXLmHmzJkYNGgQBg4ciBs3bohYGVHdYXghItJSHh4emDZtGoyMjLB//360atUKX3zxBfLz88UujUitGF6IiLSUhYUFFi5ciCtXrqB3794oLCzEnDlz0KpVK+zdu1fs8ojURmfCC7cHICJ95enpiYMHD+K3335Dw4YNER8fj2HDhuHhw4dil0akFpywS0SkQ3JycjBv3jy4u7tj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\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"n_params = np.array(grids) * (4*9+9*1)\n",
"plt.plot(n_params, train_rmse, marker=\"o\")\n",
"plt.plot(n_params, test_rmse, marker=\"o\")\n",
"plt.plot(n_params, 300*n_params**(-2.), color=\"black\", ls=\"--\")\n",
"plt.legend(['train', 'test', r'$N^{-4}$'], loc=\"lower left\")\n",
"plt.xscale('log')\n",
"plt.yscale('log')\n",
"print(train_rmse)\n",
"print(test_rmse)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5776b6e1",
"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
}