У меня есть энергетический спектр от детектора космических лучей. Спектр следует за экспоненциальной кривой, но в нем будут широкие (и, возможно, очень небольшие) куски. Данные, очевидно, содержат элемент шума.Градиент в шумных данных, python
Я пытаюсь сгладить данные, а затем график его градиента. До сих пор я использовал функцию scipy sline для ее сглаживания, а затем np.gradient().
Как вы можете видеть на картинке, метод функции градиента состоит в том, чтобы найти различия между каждой точкой, и это не очень ясно показывает куски.
Мне в основном нужен гладкий градиентный график. Любая помощь будет потрясающей!
я пробовал методы 2 шлицевые:
def smooth_data(y,x,factor):
print "smoothing data by interpolation..."
xnew=np.linspace(min(x),max(x),factor*len(x))
smoothy=spline(x,y,xnew)
return smoothy,xnew
def smooth2_data(y,x,factor):
xnew=np.linspace(min(x),max(x),factor*len(x))
f=interpolate.UnivariateSpline(x,y)
g=interpolate.interp1d(x,y)
return g(xnew),xnew
редактировать: Пробовал численное дифференцирование:
def smooth_data(y,x,factor):
print "smoothing data by interpolation..."
xnew=np.linspace(min(x),max(x),factor*len(x))
smoothy=spline(x,y,xnew)
return smoothy,xnew
def minim(u,f,k):
""""functional to be minimised to find optimum u. f is original, u is approx"""
integral1=abs(np.gradient(u))
part1=simps(integral1)
part2=simps(u)
integral2=abs(part2-f)**2.
part3=simps(integral2)
F=k*part1+part3
return F
def fit(data_x,data_y,denoising,smooth_fac):
smy,xnew=smooth_data(data_y,data_x,smooth_fac)
y0,xnnew=smooth_data(smy,xnew,1./smooth_fac)
y0=list(y0)
data_y=list(data_y)
data_fit=fmin(minim, y0, args=(data_y,denoising), maxiter=1000, maxfun=1000)
return data_fit
Однако, он просто возвращает тот же граф снова!
Какой уровень сглаживания будет иметь смысл для вас? тот, который дает производную от около -10 до +1, причем большинство значений между -1 и +1? – EOL
Примечание: рекомендую прочитать и применить [PEP 8] (http://www.python.org/dev/peps/pep-0008/) к вашему стилю кодирования. Это упростит чтение кода, как это делает большинство программистов Python (или его часть). Небольшие детали, такие как обычные пробелы вокруг '=' в назначениях или после запятых в списках параметров, делают код более понятным. – EOL