【发布时间】:2014-03-28 12:31:46
【问题描述】:
我有许多短时间序列(可能是 30 到 100 个时间点),它们具有一般形状:它们从高位开始,迅速下降,可能会或可能不会在零附近稳定,然后回升。如果它们不平稳,它们看起来就像一个简单的二次曲线,如果它们确实是平稳的,那么您可能会有一长串零。
我正在尝试使用lmfit 模块来拟合连续的分段线性曲线。 我想推断线条在哪里改变梯度,也就是说,我想知道曲线在哪里“定性地”改变梯度。我想知道梯度什么时候停止下降,什么时候又开始增加,一般来说。我遇到了一些问题:
-
lmfit似乎至少需要两个参数,所以我必须通过_。 - 我不确定如何将一个参数限制为大于另一个参数。
- 我收到
could not broadcast input array from shape (something) into shape (something)错误
这里有一些代码。首先,我的目标函数,要最小化。
def piecewiselinear(params, data, _) :
t1 = params["t1"].value
t2 = params["t2"].value
m1 = params["m1"].value
m2 = params["m2"].value
m3 = params["m3"].value
c = params["c"].value
# Construct continuous, piecewise-linear fit
model = np.zeros_like(data)
model[:t1] = c + m1 * np.arange(t1)
model[t1:t2] = model[t1-1] + m2 * np.arange(t2 - t1)
model[t2:] = model[t2-1] + m3 * np.arange(len(data) - t2)
return model - data
然后我打电话,
p = lmfit.Parameters()
p.add("t1", value = len(data)/4, min = 1, max = len(data))
p.add("t2", value = len(data)/4*3, min = 2, max = len(data))
p.add("m1", value = -100., max=0)
p.add("m2", value = 0.)
p.add("m3", value = 20., min = 1.)
p.add("c", min=0, value = 800.)
result = lmfit.minimize(piecewiselinear, p, args = (data, _) )
该模型是,在某个时间 t1,线的梯度发生变化,并且在 t2 发生同样的情况。这两个参数,以及线段的梯度(和一个截距)都需要推断。
我可以使用 MCMC 方法做到这一点,但我有太多这些系列,而且需要太长时间。
部分回溯:
15 model = np.zeros_like(data)
16 model[:t1] = c + m1 * np.arange(t1)
---> 17 model[t1:t2] = model[t1-1] + m2 * np.arange(t2-t1)
18 model[t2:] = model[t2-1] + m3 * np.arange(len(data) - t2)
19
ValueError: could not broadcast input array from shape (151) into shape (28)
时间序列的几个例子:
欢迎提出任何建议。非常感谢。
【问题讨论】:
标签: python time-series mathematical-optimization minimization inference