使用statsmodels求解线性最小二乘法

时间:2014-12-17 20:36:05

标签: python pandas least-squares statsmodels

我正在尝试将简单的线性最小二乘问题转换为statsmodel,以便学习如何将它用于迭代最小二乘:

(人为的)数据包括球落下给定距离所需时间的测量值。

distance    time
10          1.430
20          2.035
30          2.460
40          2.855

使用这些测量,我想确定由于重力引起的加速度,使用:

t = sqrt(2s/g)

这显然是非线性的,但我可以将其线性化(F(x - + x)= l 0 + v,其中x - 是临时值),然后使用g(10)的临时值来计算F(g),并在必要时进行迭代:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

measurements = pd.DataFrame({
    'distance': [10, 20, 30, 40],
    'time': [1.430, 2.035, 2.460, 2.855]
})

prov_g = 10
measurements['fg'] = measurements['distance'].apply(
    lambda d: ((2 * d) ** 0.5) * (prov_g ** -0.5))
measurements['A_matrix'] = measurements['distance'].apply(
    lambda d: -np.sqrt(d / 2) * (prov_g ** -1.5))
measurements['b'] = measurements['time'] - measurements['fg']
ATA = np.dot(measurements['A_matrix'], measurements['A_matrix'].T)
ATb = np.dot(measurements['A_matrix'].T, measurements['b'])
x = np.dot(ATA ** -1, ATb)
updated_g = prov_g + x
updated_g

>>> 9.807

我无法从示例中弄清楚我如何使用求解statsmodel来完成我手动完成的操作(线性化问题,然后使用矩阵乘法求解)

1 个答案:

答案 0 :(得分:1)

statsmodels在这里没有任何帮助,至少现在没有。

我认为你的线性化非线性最小二乘优化本质上是scipy.optimize.leastsq在内部所做的。它有几个用户友好或扩展的包装器,例如scipy.optimize.curve_fit或lmfit包。

Statsmodels目前没有等效迭代求解器的通用版本。

Statsmodels在GLM和RLM等几个模型中使用迭代重加权最小二乘法作为优化器。但是,这些是特定于模型的实现。在这些情况下,statsmodels使用WLS(加权最小二乘法)计算线性模型在计算下一步时的解决方案的等价物。