我正在尝试将一些Matlab代码转换为曲线拟合我的数据到python代码,但我很难得到类似的答案。数据是:
x = array([ 0. , 12.5 , 24.5 , 37.75, 54. , 70.25, 87.5 ,
108.5 , 129.5 , 150.5 , 171.5 , 193.75, 233.75, 273.75])
y = array([-8.79182857, -5.56347794, -5.45683824, -4.30737662, -1.4394612 ,
-1.58047016, -0.93225927, -0.6719836 , -0.45977157, -0.37622436,
-0.56115757, -0.3038559 , -0.26594558, -0.26496367])
Matlab代码是:
function [estimates, model] = curvefit(xdata, ydata)
% fits data to the curve y(x)=A-B*e(-lambda*x)
start_point = rand(1,3);
model =@efun;
options = optimset('Display','off','TolFun',1e-16,'TolX',1e-16);
estimates = fminsearch(model, start_point,options);
% expfun accepts curve parameters as inputs, and outputs sse,
% the sum of squares error for A -B* exp(-lambda * xdata) - ydata,
% and the FittedCurve.
function [sse,FittedCurve] = efun(v)
A=v(1);
B=v(2);
lambda=v(3);
FittedCurve =A - B*exp(-lambda*xdata);
ErrorVector=FittedCurve-ydata;
sse = sum(ErrorVector .^2);
end
end
err = Inf;
numattempts = 100;
for k=1:numattempts
[intermed,model]=curvefit(x, y));
[thiserr,thismodel]=model(intermed);
if thiserr<err
err = thiserr;
coeffs = intermed;
ymodel = thismodel;
end
到目前为止我在Python中有:
import numpy as np
from pandas import Series, DataFrame
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
from scipy.optimize import curve_fit
import pickle
def fitFunc(A, B, k, t):
return A - B*np.exp(-k*t)
init_vals = np.random.rand(1,3)
fitParams, fitCovariances = curve_fit(fitFunc, y, x], p0=init_vals)
我认为我必须对p0运行100次尝试做一些事情,但是曲线只会收敛大约1/10倍,它会收敛到一条直线,与我在Matlab中得到的值相差不多。我所看到的关于曲线拟合的大多数问题都使用B np.exp(-k t)+ A,但我上面的指数公式是我必须用于此数据的公式。有什么想法吗?谢谢你的时间!
答案 0 :(得分:1)
curve_fit(fitFunc, y, x], p0=init_vals)
应为curve_fit(fitFunc, x,y, p0=init_vals)
,即x在y之前。 fitFunc(A, B, k, t)
应为fitFunc(t,A, B, k)
。自变量首先出现。请参阅以下代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
x = np.array([ 0. , 12.5 , 24.5 , 37.75, 54. , 70.25, 87.5 ,
108.5 , 129.5 , 150.5 , 171.5 , 193.75, 233.75, 273.75])
y = np.array([-8.79182857, -5.56347794, -5.45683824, -4.30737662, -1.4394612 ,
-1.58047016, -0.93225927, -0.6719836 , -0.45977157, -0.37622436,
-0.56115757, -0.3038559 , -0.26594558, -0.26496367])
def fitFunc(t, A, B, k):
return A - B*np.exp(-k*t)
init_vals = np.random.rand(1,3)
fitParams, fitCovariances = curve_fit(fitFunc, x, y, p0=init_vals)
print fitParams
plt.plot(x,y)
plt.plot(x,fitFunc(x,*fitParams))
plt.show()