我有一個宇宙射線探測器的能譜。光譜遵循指數曲線,但它會有廣泛的(也許非常輕微)腫塊。顯然,這些數據包含了一些噪音。嘈雜的數據中的漸變,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 2013-04-08 04:22:18
附註:我建議你閱讀並應用[PEP 8](http://www.python.org/dev/peps/pep-0008/)到你的編碼風格。這將使您的代碼更易於閱讀,因爲大多數Python程序員都遵循它(或其中的很大一部分)。像參數列表中的'='周圍的空格或參數列表中的逗號之後的細節確實使代碼更清晰。 – EOL 2013-04-09 11:26:39