Spaces:
Running
Running
Clean up colab notebook
Browse files- examples/pysr_demo.ipynb +35 -36
examples/pysr_demo.ipynb
CHANGED
|
@@ -109,11 +109,11 @@
|
|
| 109 |
"source": [
|
| 110 |
"from julia import Julia\n",
|
| 111 |
"\n",
|
| 112 |
-
"julia = Julia(compiled_modules=False, threads='auto'
|
| 113 |
"from julia import Main\n",
|
| 114 |
"from julia.tools import redirect_output_streams\n",
|
| 115 |
"\n",
|
| 116 |
-
"redirect_output_streams()
|
| 117 |
]
|
| 118 |
},
|
| 119 |
{
|
|
@@ -137,7 +137,8 @@
|
|
| 137 |
"source": [
|
| 138 |
"import pysr\n",
|
| 139 |
"\n",
|
| 140 |
-
"
|
|
|
|
| 141 |
]
|
| 142 |
},
|
| 143 |
{
|
|
@@ -157,7 +158,7 @@
|
|
| 157 |
"from torch.nn import functional as F\n",
|
| 158 |
"from torch.utils.data import DataLoader, TensorDataset\n",
|
| 159 |
"import pytorch_lightning as pl\n",
|
| 160 |
-
"from sklearn.model_selection import train_test_split
|
| 161 |
]
|
| 162 |
},
|
| 163 |
{
|
|
@@ -191,7 +192,7 @@
|
|
| 191 |
"# Dataset\n",
|
| 192 |
"np.random.seed(0)\n",
|
| 193 |
"X = 2 * np.random.randn(100, 5)\n",
|
| 194 |
-
"y = 2.5382 * np.cos(X[:, 3]) + X[:, 0] ** 2 - 2
|
| 195 |
]
|
| 196 |
},
|
| 197 |
{
|
|
@@ -215,7 +216,7 @@
|
|
| 215 |
" populations=30,\n",
|
| 216 |
" procs=4,\n",
|
| 217 |
" model_selection=\"best\",\n",
|
| 218 |
-
")
|
| 219 |
]
|
| 220 |
},
|
| 221 |
{
|
|
@@ -246,7 +247,7 @@
|
|
| 246 |
" **default_pysr_params\n",
|
| 247 |
")\n",
|
| 248 |
"\n",
|
| 249 |
-
"model.fit(X, y)
|
| 250 |
]
|
| 251 |
},
|
| 252 |
{
|
|
@@ -266,7 +267,7 @@
|
|
| 266 |
},
|
| 267 |
"outputs": [],
|
| 268 |
"source": [
|
| 269 |
-
"model
|
| 270 |
]
|
| 271 |
},
|
| 272 |
{
|
|
@@ -286,7 +287,7 @@
|
|
| 286 |
},
|
| 287 |
"outputs": [],
|
| 288 |
"source": [
|
| 289 |
-
"model.sympy()
|
| 290 |
]
|
| 291 |
},
|
| 292 |
{
|
|
@@ -306,7 +307,7 @@
|
|
| 306 |
},
|
| 307 |
"outputs": [],
|
| 308 |
"source": [
|
| 309 |
-
"model.sympy(2)
|
| 310 |
]
|
| 311 |
},
|
| 312 |
{
|
|
@@ -335,7 +336,7 @@
|
|
| 335 |
},
|
| 336 |
"outputs": [],
|
| 337 |
"source": [
|
| 338 |
-
"model.latex()
|
| 339 |
]
|
| 340 |
},
|
| 341 |
{
|
|
@@ -361,7 +362,7 @@
|
|
| 361 |
"ypredict_simpler = model.predict(X, 2)\n",
|
| 362 |
"\n",
|
| 363 |
"print(\"Default selection MSE:\", np.power(ypredict - y, 2).mean())\n",
|
| 364 |
-
"print(\"Manual selection MSE for index 2:\", np.power(ypredict_simpler - y, 2).mean())
|
| 365 |
]
|
| 366 |
},
|
| 367 |
{
|
|
@@ -395,7 +396,7 @@
|
|
| 395 |
},
|
| 396 |
"outputs": [],
|
| 397 |
"source": [
|
| 398 |
-
"y = X[:, 0] ** 4 - 2
|
| 399 |
]
|
| 400 |
},
|
| 401 |
{
|
|
@@ -425,7 +426,7 @@
|
|
| 425 |
" unary_operators=[\"cos\", \"exp\", \"sin\", \"quart(x) = x^4\"],\n",
|
| 426 |
" extra_sympy_mappings={\"quart\": lambda x: x**4},\n",
|
| 427 |
")\n",
|
| 428 |
-
"model.fit(X, y)
|
| 429 |
]
|
| 430 |
},
|
| 431 |
{
|
|
@@ -436,7 +437,7 @@
|
|
| 436 |
},
|
| 437 |
"outputs": [],
|
| 438 |
"source": [
|
| 439 |
-
"model.sympy()
|
| 440 |
]
|
| 441 |
},
|
| 442 |
{
|
|
@@ -538,7 +539,7 @@
|
|
| 538 |
"X = 2 * np.random.rand(N, 5)\n",
|
| 539 |
"sigma = np.random.rand(N) * (5 - 0.1) + 0.1\n",
|
| 540 |
"eps = sigma * np.random.randn(N)\n",
|
| 541 |
-
"y = 5 * np.cos(3.5 * X[:, 0]) - 1.3 + eps
|
| 542 |
]
|
| 543 |
},
|
| 544 |
{
|
|
@@ -560,7 +561,7 @@
|
|
| 560 |
"source": [
|
| 561 |
"plt.scatter(X[:, 0], y, alpha=0.2)\n",
|
| 562 |
"plt.xlabel(\"$x_0$\")\n",
|
| 563 |
-
"plt.ylabel(\"$y$\")
|
| 564 |
]
|
| 565 |
},
|
| 566 |
{
|
|
@@ -580,7 +581,7 @@
|
|
| 580 |
},
|
| 581 |
"outputs": [],
|
| 582 |
"source": [
|
| 583 |
-
"weights = 1 / sigma ** 2
|
| 584 |
]
|
| 585 |
},
|
| 586 |
{
|
|
@@ -591,7 +592,7 @@
|
|
| 591 |
},
|
| 592 |
"outputs": [],
|
| 593 |
"source": [
|
| 594 |
-
"weights[:5]
|
| 595 |
]
|
| 596 |
},
|
| 597 |
{
|
|
@@ -619,7 +620,7 @@
|
|
| 619 |
" binary_operators=[\"plus\", \"mult\"],\n",
|
| 620 |
" unary_operators=[\"cos\"],\n",
|
| 621 |
")\n",
|
| 622 |
-
"model.fit(X, y, weights=weights)
|
| 623 |
]
|
| 624 |
},
|
| 625 |
{
|
|
@@ -639,7 +640,7 @@
|
|
| 639 |
},
|
| 640 |
"outputs": [],
|
| 641 |
"source": [
|
| 642 |
-
"model
|
| 643 |
]
|
| 644 |
},
|
| 645 |
{
|
|
@@ -662,7 +663,7 @@
|
|
| 662 |
"best_idx = model.equations_.query(\n",
|
| 663 |
" f\"loss < {2 * model.equations_.loss.min()}\"\n",
|
| 664 |
").score.idxmax()\n",
|
| 665 |
-
"model.sympy(best_idx)
|
| 666 |
]
|
| 667 |
},
|
| 668 |
{
|
|
@@ -693,7 +694,7 @@
|
|
| 693 |
"source": [
|
| 694 |
"plt.scatter(X[:, 0], y, alpha=0.1)\n",
|
| 695 |
"y_prediction = model.predict(X, index=best_idx)\n",
|
| 696 |
-
"plt.scatter(X[:, 0], y_prediction)
|
| 697 |
]
|
| 698 |
},
|
| 699 |
{
|
|
@@ -719,7 +720,7 @@
|
|
| 719 |
"outputs": [],
|
| 720 |
"source": [
|
| 721 |
"X = 2 * np.random.randn(100, 5)\n",
|
| 722 |
-
"y = 1 / X[:, [0, 1, 2]]
|
| 723 |
]
|
| 724 |
},
|
| 725 |
{
|
|
@@ -1024,7 +1025,7 @@
|
|
| 1024 |
"y_i = X[..., 0] ** 2 + 6 * np.cos(2 * X[..., 2])\n",
|
| 1025 |
"y = np.sum(y_i, axis=1) / y_i.shape[1]\n",
|
| 1026 |
"z = y**2\n",
|
| 1027 |
-
"X.shape, y.shape
|
| 1028 |
]
|
| 1029 |
},
|
| 1030 |
{
|
|
@@ -1117,7 +1118,7 @@
|
|
| 1117 |
" ),\n",
|
| 1118 |
" \"interval\": \"step\",\n",
|
| 1119 |
" }\n",
|
| 1120 |
-
" return [optimizer], [scheduler]
|
| 1121 |
]
|
| 1122 |
},
|
| 1123 |
{
|
|
@@ -1152,7 +1153,7 @@
|
|
| 1152 |
"train_set = TensorDataset(X_train, z_train)\n",
|
| 1153 |
"train = DataLoader(train_set, batch_size=128, num_workers=2)\n",
|
| 1154 |
"test_set = TensorDataset(X_test, z_test)\n",
|
| 1155 |
-
"test = DataLoader(test_set, batch_size=256, num_workers=2)
|
| 1156 |
]
|
| 1157 |
},
|
| 1158 |
{
|
|
@@ -1184,7 +1185,7 @@
|
|
| 1184 |
"pl.seed_everything(0)\n",
|
| 1185 |
"model = SumNet()\n",
|
| 1186 |
"model.total_steps = total_steps\n",
|
| 1187 |
-
"model.max_lr = 1e-2
|
| 1188 |
]
|
| 1189 |
},
|
| 1190 |
{
|
|
@@ -1204,7 +1205,7 @@
|
|
| 1204 |
},
|
| 1205 |
"outputs": [],
|
| 1206 |
"source": [
|
| 1207 |
-
"trainer = pl.Trainer(max_steps=total_steps, gpus=1, benchmark=True)
|
| 1208 |
]
|
| 1209 |
},
|
| 1210 |
{
|
|
@@ -1224,7 +1225,7 @@
|
|
| 1224 |
},
|
| 1225 |
"outputs": [],
|
| 1226 |
"source": [
|
| 1227 |
-
"trainer.fit(model, train_dataloaders=train, val_dataloaders=test)
|
| 1228 |
]
|
| 1229 |
},
|
| 1230 |
{
|
|
@@ -1254,7 +1255,7 @@
|
|
| 1254 |
"y_for_pysr = torch.sum(y_i_for_pysr, dim=1) / y_i_for_pysr.shape[1]\n",
|
| 1255 |
"z_for_pysr = zt[idx] # Use true values.\n",
|
| 1256 |
"\n",
|
| 1257 |
-
"X_for_pysr.shape, y_i_for_pysr.shape
|
| 1258 |
]
|
| 1259 |
},
|
| 1260 |
{
|
|
@@ -1287,7 +1288,7 @@
|
|
| 1287 |
" binary_operators=[\"plus\", \"sub\", \"mult\"],\n",
|
| 1288 |
" unary_operators=[\"cos\", \"square\", \"neg\"],\n",
|
| 1289 |
")\n",
|
| 1290 |
-
"model.fit(X=tmpX[idx2], y=tmpy[idx2])
|
| 1291 |
]
|
| 1292 |
},
|
| 1293 |
{
|
|
@@ -1319,7 +1320,7 @@
|
|
| 1319 |
},
|
| 1320 |
"outputs": [],
|
| 1321 |
"source": [
|
| 1322 |
-
"model
|
| 1323 |
]
|
| 1324 |
},
|
| 1325 |
{
|
|
@@ -1375,9 +1376,7 @@
|
|
| 1375 |
},
|
| 1376 |
"gpuClass": "standard",
|
| 1377 |
"kernelspec": {
|
| 1378 |
-
"
|
| 1379 |
-
"language": "python",
|
| 1380 |
-
"name": "main_ipynb"
|
| 1381 |
},
|
| 1382 |
"language_info": {
|
| 1383 |
"name": "python",
|
|
|
|
| 109 |
"source": [
|
| 110 |
"from julia import Julia\n",
|
| 111 |
"\n",
|
| 112 |
+
"julia = Julia(compiled_modules=False, threads='auto')\n",
|
| 113 |
"from julia import Main\n",
|
| 114 |
"from julia.tools import redirect_output_streams\n",
|
| 115 |
"\n",
|
| 116 |
+
"redirect_output_streams()"
|
| 117 |
]
|
| 118 |
},
|
| 119 |
{
|
|
|
|
| 137 |
"source": [
|
| 138 |
"import pysr\n",
|
| 139 |
"\n",
|
| 140 |
+
"# We don't precompile in colab because compiled modules are incompatible static Python libraries:\n",
|
| 141 |
+
"pysr.install(precompile=False)"
|
| 142 |
]
|
| 143 |
},
|
| 144 |
{
|
|
|
|
| 158 |
"from torch.nn import functional as F\n",
|
| 159 |
"from torch.utils.data import DataLoader, TensorDataset\n",
|
| 160 |
"import pytorch_lightning as pl\n",
|
| 161 |
+
"from sklearn.model_selection import train_test_split"
|
| 162 |
]
|
| 163 |
},
|
| 164 |
{
|
|
|
|
| 192 |
"# Dataset\n",
|
| 193 |
"np.random.seed(0)\n",
|
| 194 |
"X = 2 * np.random.randn(100, 5)\n",
|
| 195 |
+
"y = 2.5382 * np.cos(X[:, 3]) + X[:, 0] ** 2 - 2"
|
| 196 |
]
|
| 197 |
},
|
| 198 |
{
|
|
|
|
| 216 |
" populations=30,\n",
|
| 217 |
" procs=4,\n",
|
| 218 |
" model_selection=\"best\",\n",
|
| 219 |
+
")"
|
| 220 |
]
|
| 221 |
},
|
| 222 |
{
|
|
|
|
| 247 |
" **default_pysr_params\n",
|
| 248 |
")\n",
|
| 249 |
"\n",
|
| 250 |
+
"model.fit(X, y)"
|
| 251 |
]
|
| 252 |
},
|
| 253 |
{
|
|
|
|
| 267 |
},
|
| 268 |
"outputs": [],
|
| 269 |
"source": [
|
| 270 |
+
"model"
|
| 271 |
]
|
| 272 |
},
|
| 273 |
{
|
|
|
|
| 287 |
},
|
| 288 |
"outputs": [],
|
| 289 |
"source": [
|
| 290 |
+
"model.sympy()"
|
| 291 |
]
|
| 292 |
},
|
| 293 |
{
|
|
|
|
| 307 |
},
|
| 308 |
"outputs": [],
|
| 309 |
"source": [
|
| 310 |
+
"model.sympy(2)"
|
| 311 |
]
|
| 312 |
},
|
| 313 |
{
|
|
|
|
| 336 |
},
|
| 337 |
"outputs": [],
|
| 338 |
"source": [
|
| 339 |
+
"model.latex()"
|
| 340 |
]
|
| 341 |
},
|
| 342 |
{
|
|
|
|
| 362 |
"ypredict_simpler = model.predict(X, 2)\n",
|
| 363 |
"\n",
|
| 364 |
"print(\"Default selection MSE:\", np.power(ypredict - y, 2).mean())\n",
|
| 365 |
+
"print(\"Manual selection MSE for index 2:\", np.power(ypredict_simpler - y, 2).mean())"
|
| 366 |
]
|
| 367 |
},
|
| 368 |
{
|
|
|
|
| 396 |
},
|
| 397 |
"outputs": [],
|
| 398 |
"source": [
|
| 399 |
+
"y = X[:, 0] ** 4 - 2"
|
| 400 |
]
|
| 401 |
},
|
| 402 |
{
|
|
|
|
| 426 |
" unary_operators=[\"cos\", \"exp\", \"sin\", \"quart(x) = x^4\"],\n",
|
| 427 |
" extra_sympy_mappings={\"quart\": lambda x: x**4},\n",
|
| 428 |
")\n",
|
| 429 |
+
"model.fit(X, y)"
|
| 430 |
]
|
| 431 |
},
|
| 432 |
{
|
|
|
|
| 437 |
},
|
| 438 |
"outputs": [],
|
| 439 |
"source": [
|
| 440 |
+
"model.sympy()"
|
| 441 |
]
|
| 442 |
},
|
| 443 |
{
|
|
|
|
| 539 |
"X = 2 * np.random.rand(N, 5)\n",
|
| 540 |
"sigma = np.random.rand(N) * (5 - 0.1) + 0.1\n",
|
| 541 |
"eps = sigma * np.random.randn(N)\n",
|
| 542 |
+
"y = 5 * np.cos(3.5 * X[:, 0]) - 1.3 + eps"
|
| 543 |
]
|
| 544 |
},
|
| 545 |
{
|
|
|
|
| 561 |
"source": [
|
| 562 |
"plt.scatter(X[:, 0], y, alpha=0.2)\n",
|
| 563 |
"plt.xlabel(\"$x_0$\")\n",
|
| 564 |
+
"plt.ylabel(\"$y$\")"
|
| 565 |
]
|
| 566 |
},
|
| 567 |
{
|
|
|
|
| 581 |
},
|
| 582 |
"outputs": [],
|
| 583 |
"source": [
|
| 584 |
+
"weights = 1 / sigma ** 2"
|
| 585 |
]
|
| 586 |
},
|
| 587 |
{
|
|
|
|
| 592 |
},
|
| 593 |
"outputs": [],
|
| 594 |
"source": [
|
| 595 |
+
"weights[:5]"
|
| 596 |
]
|
| 597 |
},
|
| 598 |
{
|
|
|
|
| 620 |
" binary_operators=[\"plus\", \"mult\"],\n",
|
| 621 |
" unary_operators=[\"cos\"],\n",
|
| 622 |
")\n",
|
| 623 |
+
"model.fit(X, y, weights=weights)"
|
| 624 |
]
|
| 625 |
},
|
| 626 |
{
|
|
|
|
| 640 |
},
|
| 641 |
"outputs": [],
|
| 642 |
"source": [
|
| 643 |
+
"model"
|
| 644 |
]
|
| 645 |
},
|
| 646 |
{
|
|
|
|
| 663 |
"best_idx = model.equations_.query(\n",
|
| 664 |
" f\"loss < {2 * model.equations_.loss.min()}\"\n",
|
| 665 |
").score.idxmax()\n",
|
| 666 |
+
"model.sympy(best_idx)"
|
| 667 |
]
|
| 668 |
},
|
| 669 |
{
|
|
|
|
| 694 |
"source": [
|
| 695 |
"plt.scatter(X[:, 0], y, alpha=0.1)\n",
|
| 696 |
"y_prediction = model.predict(X, index=best_idx)\n",
|
| 697 |
+
"plt.scatter(X[:, 0], y_prediction)"
|
| 698 |
]
|
| 699 |
},
|
| 700 |
{
|
|
|
|
| 720 |
"outputs": [],
|
| 721 |
"source": [
|
| 722 |
"X = 2 * np.random.randn(100, 5)\n",
|
| 723 |
+
"y = 1 / X[:, [0, 1, 2]]"
|
| 724 |
]
|
| 725 |
},
|
| 726 |
{
|
|
|
|
| 1025 |
"y_i = X[..., 0] ** 2 + 6 * np.cos(2 * X[..., 2])\n",
|
| 1026 |
"y = np.sum(y_i, axis=1) / y_i.shape[1]\n",
|
| 1027 |
"z = y**2\n",
|
| 1028 |
+
"X.shape, y.shape"
|
| 1029 |
]
|
| 1030 |
},
|
| 1031 |
{
|
|
|
|
| 1118 |
" ),\n",
|
| 1119 |
" \"interval\": \"step\",\n",
|
| 1120 |
" }\n",
|
| 1121 |
+
" return [optimizer], [scheduler]"
|
| 1122 |
]
|
| 1123 |
},
|
| 1124 |
{
|
|
|
|
| 1153 |
"train_set = TensorDataset(X_train, z_train)\n",
|
| 1154 |
"train = DataLoader(train_set, batch_size=128, num_workers=2)\n",
|
| 1155 |
"test_set = TensorDataset(X_test, z_test)\n",
|
| 1156 |
+
"test = DataLoader(test_set, batch_size=256, num_workers=2)"
|
| 1157 |
]
|
| 1158 |
},
|
| 1159 |
{
|
|
|
|
| 1185 |
"pl.seed_everything(0)\n",
|
| 1186 |
"model = SumNet()\n",
|
| 1187 |
"model.total_steps = total_steps\n",
|
| 1188 |
+
"model.max_lr = 1e-2"
|
| 1189 |
]
|
| 1190 |
},
|
| 1191 |
{
|
|
|
|
| 1205 |
},
|
| 1206 |
"outputs": [],
|
| 1207 |
"source": [
|
| 1208 |
+
"trainer = pl.Trainer(max_steps=total_steps, gpus=1, benchmark=True)"
|
| 1209 |
]
|
| 1210 |
},
|
| 1211 |
{
|
|
|
|
| 1225 |
},
|
| 1226 |
"outputs": [],
|
| 1227 |
"source": [
|
| 1228 |
+
"trainer.fit(model, train_dataloaders=train, val_dataloaders=test)"
|
| 1229 |
]
|
| 1230 |
},
|
| 1231 |
{
|
|
|
|
| 1255 |
"y_for_pysr = torch.sum(y_i_for_pysr, dim=1) / y_i_for_pysr.shape[1]\n",
|
| 1256 |
"z_for_pysr = zt[idx] # Use true values.\n",
|
| 1257 |
"\n",
|
| 1258 |
+
"X_for_pysr.shape, y_i_for_pysr.shape"
|
| 1259 |
]
|
| 1260 |
},
|
| 1261 |
{
|
|
|
|
| 1288 |
" binary_operators=[\"plus\", \"sub\", \"mult\"],\n",
|
| 1289 |
" unary_operators=[\"cos\", \"square\", \"neg\"],\n",
|
| 1290 |
")\n",
|
| 1291 |
+
"model.fit(X=tmpX[idx2], y=tmpy[idx2])"
|
| 1292 |
]
|
| 1293 |
},
|
| 1294 |
{
|
|
|
|
| 1320 |
},
|
| 1321 |
"outputs": [],
|
| 1322 |
"source": [
|
| 1323 |
+
"model"
|
| 1324 |
]
|
| 1325 |
},
|
| 1326 |
{
|
|
|
|
| 1376 |
},
|
| 1377 |
"gpuClass": "standard",
|
| 1378 |
"kernelspec": {
|
| 1379 |
+
"language": "python"
|
|
|
|
|
|
|
| 1380 |
},
|
| 1381 |
"language_info": {
|
| 1382 |
"name": "python",
|