PyMC是否实施了霍克斯过程?

2024-06-16 08:58:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用霍克斯过程来模拟一些数据。我无法确定PyMC是否支持Hawkes过程。更具体地说,我想用Hawkes过程得到一个观察变量,并学习其参数的后验函数。

如果它不存在,那么我可以在PyMC中以某种方式定义它吗?例如@deterministic等等。??


Tags: 数据函数参数定义过程方式pymc后验
1条回答
网友
1楼 · 发布于 2024-06-16 08:58:31

你的问题已经有很长一段时间了,但是我今天已经在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过程的指数之和,即自激部分。创建这个矩阵以及指数和的方法有点棘手。我建议你自己检查每一行,这样你就可以看到它们做了什么。在

^{pr2}$

我们有点,我们有一个包含激发项和的矩阵。 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矩阵可能会变得非常大。在

相关问题 更多 >