好吧,所以我很感激这需要一点耐心,但请耐心等待。我正在分析一些拉曼光谱,并编写了一个程序的基础,用Scipy曲线拟合来拟合数据中的多个洛伦兹曲线。诀窍是我有太多的数据,我想让程序自动识别洛伦兹人的初始猜测,而不是手动操作。总的来说,这个程序给了它一个很好的结果(并且可能对其他具有类似用例和更简单数据的人有用),但是我对Scipy的了解还不足以优化曲线拟合,使其能够在许多不同的例子中工作。在
此处代码回购:https://github.com/btjones-me/raman_spectroscopy
图1显示了它工作良好的一个例子。在
问题的一部分是我的寻峰算法,它有时很难为每个洛伦兹方程找到合适的起始位置。您可以在图2中看到这一点。在
下一个问题是,由于某些原因,曲线拟合偶尔会出现灾难性的偏离(我的最佳猜测是由于舍入错误)。您可以在图3中看到这种行为。在
最后,虽然我通常能很好地猜测每个洛伦兹曲线的高度和x位置,但我还没有找到一个好的方法来预测曲线的宽度或半宽。预测这可能有助于曲线拟合。在
如果有人能以任何方式帮助解决这些问题,我将不胜感激。我愿意接受任何其他方法或建议,包括额外的第三方库,只要它们在当前的实现上有所改进。非常感谢任何尝试过这个的人!在
在这里,它的工作完全符合我的意图:
下面你可以看到,找峰方法未能识别出所有的峰。有很多寻峰算法,但我使用的是Scipy的“find_peaks_cwt()”(通常情况下并不坏,这是一个极端情况)。
在这里,它只是完全远离。这种情况经常发生,我真的不明白为什么,也无法阻止它的发生。当我告诉它找到比光谱中更多/更少的峰时,可能会发生这种情况,但这只是猜测。
我在python3.5.2中做过这个。PS我知道我不会因为代码布局赢得任何奖章,但一如既往地欢迎对代码风格和更好的实践的评论。在
我偶然发现这个是因为我正试图解决完全相同的问题,这是我的解决方案。对于每一个峰,我只把洛伦兹方程拟合在域+或-1/2,距离下一个最近的峰的距离。以下是我的函数,它确实可以分解域:
这是一张结果图,虚线表示洛伦兹人适合的区域: Lorentzian Fitting Plot
相关问题 更多 >
编程相关推荐