在Python3中使用scipy对多个lorentzian进行数据拟合

2024-05-08 15:15:04 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,所以我很感激这需要一点耐心,但请耐心等待。我正在分析一些拉曼光谱,并编写了一个程序的基础,用Scipy曲线拟合来拟合数据中的多个洛伦兹曲线。诀窍是我有太多的数据,我想让程序自动识别洛伦兹人的初始猜测,而不是手动操作。总的来说,这个程序给了它一个很好的结果(并且可能对其他具有类似用例和更简单数据的人有用),但是我对Scipy的了解还不足以优化曲线拟合,使其能够在许多不同的例子中工作。在

此处代码回购:https://github.com/btjones-me/raman_spectroscopy

图1显示了它工作良好的一个例子。在

问题的一部分是我的寻峰算法,它有时很难为每个洛伦兹方程找到合适的起始位置。您可以在图2中看到这一点。在

下一个问题是,由于某些原因,曲线拟合偶尔会出现灾难性的偏离(我的最佳猜测是由于舍入错误)。您可以在图3中看到这种行为。在

最后,虽然我通常能很好地猜测每个洛伦兹曲线的高度和x位置,但我还没有找到一个好的方法来预测曲线的宽度或半宽。预测这可能有助于曲线拟合。在

如果有人能以任何方式帮助解决这些问题,我将不胜感激。我愿意接受任何其他方法或建议,包括额外的第三方库,只要它们在当前的实现上有所改进。非常感谢任何尝试过这个的人!在

在这里,它的工作完全符合我的意图: Fig1

下面你可以看到,找峰方法未能识别出所有的峰。有很多寻峰算法,但我使用的是Scipy的“find_peaks_cwt()”(通常情况下并不坏,这是一个极端情况)。 Fig2

在这里,它只是完全远离。这种情况经常发生,我真的不明白为什么,也无法阻止它的发生。当我告诉它找到比光谱中更多/更少的峰时,可能会发生这种情况,但这只是猜测。 Fig3

我在python3.5.2中做过这个。PS我知道我不会因为代码布局赢得任何奖章,但一如既往地欢迎对代码风格和更好的实践的评论。在


Tags: 数据方法代码程序算法情况scipy手动
1条回答
网友
1楼 · 发布于 2024-05-08 15:15:04

我偶然发现这个是因为我正试图解决完全相同的问题,这是我的解决方案。对于每一个峰,我只把洛伦兹方程拟合在域+或-1/2,距离下一个最近的峰的距离。以下是我的函数,它确实可以分解域:

def get_local_indices(peak_indices):
#returns the array indices of the points closest to each peak (distance to next peak/2)
chunks = []

for i in range(len(peak_indices)):
    peak_index = peak_indices[i]
    if i>0 and i<len(peak_indices)-1:
        distance = min(abs(peak_index-peak_indices[i+1]),abs(peak_indices[i-1]-peak_index))
    elif i==0:
        distance = abs(peak_index-peak_indices[i+1])
    else:
        distance = abs(peak_indices[i-1]-peak_index)


    min_index = peak_index-int(distance/2)
    max_index = peak_index+int(distance/2)
    indices = np.arange(min_index,max_index)

    chunks.append(indices)

return chunks

这是一张结果图,虚线表示洛伦兹人适合的区域: Lorentzian Fitting Plot

相关问题 更多 >