我正在尝试将简单的线性最小二乘问题转换为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来完成我手动完成的操作(线性化问题,然后使用矩阵乘法求解)
答案 0 :(得分:1)
statsmodels在这里没有任何帮助,至少现在没有。
我认为你的线性化非线性最小二乘优化本质上是scipy.optimize.leastsq在内部所做的。它有几个用户友好或扩展的包装器,例如scipy.optimize.curve_fit或lmfit包。
Statsmodels目前没有等效迭代求解器的通用版本。
Statsmodels在GLM和RLM等几个模型中使用迭代重加权最小二乘法作为优化器。但是,这些是特定于模型的实现。在这些情况下,statsmodels使用WLS(加权最小二乘法)计算线性模型在计算下一步时的解决方案的等价物。