In [1]:
import numpy as np
import matplotlib.pyplot as plt
import pwlf

In [2]:
x = np.linspace(0, 1024, 100)
y = np.sin(.01*x)
plt.figure()
plt.plot(x, y)


Out[2]:
[<matplotlib.lines.Line2D at 0x24d81ae6f28>]

In [3]:
from GPyOpt.methods import BayesianOptimization

In [4]:
my_pwlf = pwlf.PiecewiseLinFit(x, y, degree=2)
number_of_line_segments = 4
my_pwlf.use_custom_opt(number_of_line_segments)

In [5]:
# define domain for possible breakpoints
bounds = [{'name': 'break_1', 'type': 'discrete',
           'domain': np.arange(1, 1023)},
          {'name': 'break_2', 'type': 'discrete',
           'domain': np.arange(1, 1023)},
          {'name': 'break_3', 'type': 'discrete',
           'domain': np.arange(1, 1023)}]
max_iter = 120

In [6]:
def my_obj(x):
    f = np.zeros(x.shape[0])
    for i, j in enumerate(x):
        f[i] = my_pwlf.fit_with_breaks_opt(j)
    return f

In [7]:
myBopt = BayesianOptimization(my_obj,
                              domain=bounds, model_type='GP',
                              initial_design_numdata=20,
                              initial_design_type='latin',
                              exact_feval=True, verbosity=True,
                              verbosity_model=False)

In [8]:
myBopt.run_optimization(max_iter=max_iter, verbosity=True)


num acquisition: 1, time elapsed: 0.20s
num acquisition: 2, time elapsed: 0.40s
num acquisition: 3, time elapsed: 0.60s
num acquisition: 4, time elapsed: 0.79s
num acquisition: 5, time elapsed: 0.97s
num acquisition: 6, time elapsed: 1.15s
num acquisition: 7, time elapsed: 1.35s
num acquisition: 8, time elapsed: 1.53s
num acquisition: 9, time elapsed: 1.73s
num acquisition: 10, time elapsed: 1.93s
num acquisition: 11, time elapsed: 2.11s
num acquisition: 12, time elapsed: 2.30s
num acquisition: 13, time elapsed: 2.49s
num acquisition: 14, time elapsed: 2.76s
num acquisition: 15, time elapsed: 3.01s
num acquisition: 16, time elapsed: 3.28s
num acquisition: 17, time elapsed: 3.51s
num acquisition: 18, time elapsed: 3.79s
num acquisition: 19, time elapsed: 4.08s
num acquisition: 20, time elapsed: 4.32s
num acquisition: 21, time elapsed: 4.57s
num acquisition: 22, time elapsed: 4.83s
num acquisition: 23, time elapsed: 5.08s
num acquisition: 24, time elapsed: 5.34s
num acquisition: 25, time elapsed: 5.66s
num acquisition: 26, time elapsed: 5.95s
num acquisition: 27, time elapsed: 6.20s
num acquisition: 28, time elapsed: 6.49s
num acquisition: 29, time elapsed: 6.74s
num acquisition: 30, time elapsed: 6.99s
num acquisition: 31, time elapsed: 7.21s
num acquisition: 32, time elapsed: 7.47s
num acquisition: 33, time elapsed: 7.70s
num acquisition: 34, time elapsed: 7.96s
num acquisition: 35, time elapsed: 8.18s
num acquisition: 36, time elapsed: 8.44s
num acquisition: 37, time elapsed: 8.70s
num acquisition: 38, time elapsed: 8.94s
num acquisition: 39, time elapsed: 9.21s
num acquisition: 40, time elapsed: 9.49s
num acquisition: 41, time elapsed: 9.77s
num acquisition: 42, time elapsed: 10.02s
num acquisition: 43, time elapsed: 10.31s
num acquisition: 44, time elapsed: 10.56s
num acquisition: 45, time elapsed: 10.80s
num acquisition: 46, time elapsed: 11.07s
num acquisition: 47, time elapsed: 11.34s
num acquisition: 48, time elapsed: 11.61s
num acquisition: 49, time elapsed: 11.91s
num acquisition: 50, time elapsed: 12.18s
num acquisition: 51, time elapsed: 12.47s
num acquisition: 52, time elapsed: 12.74s
num acquisition: 53, time elapsed: 13.04s
num acquisition: 54, time elapsed: 13.39s
num acquisition: 55, time elapsed: 13.70s
num acquisition: 56, time elapsed: 13.96s
num acquisition: 57, time elapsed: 14.25s
num acquisition: 58, time elapsed: 14.52s
num acquisition: 59, time elapsed: 14.80s
num acquisition: 60, time elapsed: 15.10s
num acquisition: 61, time elapsed: 15.38s
num acquisition: 62, time elapsed: 15.65s
num acquisition: 63, time elapsed: 15.93s
num acquisition: 64, time elapsed: 16.23s
num acquisition: 65, time elapsed: 16.54s
num acquisition: 66, time elapsed: 16.82s
num acquisition: 67, time elapsed: 17.16s
num acquisition: 68, time elapsed: 17.45s
num acquisition: 69, time elapsed: 17.73s
num acquisition: 70, time elapsed: 18.02s
num acquisition: 71, time elapsed: 18.33s
num acquisition: 72, time elapsed: 18.61s
num acquisition: 73, time elapsed: 18.88s
num acquisition: 74, time elapsed: 19.17s
num acquisition: 75, time elapsed: 19.46s
num acquisition: 76, time elapsed: 19.76s
num acquisition: 77, time elapsed: 20.07s
num acquisition: 78, time elapsed: 20.38s
num acquisition: 79, time elapsed: 20.67s
num acquisition: 80, time elapsed: 20.95s
num acquisition: 81, time elapsed: 21.30s
num acquisition: 82, time elapsed: 21.58s
num acquisition: 83, time elapsed: 21.88s
num acquisition: 84, time elapsed: 22.17s
num acquisition: 85, time elapsed: 22.46s
num acquisition: 86, time elapsed: 22.75s
num acquisition: 87, time elapsed: 23.07s
num acquisition: 88, time elapsed: 23.40s
num acquisition: 89, time elapsed: 23.72s
num acquisition: 90, time elapsed: 24.02s
num acquisition: 91, time elapsed: 24.34s
num acquisition: 92, time elapsed: 24.67s
num acquisition: 93, time elapsed: 24.99s
num acquisition: 94, time elapsed: 25.34s
num acquisition: 95, time elapsed: 25.69s
num acquisition: 96, time elapsed: 26.03s
num acquisition: 97, time elapsed: 26.32s
num acquisition: 98, time elapsed: 26.65s
num acquisition: 99, time elapsed: 27.02s
num acquisition: 100, time elapsed: 27.36s
num acquisition: 101, time elapsed: 27.78s
num acquisition: 102, time elapsed: 28.11s
num acquisition: 103, time elapsed: 28.47s
num acquisition: 104, time elapsed: 28.80s
num acquisition: 105, time elapsed: 29.13s
num acquisition: 106, time elapsed: 29.48s
num acquisition: 107, time elapsed: 29.80s
num acquisition: 108, time elapsed: 30.19s
num acquisition: 109, time elapsed: 30.55s
num acquisition: 110, time elapsed: 30.84s
num acquisition: 111, time elapsed: 31.25s
num acquisition: 112, time elapsed: 31.58s
num acquisition: 113, time elapsed: 31.91s
num acquisition: 114, time elapsed: 32.26s
num acquisition: 115, time elapsed: 32.65s
num acquisition: 116, time elapsed: 33.02s
num acquisition: 117, time elapsed: 33.36s
num acquisition: 118, time elapsed: 33.72s
num acquisition: 119, time elapsed: 34.06s
num acquisition: 120, time elapsed: 34.47s

In [9]:
print('\n \n Opt found \n')
print('Optimum number of line segments:', myBopt.x_opt)
print('Function value:', myBopt.fx_opt)


 
 Opt found 

Optimum number of line segments: [612. 310. 842.]
Function value: 0.058342840166060575

In [10]:
myBopt.plot_convergence()



In [11]:
# perform the fit for the optimum
x_opt = list(myBopt.x_opt)
x_opt.append(x.min())
x_opt.append(x.max())
ssr = my_pwlf.fit_with_breaks(x_opt)
# predict for the determined points
xHat = np.linspace(min(x), max(x), num=10000)
yHat = my_pwlf.predict(xHat)

# plot the results
plt.figure()
plt.plot(x, y, 'o')
plt.plot(xHat, yHat, '-')
plt.show()



In [12]:
ssr


Out[12]:
0.058342840166060575

In [ ]: