scipy中的曲线拟合质量很差。我怎样才能改进它?

时间:2013-09-09 13:36:17

标签: python matlab numpy scipy curve-fitting

我正在对预测函数进行设置结果。该函数可能被解释为线性,但我可能需要稍微更改它,所以我做曲线拟合而不是线性回归。我在curve_fit中使用scipy函数。这是我如何使用它

 kappa = 1
        alpha=2
        popt,pcov = curve_fit(fitFunc1,self.X[0:3],self.Y[0:3],sigma=self.Err[0:3],p0=[kappa,alpha])

这里是fitFunc1

def fitFunc1(X,kappa,alpha):

    out = []
    for x in X:
        y = log(kappa)
        y += 4*log(pi)
        y += alpha*x 
        y -= 2*log(2)
        out.append(-y)
    return np.array(out)

以下是适合enter image description here的示例。绿线适合matlab。红色的是一个scipy fit。我把拳头放在前三个点上。

2 个答案:

答案 0 :(得分:1)

您正在使用非线性拟合例程来拟合数据,而不是A\b调用的线性最小二乘法。结果是matlab和/或scipy最小化例程在优化期间陷入局部最小值,导致不同的结果。

如果在使用A\b(在matlab中)进行线性拟合之前将日志应用于原始数据,则应得到相同的结果(在数值精度范围内)。

修改

检查函数fitFunc1看起来x/y数据在scipy中的拟合之前已经被转换了。

我使用matlab对显示的数据进行了线性拟合。使用线性最小二乘法和操作polyfit(x,y,1)(基本上是线性拟合)的结果与scipy结果非常相似:

enter image description here

在任何情况下,数据看起来都是分段线性的,因此更好的解决方案可能尝试分段线性拟合。另一方面,日志转换可以执行各种不需要的操作,因此在不执行日志转换的情况下对原始数据执行非线性拟合可能是最佳解决方案。

答案 1 :(得分:-1)

如果你不介意做一些额外的工作我建议使用PyMinuitiMinuit,两者都是基于Seal Minuit的最小化包。

然后,您可以最小化Chi Sq函数或最大化数据与拟合函数相关的可能性。它们还提供了所有错误以及您想要了解的所有错误。


希望这有帮助!的xD