Scipy 的优化曲线拟合问题

问题描述

首先,我在编程方面不是最有经验的(或者也不是最有经验的)。我有点只是谷歌函数和猜测,直到它工作。因此,很多关于 Stack Exchange 和文档的讨论都在我头上。

我遇到了 Scipy 优化曲线拟合功能的问题。我正在尝试将高斯拟合到我得到的一些电压数据中。我运行以下代码

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

data = np.genfromtxt("C:/Hydrogen Data/peak1.csv",delimiter = ',',skip_header=1)
position = data[:,1]
voltage = -data[:,2]

plt.plot(position,voltage)
plt.show()

def gaussian(x,*p):
    A,mu,sigma = p
    return A*np.exp(-(x-mu)**2/(2*sigma**2))

fit,pcov = curve_fit(gaussian,position,voltage,p0 = [0.2,100,2])
plt.plot(fit)
plt.show()
print(pcov)

并且收到无法评估协方差矩阵元素的错误。更具体地说,我得到了这个:“OptimizeWarning:无法估计参数的协方差(category=OptimizeWarning)。”我不完全确定我能做些什么来接近它,因为我读过的一些论坛帖子让我无法理解。有人有什么建议吗?

这是我拟合的数据及其图表

https://drive.google.com/file/d/19PGpqb5pBxCqspCyMOJPF-brI-hvjfbN/view?usp=sharing https://i.stack.imgur.com/v1MKY.png

谢谢!

解决方法

可以通过分析找到最适合任何曲线的高斯分布。

A = np.sum(voltage);
mu = np.sum(position * voltage) / A;
sigma = np.sqrt(np.sum((position - mu)**2 * voltage));

但是您的数据不太适合高斯分布,因为高斯分布远离中心。 enter image description here

而且它是偏斜的,即使我们翻译高斯,拟合也不是很好。

plt.plot(position,voltage)
v0 = min(voltage)
A = np.sum(voltage - v0);
mu = np.sum(position * (voltage - v0)) / A;
sigma = np.sqrt(np.sum((position - mu)**2 * (voltage - v0))/ A);
plt.plot(position,v0 + A / np.sqrt(2 * np.pi) / sigma * np.exp(-(position - mu)**2 / (2 * sigma**2)))
plt.ylim(0,None)

enter image description here

您可能会找到比高斯更好的模型来描述这条曲线。正态分布自然出现在随机系统中。