2024-06-16 08:58:31 发布
网友
我想用霍克斯过程来模拟一些数据。我无法确定PyMC是否支持Hawkes过程。更具体地说,我想用Hawkes过程得到一个观察变量,并学习其参数的后验函数。
如果它不存在,那么我可以在PyMC中以某种方式定义它吗?例如@deterministic等等。??
你的问题已经有很长一段时间了,但是我今天已经在PyMC上解决了,所以我想把我的实现要点分享给其他可能遇到同样问题的人。我们将推导出Hawkes过程的参数λ和α。我不打算讨论时间尺度参数β,我将把它留给读者作为练习。在
首先,让我们生成一些数据:
def hawkes_intensity(mu, alpha, points, t): p = np.array(points) p = p[p <= t] p = np.exp(p - t) return mu + alpha * np.sum(p) def simulate_hawkes(mu, alpha, window): t = 0 points = [] lambdas = [] while t < window: m = hawkes_intensity(mu, alpha, points, t) s = np.random.exponential(scale=1/m) ratio = hawkes_intensity(mu, alpha, points, t + s) t = t + s if t < window: points.append(t) lambdas.append(ratio) else: break points = np.sort(np.array(points, dtype=np.float32)) lambdas = np.array(lambdas, dtype=np.float32) return points, lambdas # parameters window = 1000 mu = 8 alpha = 0.25 points, lambdas = simulate_hawkes(mu, alpha, window) num_points = len(points)
我们只是使用我从那里改编的一些函数生成了一些时间点:https://nbviewer.jupyter.org/github/MatthewDaws/PointProcesses/blob/master/Temporal%20points%20processes.ipynb
现在,技巧是创建一个大小矩阵(num_points,num_points),其中包含第i个点到所有其他点的时间距离。所以矩阵的(i,j)点是将第i个点与第j个点分开的时间间隔。这个矩阵将用于计算Hawkes过程的指数之和,即自激部分。创建这个矩阵以及指数和的方法有点棘手。我建议你自己检查每一行,这样你就可以看到它们做了什么。在
我们有点,我们有一个包含激发项和的矩阵。 Hawkes过程的两个连续事件之间的持续时间服从参数λ=λ0+∑激励的指数分布。这就是我们要建模的,但首先我们必须计算生成数据的两个连续点之间的持续时间。在
interval = points[1:] - points[:-1]
我们现在可以推断了:
with pm.Model() as model: λ = pm.Exponential("λ", 1) α = pm.Uniform("α", 0, 1) lam = pm.Deterministic("lam", λ + α * Σ) interarrival = pm.Exponential( "interarrival", lam, observed=interval) trace = pm.sample(2000, tune=4000) pm.plot_posterior(trace, var_names=["λ", "α"]) plt.show() print(np.mean(trace["λ"])) print(np.mean(trace["α"]))
7.829 0.284
注意:如果有很多数据点,tile矩阵可能会变得非常大。在
tile
你的问题已经有很长一段时间了,但是我今天已经在PyMC上解决了,所以我想把我的实现要点分享给其他可能遇到同样问题的人。我们将推导出Hawkes过程的参数λ和α。我不打算讨论时间尺度参数β,我将把它留给读者作为练习。在
首先,让我们生成一些数据:
我们只是使用我从那里改编的一些函数生成了一些时间点:https://nbviewer.jupyter.org/github/MatthewDaws/PointProcesses/blob/master/Temporal%20points%20processes.ipynb
现在,技巧是创建一个大小矩阵(num_points,num_points),其中包含第i个点到所有其他点的时间距离。所以矩阵的(i,j)点是将第i个点与第j个点分开的时间间隔。这个矩阵将用于计算Hawkes过程的指数之和,即自激部分。创建这个矩阵以及指数和的方法有点棘手。我建议你自己检查每一行,这样你就可以看到它们做了什么。在
^{pr2}$我们有点,我们有一个包含激发项和的矩阵。 Hawkes过程的两个连续事件之间的持续时间服从参数λ=λ0+∑激励的指数分布。这就是我们要建模的,但首先我们必须计算生成数据的两个连续点之间的持续时间。在
我们现在可以推断了:
注意:如果有很多数据点,
tile
矩阵可能会变得非常大。在相关问题 更多 >
编程相关推荐