【问题标题】:Issue with Scipy's Optimize Curve FitScipy 的优化曲线拟合问题
【发布时间】:2021-05-02 22:29:20
【问题描述】:

首先,我在编程方面不是最有经验的(或者也不是那么出色)。我有点只是谷歌功能和猜测,直到它工作。因此,很多关于 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

谢谢!

【问题讨论】:

  • 嗨内森。欢迎!我想轻轻地告诉你,社区中有一些粗鲁的成员会对“我只是在谷歌功能和猜测直到它起作用”做出相当消极的反应。话虽如此,我祝你好运。我知道你来自哪里。
  • 您可以编辑您的问题以包含确切的输出吗?您是否收到 SVD 收敛错误?线性错误?
  • 好的,刚刚编辑了它。它确实打印了矩阵,因此程序不会在优化功能上停止。所有的矩阵元素都只是无穷大......

标签: python python-3.x scipy scipy-optimize


【解决方案1】:

任何曲线的最佳拟合高斯都可以通过解析找到。

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

但是您的数据不太适合高斯,因为高斯在远离中心的地方消失了。

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

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)

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

【讨论】:

    猜你喜欢
    • 2022-12-11
    • 2021-11-01
    • 2018-08-16
    • 1970-01-01
    • 2017-04-21
    • 2021-02-16
    • 2018-11-20
    • 1970-01-01
    • 2019-08-08
    相关资源
    最近更新 更多