【问题标题】:Python lmfit - how come the intercept's estimation in a linear regression depends on the starting value?Python lmfit - 线性回归中的截距估计如何取决于起始值?
【发布时间】:2014-03-22 17:20:24
【问题描述】:

我试图弄清楚使用lmfit 包的截距估计如何产生不同的结果,具体取决于起始值。我使用statsmodels 将估计结果与标准OLS 估计的结果进行比较。 有人可以帮忙吗?

代码:

from lmfit import minimize, Parameters
import numpy as np
import statsmodels.api as sm

x = np.linspace(0, 15, 10)
x_ols = sm.add_constant(x)
y = range(0,10)

model = sm.OLS(y,x_ols)
results = model.fit()
print "OLS: ", format(results.params[0], '.10f'), format(results.params[1], '.10f')


# define objective function: returns the array to be minimized
def fcn2min(params, x, data):
    a = params['a'].value
    b = params['b'].value

    model = a + b * x
    return model - data

for i in range(-2,3):
    # create a set of Parameters
    params = Parameters()
    params.add('a', value= i)
    params.add('b', value= 20)

    # do fit, here with leastsq model
    result = minimize(fcn2min, params, args=(x, y))
    # print "lmfit: ",result.values # older usage
    print "lmfit: ",result.params.values # newer syntax 

【问题讨论】:

    标签: python scipy least-squares


    【解决方案1】:

    如果您查看结果,您会发现常数接近于 scipy.optimize.leastsq 的默认容差的零。

    OLS:  -0.0000000000 0.6000000000
    lmfit:  {'a': 1.1967327242889913e-08, 'b': 0.59999999932429748}
    lmfit:  {'a': 3.2643846243929039e-08, 'b': 0.59999999717671448}
    lmfit:  {'a': 3.2644232427278463e-08, 'b': 0.59999999717679642}
    lmfit:  {'a': 1.636450187584131e-08, 'b': 0.59999999900662315}
    lmfit:  {'a': 3.3578611617157454e-08, 'b': 0.59999999693286854}
    

    如果我使所需的公差更严格,那么常数的估计值更接近于零,并且两个估计的系数都更接近 OLS 解。

    xtol 添加到您的代码后

    result = minimize(fcn2min, params, args=(x, y), xtol=1e-12)
    

    我明白了:

    OLS:  -0.0000000000 0.6000000000
    lmfit:  {'a': -3.5437341988915725e-32, 'b': 0.59999999999999998}
    lmfit:  {'a': -1.8490806236697864e-32, 'b': 0.59999999999999998}
    lmfit:  {'a': -9.8614500814838325e-32, 'b': 0.59999999999999998}
    lmfit:  {'a': 8.328833474508222e-09, 'b': 0.59999999921839664}
    lmfit:  {'a': -5.8547746020524404e-32, 'b': 0.59999999999999998}
    

    OLS 使用线性代数来获得显式解(基于广义逆,pinv)。因此数值精度很高。

    非线性优化使用迭代解决方案,并在其处于所需公差范围内时停止。

    示例中仍有一种情况仅在 8e-9 处正确,但这也可能是因为梯度的数值近似以及其他影响收敛检查的因素。

    【讨论】:

    • 非常感谢。您是否愿意在stackoverflow.com/questions/22581887/… 回答我关于 lmfit 的另一个问题?我不知道如何从 lmfit 中检索 R 平方,我必须使用 lmfit,因为我正在处理约束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2022-01-09
    • 1970-01-01
    • 2017-03-01
    • 2019-05-27
    相关资源
    最近更新 更多