2015-03-19 2 views
9

В настоящее время я работаю с некоторыми данными Raman Spectra, и я пытаюсь исправить свои данные, вызванные перекосом флуоресценции. Посмотрите на графике ниже:Библиотека коррекции базовой линии Python

enter image description here

Я очень близок к достижению того, что я хочу. Как вы можете видеть, я пытаюсь сопоставить многочлен во всех моих данных, тогда как я должен просто подгонять многочлен в локальных минимумах.

В идеале я хотел бы иметь полиномиальный фитинг, который когда вычитает из моих исходных данных приведет к чему-то вроде этого:

enter image description here

Есть ли встроенный в LIBS, что делает это уже?

Если нет, любой простой алгоритм, который можно порекомендовать для меня?

+0

Вы можете попробовать создать фильтр высокого пути, преобразуя свой сигнал с помощью '' rfft() '' и установив низкочастотную часть на ноль. – Dietrich

+0

Вы должны посмотреть на минимальные методы поиска в этом вопросе: http://stackoverflow.com/questions/24656367/find-peaks-location-in-a-spectrum-numpy. Как только у вас есть это, вы можете поместиться только в минимумы, чтобы найти коррекцию базовой линии. –

ответ

11

Я нашел ответ на свой вопрос, просто поделись для всех, кто наткнулся на это.

В 2005 году П. Эйлерс и Х.Беленс разработали алгоритм под названием «Асимметричное сглаживание наименьших квадратов». Статья бесплатна, и вы можете найти ее в google.

def baseline_als(y, lam, p, niter=10): 
    L = len(y) 
    D = sparse.csc_matrix(np.diff(np.eye(L), 2)) 
    w = np.ones(L) 
    for i in xrange(niter): 
    W = sparse.spdiags(w, 0, L, L) 
    Z = W + lam * D.dot(D.transpose()) 
    z = spsolve(Z, w*y) 
    w = p * (y > z) + (1-p) * (y < z) 
    return z 
0

Я знаю, что это старый вопрос, но я stumpled на него несколько месяцев назад и реализовал эквивалентный ответ, используя spicy.sparse процедуры.

# Baseline removal                        

def baseline_als(y, lam, p, niter=10):                   

    s = len(y)                        
    # assemble difference matrix                    
    D0 = sparse.eye(s)                      
    d1 = [numpy.ones(s-1) * -2]                    
    D1 = sparse.diags(d1, [-1])                    
    d2 = [ numpy.ones(s-2) * 1]                    
    D2 = sparse.diags(d2, [-2])                    

    D = D0 + D2 + D1                       
    w = np.ones(s)                       
    for i in range(niter):                     
     W = sparse.diags([w], [0])                   
     Z = W + lam*D.dot(D.transpose())                 
     z = spsolve(Z, w*y)                     
     w = p * (y > z) + (1-p) * (y < z)                  

    return z 

Cheers,

Педро.

Смежные вопросы