MilesCranmer commited on
Commit
1858a22
1 Parent(s): 4c67c21

Add example plot to examples of docs

Browse files
Files changed (2) hide show
  1. docs/examples.md +109 -0
  2. docs/images/example_plot.png +0 -0
docs/examples.md ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Examples
2
+
3
+ ### Preamble
4
+
5
+ ```python
6
+ import numpy as np
7
+ from pysr import *
8
+ ```
9
+
10
+ We'll also set up some default options that will
11
+ make these simple searches go faster (but are less optimal
12
+ for more complex searches).
13
+
14
+ ```python
15
+ kwargs = dict(populations=5, niterations=5, annealing=True)
16
+ ```
17
+
18
+ 1. Simple search
19
+
20
+ Here's a simple example where we turn off multiprocessing,
21
+ and find the expression `2 cos(x3) + x0^2 - 2`.
22
+
23
+ ```python
24
+ X = 2 * np.random.randn(100, 5)
25
+ y = 2 * np.cos(X[:, 3]) + X[:, 0] ** 2 - 2
26
+ expressions = pysr(X, y, binary_operators=["+", "-", "*", "/"], **kwargs)
27
+ print(best(expressions))
28
+ ```
29
+
30
+ 2. Custom operator
31
+
32
+ Here, we define a custom operator and use it to find an expression:
33
+
34
+ ```python
35
+ X = 2 * np.random.randn(100, 5)
36
+ y = 1 / X[:, 0]
37
+ expressions = pysr(
38
+ X,
39
+ y,
40
+ binary_operators=["plus", "mult"],
41
+ unary_operators=["inv(x) = 1/x"],
42
+ **kwargs
43
+ )
44
+ print(best(expressions))
45
+ ```
46
+
47
+ 3. Multiple outputs
48
+
49
+ Here, we do the same thing, but with multiple expressions at once,
50
+ each requiring a different feature.
51
+ ```python
52
+ X = 2 * np.random.randn(100, 5)
53
+ y = 1 / X[:, [0, 1, 2]]
54
+ expressions = pysr(
55
+ X,
56
+ y,
57
+ binary_operators=["plus", "mult"],
58
+ unary_operators=["inv(x) = 1/x"],
59
+ **kwargs
60
+ )
61
+ ```
62
+
63
+ 4. Plotting an expression
64
+
65
+ Here, let's use the same equations, but get a format we can actually
66
+ use and test. We can add this option after a search via the `get_hof`
67
+ function:
68
+
69
+ ```python
70
+ expressions = get_hof(extra_sympy_mappings={"inv": lambda x: 1/x})
71
+ ```
72
+ If you look at the lists of expressions before and after, you will
73
+ see that the sympy format now has replaced `inv` with `1/`.
74
+
75
+ For now, let's consider the expressions for output 0:
76
+ ```python
77
+ expressions = expressions[0]
78
+ ```
79
+ This is a pandas table, which we can filter:
80
+ ```python
81
+ best_expression = expressions.iloc[expressions.MSE.argmin()]
82
+ ```
83
+ We can see the LaTeX version of this with:
84
+ ```python
85
+ import sympy
86
+ sympy.latex(best_expression.sympy_format)
87
+ ```
88
+
89
+ We can access the numpy version with:
90
+ ```python
91
+ f = best_expression.lambda_format
92
+ print(f)
93
+ ```
94
+
95
+ Which shows a PySR object on numpy code:
96
+ ```
97
+ >> PySRFunction(X=>1/x0)
98
+ ```
99
+
100
+ Let's plot this against the truth:
101
+ ```python
102
+ from matplotlib import pyplot as plt
103
+ plt.scatter(y[:, 0], f(X))
104
+ plt.xlabel('Truth')
105
+ plt.ylabel('Prediction')
106
+ plt.show()
107
+ ```
108
+ Which gives us:
109
+ ![](./images/example_plot.png)
docs/images/example_plot.png ADDED