Python SciPy曲线_与np.log拟合后立即返回popt=p0,pcov=inf
我正在尝试使用Python SciPy曲线_与np.log拟合后立即返回popt=p0,pcov=inf,python,numpy,scipy,curve-fitting,logarithm,Python,Numpy,Scipy,Curve Fitting,Logarithm,我正在尝试使用scipy.optimize.curve\u fit对数据集的对数拟合进行优化。在实际数据集上尝试之前,我编写了在虚拟数据集上运行的代码 def do_fitting(): x = np.linspace(0, 4, 100) y = func(x, 1.1, .4, 5) y2 = y + 0.2 * np.random.normal(size=len(x)) popt, pcov = curve_fit(func, x, y2, p0=np.a
scipy.optimize.curve\u fit
对数据集的对数拟合进行优化。在实际数据集上尝试之前,我编写了在虚拟数据集上运行的代码
def do_fitting():
x = np.linspace(0, 4, 100)
y = func(x, 1.1, .4, 5)
y2 = y + 0.2 * np.random.normal(size=len(x))
popt, pcov = curve_fit(func, x, y2, p0=np.array([2, 0.5, 1]))
plt.figure()
plt.plot(x, y, 'bo', label="Clean Data")
plt.plot(x, y2, 'ko', label="Fuzzed Data")
plt.plot(x, func(x, *popt), 'r-', label="Fitted Curve")
plt.legend()
plt.show()
当然,do\u fitting()
依赖于func()
,它将其传递到curve\u fit
。问题出在这里。当我传递一个包含np.log
的func()
时,即我实际想要拟合的函数,curve\u fit
声明p0
(初始条件)是最优解,并立即以无限协方差返回
如果使用非对数的func()
运行do_fitting()
,会发生以下情况:
下面是我使用对数func()
运行do\u fitting()
时发生的情况:
您会注意到,popt
的对数解等于我在上述do\u fitting()
中为p0
给出的curve\u fit
值。这是真的,pcov
是无限的,对于我尝试过的p0
的每一个值
我在这里做错了什么?我能够使用以下代码(几乎没有修改原始代码)很好地拟合对数函数: (不幸的是,我无法发布最终拟合的图片,但它与干净的数据非常吻合) 很可能你的问题不是对数本身,而是曲线拟合对于你试图拟合的特定函数有一些困难。你能编辑你的问题来提供一个你想要拟合的精确对数函数的例子吗 编辑:您提供的函数没有为x=0定义好,执行时会产生RuntimeWarning。curve_fit不擅长处理NAN,在这种情况下无法拟合函数。如果你把x改成
x = np.linspace(1, 4, 100)
曲线拟合执行得很好。我使用以下代码(几乎没有修改原始代码)可以很好地拟合对数函数: (不幸的是,我无法发布最终拟合的图片,但它与干净的数据非常吻合) 很可能你的问题不是对数本身,而是曲线拟合对于你试图拟合的特定函数有一些困难。你能编辑你的问题来提供一个你想要拟合的精确对数函数的例子吗 编辑:您提供的函数没有为x=0定义好,执行时会产生RuntimeWarning。curve_fit不擅长处理NAN,在这种情况下无法拟合函数。如果你把x改成
x = np.linspace(1, 4, 100)
曲线拟合执行得很好。问题非常简单-由于
x
数组中的第一个值是0,因此您将取0的日志,它等于-inf
:
x = np.linspace(0, 4, 100)
p0 = np.array([2, 0.5, 1])
print(func(x, *p0).min())
# -inf
问题很简单-因为
x
数组中的第一个值是0,所以您使用的日志是0,它等于-inf
:
x = np.linspace(0, 4, 100)
p0 = np.array([2, 0.5, 1])
print(func(x, *p0).min())
# -inf
一种可能性是,您正在获取0或负数的日志。很难说,因为你还没有告诉我们什么是
func
,我们只知道它包含np.log
。@ali\m在编辑中添加了func。我以为我一直都在那里;对此很抱歉。一种可能是您的日志为0或负数。很难说,因为你还没有告诉我们什么是func
,我们只知道它包含np.log
。@ali\m在编辑中添加了func。我以为我一直都在那里;很抱歉。根据阿里的建议,已经完成了。函数的日志为0(linspace中的第一个项),这就是为什么np.log(x+b)
func()有效-b将其设为非零。哦。看起来你们都能在我打字的时候找到答案。根据阿里的建议,已经搞定了。函数的日志为0(linspace中的第一个项),这就是为什么np.log(x+b)
func()有效-b将其设为非零。哦。看起来你们都能在我输入答案的时候找到答案。是的,你们一发表评论就发现了。对不起,我第一次没有包括这个功能;我可以发誓我有。谢谢。是的,你一发表评论就抓到了。对不起,我第一次没有包括这个功能;我可以发誓我有。谢谢
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def func(x, a, b, c):
return a * np.log(x+b) + c
def do_fitting():
x = np.linspace(0, 4, 100)
y = func(x, 1.1, .4, 5)
y2 = y + 0.2 * np.random.normal(size=len(x))
popt, pcov = curve_fit(func, x, y2, p0=np.array([2, 0.5, 1]))
plt.figure()
plt.plot(x, y, 'bo', label="Clean Data")
plt.plot(x, y2, 'ko', label="Fuzzed Data")
plt.plot(x, func(x, *popt), 'r-', label="Fitted Curve")
plt.legend()
plt.show()
do_fitting()
x = np.linspace(1, 4, 100)
x = np.linspace(0, 4, 100)
p0 = np.array([2, 0.5, 1])
print(func(x, *p0).min())
# -inf