Tôi có phổ năng lượng từ thiết bị dò tia vũ trụ. Quang phổ theo một đường cong theo cấp số nhân nhưng nó sẽ có các khối u rộng (và có thể rất nhỏ) trong đó. Các dữ liệu, rõ ràng, có chứa một yếu tố của tiếng ồn.Gradient trong dữ liệu nhiễu, python
Tôi đang cố gắng làm mịn dữ liệu và sau đó vẽ đường viền của nó. Cho đến nay tôi đã sử dụng hàm sline scipy để làm mịn nó và sau đó là np.gradient().
Như bạn có thể thấy từ hình, phương pháp của hàm gradient là tìm sự khác biệt giữa mỗi điểm và không hiển thị các khối rất rõ ràng.
Tôi về cơ bản cần có biểu đồ độ dốc mượt mà. Bất kỳ trợ giúp sẽ là tuyệt vời!
Tôi đã thử phương pháp 2 spline:
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
chỉnh sửa: Cố gắng số khác biệt:
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
Tuy nhiên, nó chỉ trả về cùng một đồ thị một lần nữa!
gì mức độ mịn sẽ có ý nghĩa đối với bạn? một trong đó mang lại một đạo hàm giữa khoảng -10 và +1, với hầu hết các giá trị giữa -1 và +1? – EOL
Lưu ý phụ: Tôi khuyên bạn nên đọc và áp dụng [PEP 8] (http://www.python.org/dev/peps/pep-0008/) vào kiểu "mã hóa" của bạn. Điều này sẽ làm cho mã của bạn dễ đọc hơn, như hầu hết các lập trình viên Python theo nó (hoặc một phần tốt của nó). Các chi tiết nhỏ như khoảng trống thông thường xung quanh '=' trong các bài tập hoặc sau dấu phẩy trong danh sách tham số làm cho mã dễ đọc hơn. – EOL