私は宇宙線検出器からのエネルギースペクトルを持っています。スペクトラムは指数関数的な曲線に従いますが、それには幅広い(そしておそらくごくわずかな)塊があります。明らかに、データにはノイズの要素が含まれています。ノイズの多いデータの勾配、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