はじめに
こちらの本を読んでいます。
前半としてポアソン過程と更新過程の内容をまとめていました。
今回はホークス過程についての内容を簡単にまとめます。
ホークス過程
ホークス過程とは、あるイベントが発生した場合に、イベントが発生する強度が高く次のイベントを誘発してしまうような自己励起がある点過程である。
あるイベントが発生した時に、さらにイベントが群発する過程であるとも言える。
例えば、次のようなものがあげられる。
ホークス過程の次のような条件付き強度関数により表現することができる。
ここでは定数であり、は過去のイベントからの影響を示すカーネル関数と呼ばれ、の時であり、で非負である。
は、過去のイベントからの影響の大きさを表現している。
例えば、イベント発生が以下のグラフの(a)のタイミングであった場合、強度関数の概形はグラフ(c)のようになる。
この条件付き強度関数はベースラインとなるイベントが発生する確率と過去のイベントからの影響を積み上げたものであるということを意味している。
カーネル関数には、次の指数関数やべき関数を用いることが多い。
指数関数の場合、はイベントが発生した時にそのイベントの発生により誘発される期待イベント数であるといえ、はイベント発生確率の減衰の強さであると言えます。
確率密度関数
観測期間]におけるホークス過程の確率密度間数は次のように表現できる。
この確率密度関数は陽に書き表せるが、第一項に総乗の中に総和があるため数値的に得るには大きな計算コストがかかることになる。
ホークス過程の定常性
ホークス過程が定常となる場合の平均強度関数は次のようになる。
この関係は次のように変形することができる。
そして、平均強度は次のように表現できる。
この時、平均強度は非負であることが求められるため、ホークス過程が定常であるためには<1であることが条件となる。
この値は、ホークス過程を特徴付ける値として分枝比(branching ratio)と呼ばれている。
カーネルに指数関数を用いた場合の、分枝比は次のようになる。
この分枝比が大きくなると一度イベントが発生すると続けてイベントが発生しやすくクラスターとなる可能性が高くなる。
一方でとなる場合、イベント発生の連鎖が止まらずイベントが爆発的に発生することになる。
この時、平均発生率は時間と共に増加していくことになるため、定常性が成り立たなくなる。
イベント数の分布
観測期間が]ホークス過程のイベント数の分布を解析的に求めることは難しい。
しかし、観測期間が非常に長く極限をとるとする場合の全イベント数の期待値と分散は次のように求めることができる。
期待値は期待値のポアソン分布に従うと言え、分散は分枝比が1に近くにつれ急激に大きくなることを意味している。
Rでホークス過程
Rでホークス過程を扱うには hawkes パッケージを使います。
はじめに、ホークス過程の時系列をシミュレーションします。
, , と設定してみました。
なお、ここで分枝比の条件より でないといけませんし、そのように設定していないとエラーが出てしまう設計になっているようです。
library(hawkes) set.seed(1234) N<-1440 lambda0 <- 0.02 alpha <- 0.7 beta <- 1.0 history <- simulateHawkes(lambda0, alpha, beta, N)
イベントタイミングを確認してみます。
累積イベント発生件数の推移も確認して見ます。
強度関数も確認してみます。
次に、過程のパラメータの推定を行っていきます。
このパッケージではモデル推定の関数は用意されていないませんが、 尤度を算出する関数が存在しているため、 パラメータの推定をoptim関数を用いて行います。
# ホークス過程の尤度計算用関数 cal_likelihood <- function(param, history){ likelihoodHawkes(param[1], param[2], param[2]+param[3], history) } # パラメータの推定 params_hawkes <- optim(c(0.1,2,6), cal_likelihood, method = "L-BFGS-B", lower = rep(0.000001,3), upper = rep(10,3), history = history[[1]], control = list(maxit=10000))
推定結果を確認します。
> paste( c("mu", "alpha","beta"), round(c(res_hawkes$par[1:2],sum(res_hawkes$par[2:3])), 4), sep=" = ") "mu = 0.0147" "alpha = 0.8813" "beta = 1.0394"
概ね推定がうまくできていると考えれます。
観測期間の長さがある程度あれば推定はうまく行かないのでしょうか。
1440×5に観測時間を伸ばした場合の推定結果は次にようになりました。
> paste( c("mu", "alpha","beta"), round(c(res_hawkes$par[1:2],sum(res_hawkes$par[2:3])), 4), sep=" = ") [1] "mu = 0.0199" "alpha = 0.8132" "beta = 1.1568"
muの推定は精度良く行えるようになりましたが、alphaとbetaの推定は精度が良くなったとは言いにくいかもしれません。
多次元ホークス過程
ある過程のイベント発生が別の過程のイベントが発生するように、複数の点過程が相互に励起する作用がある過程を、多次元ホークス過程と呼ぶ。
ここでk番目の過程の条件付き強度関数は、次のように定義できます。
ここで、はベースとなる励起の強さ、を過程から過程への影響力の強さであり、非負の値をとります。
を行列で表現すると次のような重み付き隣接行列になる。
は、過程から過程への影響を考えるカーネル関数を表現している。
多次元ホークス過程では、過程間の因果性をモデル化していることになる。
多次元ホークス過程の定常性
1次元の場合と同様に定常状態の強度関数を考えると次のようになる。(以下変量は全てベクトル)
これを変形して平均強度のベクトルの関係が得られる。
ここから多次元ホークス過程が定常となるには、この関係が有限である必要がある。
このことから定常条件は、隣接行列のスペクトル半径が1以下であることとなる。
Rで多次元ホークス過程
Rで多次元ホークス過程を扱うのも hawkes パッケージを使います。
2次元のホークス過程のシミュレーションを行います。
ベースとなる平均強度ベクトルの各要素はそれぞれ0.02、指数関数のカーネルのパラメータは(0.4,0.5)、の隣接行列は次にように設定した。
それでは実際に設定とシミュレーションを行います。
lambda0 <- c(0.02,0.02) alpha <- matrix(c(0.3,0.02,0.02,0.4),byrow=TRUE,nrow=2) beta <- c(0.4,0.5) N <- 2000 history <- simulateHawkes(lambda0, alpha, beta, N)
シミュレーションにより得られた2つの系列を確認してみます。
次にoptim関数を用いてパラメータの推定を行います。
その前に、推定用の尤度を返す関数を定義します。
nloglik_multi_hawkes <- function(params, history, k){ mu <- params[1:k] alpha <- matrix(params[(k+1):(k+k*k)],byrow=TRUE,nrow=2) beta <- params[(k+k*k+1):(k+k*k+k)] return(likelihoodHawkes(mu, alpha, beta, history)) }
パラメータの推定を行います。
res_hawkes <- optim(c(rep(0.01,2), rep(0.2,4),rep(1.0,2)), nloglik_multi_hawkes, method = "L-BFGS-B", lower = rep(0.000001,8), upper = rep(10,8), history = history, k = 2, control = list(maxit = 10000))
推定したパラメータを確認します。
params <- data.frame( estimates = res_hawkes$par) rownames(params) <- c("mu_1", "mu_2", "alpha_11", "alpha_12","alpha_21", "alpha_22", "beta_1", "beta_2")
>params estimates mu_1 0.02541579 mu_2 0.01655328 alpha_11 0.29647613 alpha_12 0.02979791 alpha_21 0.02042788 alpha_22 0.49278135 beta_1 0.37051372 beta_2 0.56710703
概ね設定通りの値が推定できたと考えられます。