Skip to content

Commit 47058db

Browse files
authored
Merge pull request #128 from florisvb/notebooks-update-for-optimizer
Notebooks update for optimizer
2 parents 2cae18a + a5b79b8 commit 47058db

7 files changed

Lines changed: 371 additions & 717 deletions

File tree

examples/2a_optimizing_parameters_with_dxdt_known.ipynb

Lines changed: 174 additions & 358 deletions
Large diffs are not rendered by default.

examples/2b_optimizing_parameters_with_dxdt_unknown.ipynb

Lines changed: 181 additions & 349 deletions
Large diffs are not rendered by default.

pynumdiff/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@
99
from pynumdiff.linear_model import lineardiff, polydiff, spectraldiff, savgoldiff
1010
from pynumdiff.kalman_smooth import constant_velocity, constant_acceleration, constant_jerk,\
1111
known_dynamics
12+
from pynumdiff.optimize import optimize

pynumdiff/linear_model/_linear_model.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def savgoldiff(x, dt, params=None, options=None, poly_order=None, window_size=No
3939
raise ValueError("`poly_order`, `window_size`, and `smoothing_win` must be given.")
4040

4141
window_size = np.clip(window_size, poly_order + 1, len(x)-1)
42-
if not window_size % 2: window_size += 1 # window_size needs to be odd
42+
if window_size % 2 == 0: window_size += 1 # window_size needs to be odd
4343
smoothing_win = min(smoothing_win, len(x)-1)
4444

4545
dxdt_hat = scipy.signal.savgol_filter(x, window_size, poly_order, deriv=1)/dt
@@ -312,6 +312,9 @@ def _lineardiff(x, dt, order, gamma, solver=None):
312312

313313
if not window_size:
314314
return _lineardiff(x, dt, order, gamma, solver)
315+
elif window_size % 2 == 0:
316+
window_size += 1
317+
warn("Kernel window size should be odd. Added 1 to length.")
315318

316319
kernel = {'gaussian':utility.gaussian_kernel, 'friedrichs':utility.friedrichs_kernel}[kernel](window_size)
317320

pynumdiff/optimize/_optimize.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@
2020
'pad_to_zero_dxdt': True,
2121
'high_freq_cutoff': [1e-3, 5e-2, 1e-2, 5e-2, 1e-1]},
2222
{'high_freq_cutoff': (1e-5, 1-1e-5)}),
23-
polydiff: ({'step_size': 1,
23+
polydiff: ({'step_size': [1, 2, 5],
2424
'kernel': 'friedrichs',
2525
'poly_order': [2, 3, 5, 7],
2626
'window_size': [11, 31, 51, 91, 131]},
27-
{'poly_order': (1, 8),
27+
{'step_size': (1, 100),
28+
'poly_order': (1, 8),
2829
'window_size': (10, 1000)}),
2930
savgoldiff: ({'poly_order': [2, 3, 5, 7, 9, 11, 13],
3031
'window_size': [3, 10, 30, 50, 90, 130, 200, 300],
@@ -41,7 +42,8 @@
4142
'order': 3,
4243
'gamma': [1e-1, 1, 10, 100],
4344
'window_size': [10, 30, 50, 90, 130]},
44-
{'gamma': (1e-3, 1000),
45+
{'order': (1, 5),
46+
'gamma': (1e-3, 1000),
4547
'window_size': (15, 1000)}),
4648
first_order: ({'num_iterations': [5, 10, 30, 50]},
4749
{'num_iterations': (1, 1000)}),
@@ -130,8 +132,8 @@ def optimize(func, x, dt, search_space={}, dxdt_truth=None, tvgamma=1e-2, paddin
130132
structured as :code:`{param1:[values], param2:[values], param3:value, ...}`. The search space
131133
is the Cartesian product. If left None, a default search space of initial values is used.
132134
:param np.array[float] dxdt_truth: actual time series of the derivative of x, if known
133-
:param float tvgamma: regularization value used to select for parameters that yield a smooth derivative.
134-
Larger value results in a smoother derivative
135+
:param float tvgamma: Only used if :code:`dxdt_truth` is given. Regularization value used to select for parameters
136+
that yield a smooth derivative. Larger value results in a smoother derivative.
135137
:param int padding: number of time steps to ignore at the beginning and end of the time series in the
136138
optimization. Larger value causes the optimization to emphasize the accuracy of dxdt in the
137139
middle of the time series

pynumdiff/tests/test_optimize.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ def test_spectraldiff():
106106
assert np.isclose(params2['high_freq_cutoff'], 0.575, atol=1e-3) or np.isclose(params2['high_freq_cutoff'], 0.735, atol=1e-3) # this one solves unstably to one or the other
107107

108108
def test_polydiff():
109-
params1, val1 = optimize(polydiff, x, dt, tvgamma=tvgamma, dxdt_truth=dxdt_truth)
110-
params2, val2 = optimize(polydiff, x, dt, tvgamma=0, dxdt_truth=None)
109+
params1, val1 = optimize(polydiff, x, dt, search_space={'step_size':1}, tvgamma=tvgamma, dxdt_truth=dxdt_truth)
110+
params2, val2 = optimize(polydiff, x, dt, search_space={'step_size':1}, tvgamma=0, dxdt_truth=None)
111111
assert (params1['poly_order'], params1['window_size']) == (6, 50)
112112
assert (params2['poly_order'], params2['window_size']) == (4, 10)
113113

pynumdiff/utils/evaluate.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,6 @@ def total_variation(x, padding=0):
132132
if padding == 'auto':
133133
padding = int(0.025*len(x))
134134
padding = max(padding, 1)
135-
x = x[padding: len(x)-padding]
135+
x = x[padding:len(x)-padding]
136136

137-
return np.sum(np.abs(x[1:]-x[:-1]))/len(x) # normalized version of cvxpy.tv(x2-x1).value
137+
return np.linalg.norm(x[1:]-x[:-1], 1)/len(x) # normalized version of what cvxpy.tv does

0 commit comments

Comments
 (0)