python 曲线拟合结果汇总
python curve fitting with results summary
抱歉,我对 python 还是很陌生,希望有人能帮我解决曲线拟合问题...
我有一个 MxN 数据帧 "data",其中 M 是样本数,N 是变量数 (10)。我有一个 Mx1 因变量 "Fractions",它是对应于每个样本的介于 0 和 1 之间的分数。
我知道如何轻松 运行 自变量 N 和因变量分数之间的多元线性回归,但是,我将回归包装在 S 形回归中以将响应保持在 0 和 1 之间。
我能够像这样执行...
def sigmoid(x,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10):
y = 1 / (1 + np.exp(- (b0 + b1*x[:,0] + b2*x[:,1] + b3*x[:,2] + b4*x[:,3] + b5*x[:,4] +
b6 * x[:,5] + b7*x[:,6] + b8*x[:,7] + b9*x[:,8] + b10*x[:,9])))
return y
popt, pcov = curve_fit(sigmoid,data,fractions)
'''use coefficients from curve_fit to estimate new fraction from new 1xN data'''
newFraction = sigmoid(newData, *popt)
但是,我想为特征选择实现某种逐步多元回归,最好基于 AIC。我使用 python...
找到了以下这些方法
http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFE.html
https://planspace.org/20150423-forward_selection_with_statsmodels/
https://datascience.stackexchange.com/questions/24405/how-to-do-stepwise-regression-using-sklearn/24447#24447
但是所有这些方法都依赖于使用涉及 .fit() 方法的回归。有没有办法使用任何 .fit() 方法(如 statsmodels 或 lmfit)来实现上述模型?我也研究过 Lasso 类型的方法,但是,再次无法弄清楚如何实现我的功能。
我认为你应该能够用 lmfit 做这样的事情(不完整,因为你的例子不完整):
from lmfit import Model
def sigmoid(x,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10):
y = 1 / (1 + np.exp(- (b0 + b1*x[:,0] + b2*x[:,1] + b3*x[:,2] + b4*x[:,3] + b5*x[:,4] +
b6 * x[:,5] + b7*x[:,6] + b8*x[:,7] + b9*x[:,8] + b10*x[:,9])))
return y
smodel = Model(sigmoid)
params = smodel.make_params(b0=1, b1=0, b2=0.1, b3=0.01, b4=0.01, b5=0.01,
b6=0.01, b7=0.01, b8=0.01, b9=0.01, b10=0.01)
result = smodel.fit(data, params, x=x)
这将通过最小化卡方来拟合。
我相信对于任何特定拟合(将有固定数量的数据点和固定数量的变量),最小化卡方也会最小化 AIC(因为卡方是正定的,并且AIC = 2*Nvarys + Ndata * log(chi_square / Ndata)
抱歉,我对 python 还是很陌生,希望有人能帮我解决曲线拟合问题...
我有一个 MxN 数据帧 "data",其中 M 是样本数,N 是变量数 (10)。我有一个 Mx1 因变量 "Fractions",它是对应于每个样本的介于 0 和 1 之间的分数。
我知道如何轻松 运行 自变量 N 和因变量分数之间的多元线性回归,但是,我将回归包装在 S 形回归中以将响应保持在 0 和 1 之间。
我能够像这样执行...
def sigmoid(x,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10):
y = 1 / (1 + np.exp(- (b0 + b1*x[:,0] + b2*x[:,1] + b3*x[:,2] + b4*x[:,3] + b5*x[:,4] +
b6 * x[:,5] + b7*x[:,6] + b8*x[:,7] + b9*x[:,8] + b10*x[:,9])))
return y
popt, pcov = curve_fit(sigmoid,data,fractions)
'''use coefficients from curve_fit to estimate new fraction from new 1xN data'''
newFraction = sigmoid(newData, *popt)
但是,我想为特征选择实现某种逐步多元回归,最好基于 AIC。我使用 python...
找到了以下这些方法http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFE.html https://planspace.org/20150423-forward_selection_with_statsmodels/ https://datascience.stackexchange.com/questions/24405/how-to-do-stepwise-regression-using-sklearn/24447#24447
但是所有这些方法都依赖于使用涉及 .fit() 方法的回归。有没有办法使用任何 .fit() 方法(如 statsmodels 或 lmfit)来实现上述模型?我也研究过 Lasso 类型的方法,但是,再次无法弄清楚如何实现我的功能。
我认为你应该能够用 lmfit 做这样的事情(不完整,因为你的例子不完整):
from lmfit import Model
def sigmoid(x,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10):
y = 1 / (1 + np.exp(- (b0 + b1*x[:,0] + b2*x[:,1] + b3*x[:,2] + b4*x[:,3] + b5*x[:,4] +
b6 * x[:,5] + b7*x[:,6] + b8*x[:,7] + b9*x[:,8] + b10*x[:,9])))
return y
smodel = Model(sigmoid)
params = smodel.make_params(b0=1, b1=0, b2=0.1, b3=0.01, b4=0.01, b5=0.01,
b6=0.01, b7=0.01, b8=0.01, b9=0.01, b10=0.01)
result = smodel.fit(data, params, x=x)
这将通过最小化卡方来拟合。
我相信对于任何特定拟合(将有固定数量的数据点和固定数量的变量),最小化卡方也会最小化 AIC(因为卡方是正定的,并且AIC = 2*Nvarys + Ndata * log(chi_square / Ndata)