Temporal Point Processes
TPP
-
点过程, 里面的内容感觉和 生存模型 很像.
-
在日常生活中, 我们常常会遇到和时间相关的事件序列:
其中 表示事件 发生的时间.
-
一个惯常的任务是, 基于上述的历史信息, 预测下一可能发生的事件 , 以及它所发生的具体时间 .
-
假设没有两个事件在同一时刻发生, 则必有
-
倘若我们用 来表示概率密度, 则有
其中 .
-
倘若我们能够建模每一个 , 则我们就能够很自然地建模联合概率. TPP 就是这样的一个工具.
Evolutionary point processes
-
这部分, 我们仅考虑时间的预测, 即建模:
其中 .
-
例子 [Renewal process]: 我们以 Renewal Process 这种最简单的随机过程为例. Renewal Process 需要满足: 为独立同分布序列, 即两个事件间的间隔是互相独立且服从统一分布的. 此时我们有:
这里 是某个满足分布条件的密度函数. 比如, 我们可以取 Gamma 分布:
-
下图是设定不同的 后的结果 (注意 实际上是泊松过程).
# %%
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 []
-
实际中, 往往不似 Renewal process 这般简单, TPP 求助于如下的 conditional intensity function 来确定最终的密度函数 (下面的 * 用来强调它是基于 的):
其中 . 后面我们令 .
-
令,
为分布函数.
-
则, 我们有如下关系成立:
-
一旦我们确定(或者给定) (且满足一定的条件), 我们就可以唯一确定 , 注意到
两边对 积分, 得到:
注: 建模在 中.
-
所满足的条件, 即令所推到得到的 满足密度函数应有的性质:
- 在 上非负可积;
- .
Conditional intensity function []
-
这里, 我们同时考虑发生时间和事件, 此时我们类似地定义:
这里 . 注意, 这里我们考虑事件 所属的空间是离散的, 实际上, 连续的也可以 (改成 ) (但是这里再用区间符号就怪怪的, 但是以离散的眼光审视吧, 结果是一样的).
-
则, 我们有如下关系成立:
这里我们定义 .
-
换言之, 我们只要确定 即可确定发生时间 + 发生时间的随机过程.
Inference
-
我不清楚为什么不直接确定 而需要一个跳板 , 想必是它在推理和抽样上具有特别的性质.
-
很多时候, 我们需要通过极大似然来拟合模型, 所以似然函数的计算是一个比较重要的问题. 假设我们在 时间段内观测到 , 下面介绍其上的似然函数的计算.
-
定义:
-
根据 (1) 可得:
比较特别的是 , 即我们可以确定, 一定发生在 的时间段内.
-
于是, 我们有:
Simulation
Inverse Method
-
假设序列 , 我们有序列 (假设 可逆)
服从 unit rate Poisson process. 即
即间隔时间是互相独立的 (且服从 的泊松分布).
-
我们有
故成立.
-
同理, 如果 服从 unit rate Poisson process, 则
服从密度函数为 的点过程.
-
如此一来, 我们想要从该过程中抽样, 只需要先从 unit rate Poisson process 中抽样然后再做变换即可.
Ogata’s modified thinning algorithm
- 这部分没看明白, 有兴趣的可以回看原文.
例子
-
Hawkes process: 它的密度函数定义为:
我们可以得到:
-
可惜的是, 没有显式解, 一个近似策略是:
- 采样 ;
- 从 开始逐步增加, 一旦然后继续进行逐步得到 .
-
上图是在 的情况下采样的 20 个点, 以及所对应的 的可视化. 可以发现, Hawkes process 有这样的性质: 在 处倘若发生了事件, 则 一个时间内发生的概率往往会变大, 从而更容易出现聚合的效应.
-
下面是代码:
# %%
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()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2021-11-09 FAT