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