In [13]:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
In [36]:
def step_fn(length, step_start, slope_len, amp, noise_sigma):
if step_start + slope_len >= length or step_start <= 0:
return
x = np.arange(length)
y = np.zeros(length)
for i in range(slope_len):
y[i + step_start] = amp / (slope_len + 1) * (i+1)
for i in range(step_start + slope_len, length):
y[i] = amp
noise = np.random.normal(0, noise_sigma, len(x))
y = y + noise
return x,y
In [52]:
def sigmoid(x, x0, k, C):
y = C / (1 + np.exp(-k*(x-x0)))
return y
def log_growth_fit(xdata, ydata):
popt, pcov = curve_fit(sigmoid, xdata, ydata)
print("x0, k, C")
print(popt)
x = np.linspace(-1, len(xdata) + 10, len(xdata) + 10)
y = sigmoid(x, *popt)
plt.plot(xdata, ydata, 'o', label='data')
plt.plot(x,y, label='fit')
plt.legend(loc='best')
plt.show()
In [53]:
xdata, ydata = step_fn(50, 10, 8, 10, 0.2)
log_growth_fit(xdata, ydata)
xdata, ydata = step_fn(50, 20, 1, 10, 0.1)
log_growth_fit(xdata, ydata)