Python 为什么曲线拟合不收敛于贝塔函数拟合?
当我试图将一个beta函数与几个点匹配时,我的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])
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 ]]