Temporal Point Processes

Rasmussen J. G. Lecture notes: Temporal point processes and the conditional intensity function. 2018.

TPP

  • 点过程, 里面的内容感觉和 生存模型 很像.

  • 在日常生活中, 我们常常会遇到和时间相关的事件序列:

    h0=(t0,κ0),h1=(t1,κ1),,hn=(tn,κn).

    其中 t 表示事件 κ 发生的时间.

  • 一个惯常的任务是, 基于上述的历史信息, 预测下一可能发生的事件 κn+1, 以及它所发生的具体时间 tn+1.

  • 假设没有两个事件在同一时刻发生, 则必有

    t0<t1<<tn<tn+1.

  • 倘若我们用 f() 来表示概率密度, 则有

    (1)f(h0,h1,,hn,hn+1)=i=0n+1f(hi|Hi1),

    其中 Hi1:=[h0,h1,,hi1].

  • 倘若我们能够建模每一个 f(hi|h<i), 则我们就能够很自然地建模联合概率. TPP 就是这样的一个工具.

Evolutionary point processes

  • 这部分, 我们仅考虑时间的预测, 即建模:

    f(t0,t1,,tn+1)=i=1n+1f(t=ti|Ti1).

    其中 Ti1:=[t0,t1,,ti1]={tjT:tjti1}.

  • 例子 [Renewal process]: 我们以 Renewal Process 这种最简单的随机过程为例. Renewal Process 需要满足: {titi1}i=1n+1独立同分布序列, 即两个事件间的间隔是互相独立且服从统一分布的. 此时我们有:

    f(t=ti|Ti1)=g(titi1),

    这里 g 是某个满足分布条件的密度函数. 比如, 我们可以取 Gamma 分布:

    g(Δt;β,α)=βαΓ(α)Δtα1eβΔt.

  • 下图是设定不同的 β,α 后的结果 (注意 β=0.1,α=1 实际上是泊松过程).



# %%

import numpy as np
from scipy.stats import gamma
from freeplot import FreePlot

# %%

def sample_from_gamma(beta: float, alpha: float, nums: int = 10) -> float:
    return gamma.rvs(
            a = alpha, scale=1 / beta, size=(nums,)
        )


# %%


nums = 20

fp = FreePlot(
    figsize=(2, 5)
)

# Gamma(0.02, 0.2)
times = np.cumsum(sample_from_gamma(0.02, 0.2, nums))
fp.scatterplot(
    x=times, y=np.ones_like(times) * 1, label='Gamma(0.02, 0.2)', style=['scatter', {'markers.fillstyle': 'none'}]
)

# Gamma(0.1, 1)
times = np.cumsum(sample_from_gamma(0.1, 1, nums))
fp.scatterplot(
    x=times, y=np.ones_like(times) * 0, label='Gamma(0.1, 1)'
)

# Gamma(2, 20)
times = np.cumsum(sample_from_gamma(2, 20, nums))
fp.scatterplot(
    x=times, y=np.ones_like(times) * -1, label='Gamma(2, 20)'
)

fp[0, 0].legend()
fp.show()


Conditional intensity function [t]

  • 实际中, 往往不似 Renewal process 这般简单, TPP 求助于如下的 conditional intensity function 来确定最终的密度函数 f (下面的 * 用来强调它是基于 Tt 的):

    λ(t):=limΔt0P(tn+1[t,t+Δt]|Tt)Δt,

    其中 Tt:={tiT:ti<t}. 后面我们令 Ttn=Tn.

  • 令,

    F(t|Ttn)=tntf(t|Ttn)dt=P(tn+1[tn,t]|Ttn)

    为分布函数.

  • 则, 我们有如下关系成立:

    λ(t)=limΔt0P(tn+1[t,t+Δt]|Tt)Δt=limΔt0P(tn+1[t,t+Δt]|tn+1(tn,t),Ttn)Δt=limΔt0P(tn+1[t,t+Δt]|Ttn)ΔtP(tn+1(tn,t)|Ttn)=limΔt0P(tn+1[t,t+Δt]|Ttn)ΔtP(tn+1(tn,t)|Ttn)=11F(t|Ttn)limΔt0P(tn+1[t,t+Δt]|Ttn)Δt=11F(t|Ttn)f(t|Ttn).

  • 一旦我们确定(或者给定) λ(t) (且满足一定的条件), 我们就可以唯一确定 f,F, 注意到

    λ(t)=f(t|Htn)1F(t|Ttn)=dF(t|Htn)dt1F(t|Ttn)=ddtlog(1F(t|Ttn)).

    两边对 [tn,t] 积分, 得到:

    log(1F(t|Ttn))=tntλ(s)dsF(t|Ttn)=1exp(tntλ(s)ds)f(t|Ttn)=λ(t)exp(tntλ(s)ds).

    注: Ttn 建模在 中.

  • λ(t) 所满足的条件, 即令所推到得到的 f 满足密度函数应有的性质:

    1. λ(t)t>tn 上非负可积;
    2. tntλ(s)dst.

Conditional intensity function [t,κ]

  • 这里, 我们同时考虑发生时间和事件, 此时我们类似地定义:

    λ(t,κ):=limΔt0P(tn+1[t,t+Δt],κn+1=κ|Ht)Δt,

    这里 Ht:={hiH:i<t}. 注意, 这里我们考虑事件 κ 所属的空间是离散的, 实际上, 连续的也可以 (改成 κ+Δκ) (但是这里再用区间符号就怪怪的, 但是以离散的眼光审视吧, 结果是一样的).

  • 则, 我们有如下关系成立:

    λ(t,κ)=limΔt0P(tn+1[t,t+Δt],κ|Ht)Δt=limΔt0P(tn+1[t,t+Δt],κ|tn+1(tn,t),Htn)Δt=limΔt0P(tn+1[t,t+Δt],κ|Htn)ΔtP(tn+1(tn,t)|Htn)=limΔt0P(tn+1[t,t+Δt],κ|Ttn)ΔtP(tn+1(tn,t)|Htn)=11F(t|Htn)limΔt0P(tn+1[t,t+Δt],κ|Htn)Δt=11F(t|Htn)f(t,κ|Htn).=11F(t|Htn)f(t|Htn)f(κ|t,Htn)=λ(t)f(κ|t).

    这里我们定义 f(κ|t):=f(κ|t,Htn).

  • 换言之, 我们只要确定 λ,f 即可确定发生时间 + 发生时间的随机过程.

Inference

  • 我不清楚为什么不直接确定 f 而需要一个跳板 λ, 想必是它在推理和抽样上具有特别的性质.

  • 很多时候, 我们需要通过极大似然来拟合模型, 所以似然函数的计算是一个比较重要的问题. 假设我们在 [0,T] 时间段内观测到 [(t0,κ0),,(tn,κn)], 下面介绍其上的似然函数的计算.

  • 定义:

    Λ(t)=0tλ(s)ds.

  • 根据 (1) 可得:

    L=(1F(T|Htn))i=0n+1f(hi|Hi1)

    比较特别的是 (1F(T|Htn)), 即我们可以确定, tn+1 一定发生在 >T 的时间段内.

  • 于是, 我们有:

    L=(i=0nλ(ti))(i=0nf(κi|ti))exp(0Tλ(s)ds).

Simulation

Inverse Method

  • 假设序列 [s0,s1,,tn], 我们有序列 (假设 Λ 可逆)

    [s0=Λ(t0),,sn=Λ(tn)]

    服从 unit rate Poisson process. 即

    f(si|si1,,s0)=f(si|si1)=e(sisi1),si>si1.

    即间隔时间是互相独立的 (且服从 λ=1 的泊松分布).

  • 我们有

    F(s|Hsn)=P(sn+1s|sn,,s0)=P(Λ(tn+1)s|tn,,t0)=P(Λ(tn+1)s|Htn)=P(tn+1Λ1(s)|Htn)=F(Λ1(s)|Htn)=1exp(tnΛ1(s)Λ(t)dt)=1exp((Λ(Λ1(s))Λ(tn)))=1exp((ssn))=snsexp(t)dt.

    故成立.

  • 同理, 如果 [s0,s1,,sn] 服从 unit rate Poisson process, 则

    [t0=Λ1(s0),,tn=Λ1(sn)]

    服从密度函数为 λ 的点过程.

  • 如此一来, 我们想要从该过程中抽样, 只需要先从 unit rate Poisson process 中抽样然后再做变换即可.

Ogata’s modified thinning algorithm

  • 这部分没看明白, 有兴趣的可以回看原文.

例子

  • Hawkes process: 它的密度函数定义为:

    λ(t)=μ+αti<texp((tti)),

    我们可以得到:

    Λ(t)=0tλ(s)ds=0tμ+αti<sexp((sti))ds=μt+α0tti<sexp((sti))ds=μt+αti<ttitexp((sti))ds=μt+αti<t(1exp((tti))).

  • 可惜的是, Λ1 没有显式解, 一个近似策略是:

    1. 采样 [s0,s1,s2,];
    2. t0 开始逐步增加, 一旦

      Λ(t)s0t0t,

      然后继续进行逐步得到 t1,t2,.

  • 上图是在 μ=0.5,α=0.9 的情况下采样的 20 个点, 以及所对应的 λ(t) 的可视化. 可以发现, Hawkes process 有这样的性质: 在 ti 处倘若发生了事件, 则 ti+Δt 一个时间内发生的概率往往会变大, 从而更容易出现聚合的效应.

  • 下面是代码:


# %%

import numpy as np
from scipy.stats import gamma
from freeplot import FreePlot

# %%

def sample_from_gamma(beta: float, alpha: float, nums: int = 10) -> float:
    return gamma.rvs(
            a = alpha, scale=1 / beta, size=(nums,)
        )


def hawkes_conditional_intensity_function(t, ts: list, mu: float, alpha: float):
    # \lambda^*(t)
    ts = np.array(ts)
    ts = ts[ts < t]
    return mu + alpha * np.sum(np.exp(ts - t))

def hawkes_integrated_conditional_intensity_function(t, ts: list, mu: float, alpha: float):
    # \Lambda^*(t)
    ts = np.array(ts)
    return mu * t + alpha * np.sum(1 - np.exp(ts - t))

# %%



nums = 20
mu = 0.5
alpha = 0.9
step_size = 0.01

ss = np.cumsum(sample_from_gamma(1, 1, nums))
ts = []
t = 0

for s in ss:
    s_hat = hawkes_integrated_conditional_intensity_function(
        t, ts, mu, alpha
    )
    while s_hat < s:
        t += step_size
        s_hat = hawkes_integrated_conditional_intensity_function(
            t, ts, mu, alpha
        )
    ts.append(t)

points = np.linspace(0, ts[-1] + 1, 100)
densities = [
    hawkes_conditional_intensity_function(
        point, ts, mu, alpha
    ) for point in points
]

fp = FreePlot(
    figsize=(2, 5)
)

fp.scatterplot(
    x=ts, y=np.zeros_like(ts), style=['scatter', {'markers.fillstyle': 'none'}]
)

fp.lineplot(
    points, densities, marker=''
)

fp.show()

posted @   馒头and花卷  阅读(296)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2021-11-09 FAT
点击右上角即可分享
微信分享提示