Training Expressions¶
Learn how to train mathematical expressions to fit data.
Basic Training¶
import numpy as np
from neurogebra import Expression
from neurogebra.core.trainer import Trainer
# Create trainable linear expression
expr = Expression(
"line",
"m*x + b",
params={"m": 0.0, "b": 0.0},
trainable_params=["m", "b"]
)
# Generate data
X = np.linspace(0, 10, 100)
y = 2.5 * X + 3.0 + np.random.normal(0, 0.5, 100)
# Train
trainer = Trainer(expr, learning_rate=0.001)
history = trainer.fit(X, y, epochs=500)
print(f"Learned: m={expr.params['m']:.3f} (true: 2.5)")
print(f"Learned: b={expr.params['b']:.3f} (true: 3.0)")
Training a Quadratic¶
expr = Expression(
"quad",
"a*x**2 + b*x + c",
params={"a": 0.0, "b": 0.0, "c": 0.0},
trainable_params=["a", "b", "c"]
)
X = np.linspace(-5, 5, 200)
y = 0.5 * X**2 - 2 * X + 1
trainer = Trainer(expr, learning_rate=0.0001)
history = trainer.fit(X, y, epochs=1000)
Using Adam Optimizer¶
trainer = Trainer(expr, learning_rate=0.01, optimizer="adam")
history = trainer.fit(X, y, epochs=200)
Visualizing Training¶
from neurogebra.viz.plotting import plot_training_history, plot_expression
# Plot loss curve
fig = plot_training_history(history)
# Plot fitted expression
fig = plot_expression(expr, x_range=(-5, 5))
Using Callbacks¶
def my_callback(epoch, loss, params):
if epoch % 50 == 0:
print(f"Epoch {epoch}: loss={loss:.4f}, params={params}")
trainer = Trainer(expr, learning_rate=0.01)
history = trainer.fit(X, y, epochs=300, callback=my_callback)
Tips for Training¶
- Start with small learning rates (0.001 or less)
- Scale your data - normalize X and y for better convergence
- Use Adam for faster convergence on complex expressions
- Monitor the loss - if it oscillates, reduce learning rate
- Try different initializations - parameters start at their initial values