我正在对预测函数进行设置结果。该函数可能被解释为线性,但我可能需要稍微更改它,所以我做曲线拟合而不是线性回归。我在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。红色的是一个scipy fit。我把拳头放在前三个点上。
答案 0 :(得分:1)
您正在使用非线性拟合例程来拟合数据,而不是A\b
调用的线性最小二乘法。结果是matlab和/或scipy最小化例程在优化期间陷入局部最小值,导致不同的结果。
如果在使用A\b
(在matlab中)进行线性拟合之前将日志应用于原始数据,则应得到相同的结果(在数值精度范围内)。
修改的
检查函数fitFunc1
看起来x/y
数据在scipy中的拟合之前已经被转换了。
我使用matlab对显示的数据进行了线性拟合。使用线性最小二乘法和操作polyfit(x,y,1)
(基本上是线性拟合)的结果与scipy结果非常相似:
在任何情况下,数据看起来都是分段线性的,因此更好的解决方案可能尝试分段线性拟合。另一方面,日志转换可以执行各种不需要的操作,因此在不执行日志转换的情况下对原始数据执行非线性拟合可能是最佳解决方案。
答案 1 :(得分:-1)