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

361 lines
42 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "134e7f9d",
"metadata": {},
"source": [
"# Example 5: Special functions"
]
},
{
"cell_type": "markdown",
"id": "2571d531",
"metadata": {},
"source": [
"Let's construct a dataset which contains special functions $f(x,y)={\\rm exp}(J_0(20x)+y^2)$, where $J_0(x)$ is the Bessel function."
]
},
{
"cell_type": "code",
"execution_count": 17,
"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: 5.15e-01 | test_loss: 5.84e-01 | reg: 5.91e+00 | : 100%|█| 20/20 [00:02<00:00, 7.39it"
]
},
{
"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=[2,1,1], grid=3, k=3, seed=2)\n",
"f = lambda x: torch.exp(torch.special.bessel_j0(20*x[:,[0]]) + 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": "markdown",
"id": "2f30c3ab",
"metadata": {},
"source": [
"Plot trained KAN, the bessel function shows up in the bettom left"
]
},
{
"cell_type": "code",
"execution_count": 18,
"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": 19,
"id": "187d19f9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.2\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"| train_loss: 2.70e-02 | test_loss: 9.15e-02 | reg: 7.69e+00 | : 100%|█| 20/20 [00:05<00:00, 3.49it"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.3\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"model = model.refine(20)\n",
"model.fit(dataset, opt=\"LBFGS\", steps=20);"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "8d50bcef",
"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": "markdown",
"id": "733a2a41",
"metadata": {},
"source": [
"suggest_symbolic does not return anything that matches with it, since Bessel function isn't included in the default SYMBOLIC_LIB. We want to add Bessel to it."
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "031db28f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" function fitting r2 r2 loss complexity complexity loss total loss\n",
"0 0 0.000000 0.000014 0 0 0.000003\n",
"1 x 0.002039 -0.002930 1 1 0.799414\n",
"2 J0 0.200055 -0.322009 2 2 1.535598\n",
"3 cos 0.168072 -0.265453 2 2 1.546909\n",
"4 sin 0.168072 -0.265453 2 2 1.546909\n"
]
},
{
"data": {
"text/plain": [
"('0',\n",
" (<function kan.utils.<lambda>(x)>,\n",
" <function kan.utils.<lambda>(x)>,\n",
" 0,\n",
" <function kan.utils.<lambda>(x, y_th)>),\n",
" 0.0,\n",
" 0)"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.suggest_symbolic(0,0,0)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "4b8549a2",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"dict_keys(['x', 'x^2', 'x^3', 'x^4', 'x^5', '1/x', '1/x^2', '1/x^3', '1/x^4', '1/x^5', 'sqrt', 'x^0.5', 'x^1.5', '1/sqrt(x)', '1/x^0.5', 'exp', 'log', 'abs', 'sin', 'cos', 'tan', 'tanh', 'sgn', 'arcsin', 'arccos', 'arctan', 'arctanh', '0', 'gaussian', 'J0'])"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"SYMBOLIC_LIB.keys()"
]
},
{
"cell_type": "markdown",
"id": "5db9e7cf",
"metadata": {},
"source": [
"add bessel function J0 to the symbolic library. we should include a name and a pytorch implementation. c is the complexity assigned to J0."
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "cbde1924",
"metadata": {},
"outputs": [],
"source": [
"add_symbolic('J0', torch.special.bessel_j0, c=1)"
]
},
{
"cell_type": "markdown",
"id": "bda24c6d",
"metadata": {},
"source": [
"After adding Bessel, we check suggest_symbolic again"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "83e5cfdd",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" function fitting r2 r2 loss complexity complexity loss total loss\n",
"0 0 0.000000 0.000014 0 0 0.000003\n",
"1 J0 0.200055 -0.322009 1 1 0.735598\n",
"2 x 0.002039 -0.002930 1 1 0.799414\n",
"3 cos 0.168072 -0.265453 2 2 1.546909\n",
"4 sin 0.168072 -0.265453 2 2 1.546909\n"
]
},
{
"data": {
"text/plain": [
"('0',\n",
" (<function kan.utils.<lambda>(x)>,\n",
" <function kan.utils.<lambda>(x)>,\n",
" 0,\n",
" <function kan.utils.<lambda>(x, y_th)>),\n",
" 0.0,\n",
" 0)"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# J0 fitting is not very good\n",
"model.suggest_symbolic(0,0,0)"
]
},
{
"cell_type": "markdown",
"id": "4180de14",
"metadata": {},
"source": [
"The fitting r2 is still not high, this is because the ground truth is J0(20x) which involves 20 which is too large. our default search is in (-10,10). so we need to set the search range bigger in order to include 20. now J0 appears at the top of the list\n"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "e78f4674",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" function fitting r2 r2 loss complexity complexity loss total loss\n",
"0 J0 0.998490 -9.361690 1 1 -1.072338\n",
"1 0 0.000000 0.000014 0 0 0.000003\n",
"2 x 0.002039 -0.002930 1 1 0.799414\n",
"3 cos 0.580127 -1.251939 2 2 1.349612\n",
"4 sin 0.580127 -1.251939 2 2 1.349612\n"
]
},
{
"data": {
"text/plain": [
"('J0',\n",
" (<function torch._C._special.special_bessel_j0>,\n",
" J0,\n",
" 1,\n",
" <function torch._C._special.special_bessel_j0>),\n",
" 0.9984899759292603,\n",
" 1)"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.suggest_symbolic(0,0,0,a_range=(-40,40))"
]
}
],
"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
}