1

我正在对预测函数进行一组结果的拟合。该函数可能被解释为线性,但我可能需要稍微改变它,所以我正在做曲线拟合而不是线性回归。我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)

这是一个适合的例子在此处输入图像描述。绿线是 matlab 拟合。红色的很适合。我把拳头放在前三个点上。

4

2 回答 2

1

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

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

编辑

检查功能fitFunc1,看起来x/y数据在适合 scipy.xml 之前已经被转换。

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

在此处输入图像描述

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

于 2013-09-09T13:57:47.643 回答
-1

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

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


希望这可以帮助!xD

于 2013-09-09T14:36:15.303 回答