Python 为什么曲线拟合不收敛于贝塔函数拟合?

Python 为什么曲线拟合不收敛于贝塔函数拟合?,python,curve-fitting,data-fitting,model-fitting,function-fitting,Python,Curve Fitting,Data Fitting,Model Fitting,Function Fitting,当我试图将一个beta函数与几个点匹配时,我的Python代码有一个小问题。问题是,要么解不收敛(结果系数是nans),要么什么都不做(结果与我最初的猜测相同),要么它显然是适合的,但拟合与数据点根本不相似。 我一直在阅读有关beta函数和曲线拟合的类似帖子,因为这两个问题都在stackoverflow文献中讨论过,但我还没有找到解决我遇到的具体问题的方法,所以我想知道你是否能给我一些想法 我有一系列要点: x = np.array([0.1, 0.3, 0.5, 0.7, 0.9, 1.1])

当我试图将一个beta函数与几个点匹配时,我的Python代码有一个小问题。问题是,要么解不收敛(结果系数是
nans
),要么什么都不做(结果与我最初的猜测相同),要么它显然是适合的,但拟合与数据点根本不相似。 我一直在阅读有关beta函数和曲线拟合的类似帖子,因为这两个问题都在stackoverflow文献中讨论过,但我还没有找到解决我遇到的具体问题的方法,所以我想知道你是否能给我一些想法

我有一系列要点:

x = np.array([0.1, 0.3, 0.5, 0.7, 0.9, 1.1])
y = np.array([0.45112234, 0.56934313, 0.3996803 , 0.28982859, 0.19682153,
   0.]
然后我尝试使用
curve\u fit
函数对它们进行拟合,如下所示:

from scipy.optimize import curve_fit
from scipy.special import gamma as gamma
def betafunc(x,a,b,cst):
    return cst*gamma(a+b) * (x**(a-1)) * ((1-x)**(b-1))  / ( gamma(a)*gamma(b) )
popt2,pcov2 = curve_fit(betafunc,x,y,p0=(0.5,1.5,0.5))
这就是我的问题所在,因为根据我最初的猜测,我得到的要么是
popt2=[nan,nan,nan]
,要么是
popt2=p0
,或者是一些在绘制时根本不模拟数据的值

我也知道beta函数适用于0
…我已经安装了另一个配置文件(也使用了三个免费参数),并且没有问题,所以我不理解为什么这个其他beta配置文件不起作用。我们衷心感谢您的指导

您的实现是针对β分布的概率密度函数(而不是β函数)。它是在间隔0上定义的。您可以发布一个完整的代码示例吗?我猜
曲线拟合
来自
scipy.optimize
。但是什么是
v2
?@Dietmar,对不起,v2应该更改,我现在就编辑它。Thanks@Enrique使用您的代码并删除最后一点(x>1),拟合收敛不会出现问题。
-0.1**-0.5
在不进入虚数领域的情况下应该是什么意思?您甚至会收到一条错误消息:
RuntimeWarning:power中遇到无效值
噢,yikes,您是对的@ChristianK.,我不知道如何在正确的代码中执行相同操作,但失败了。现在我认为这很可能是我代码中其他部分的问题,可能是双重定义或类似的问题,但可以肯定的是,问题出在其他地方,因为正如你所意识到的,我实际上只使用了我问题中的几行,它实际上是有效的。我会找出问题所在,但现在这个问题毫无用处。无论如何,谢谢你的检查!
import numpy as np
from scipy.optimize import curve_fit
from scipy.special import gamma as gamma
def betafunc(x,a,b,cst):
    return cst*gamma(a+b) * (x**(a-1)) * ((1-x)**(b-1))  / ( gamma(a)*gamma(b) )

x = np.array( [0.1, 0.3, 0.5, 0.7, 0.9, 1.1])
y = np.array( [0.45112234, 0.56934313, 0.3996803 , 0.28982859, 0.19682153, 0.] )


popt2,pcov2 = curve_fit(betafunc,x[:-1],y[:-1],p0=(0.5,1.5,0.5))

print popt2
print pcov2
[ 1.22624727  1.74192827  0.37084996]
[[ 0.03758865  0.04888083 -0.00132468]
 [ 0.04888083  0.09142608 -0.00309165]
 [-0.00132468 -0.00309165  0.00094766]]
import numpy as np
from scipy.optimize import curve_fit
from scipy.special import gamma as gamma
def betafunc(x,a,b,cst,scale):
    x = x / scale
    return cst*gamma(a+b) * (x**(a-1)) * ((1-x)**(b-1))  / ( gamma(a)*gamma(b) )

x = np.array( [0.1, 0.3, 0.5, 0.7, 0.9, 1.1])
y = np.array( [0.45112234, 0.56934313, 0.3996803 , 0.28982859, 0.19682153, 0.] )

popt2,pcov2 = curve_fit(betafunc,x,y,p0=(0.5,1.5,0.5,1.1))

print popt2
print pcov2
[ 1.37100253  2.36832069  0.32337175  1.16052822]
[[ 0.04972377  0.15943756 -0.00792804  0.02550767]
 [ 0.15943756  0.71001918 -0.04180131  0.14426687]
 [-0.00792804 -0.04180131  0.00312037 -0.00983075]
 [ 0.02550767  0.14426687 -0.00983075  0.0373759 ]]