Bayesian

貝葉斯變化點檢測

  • February 23, 2016

真是幼稚的問題。我有一個時間序列。我知道如何執行分割(如二進制分割算法)。目標是找到從不同概率模型生成的區間。

但我有關於可能模型的所有信息(分佈形狀、方差、均值)。因此,對於每個時間點,我都有每個模型及其先驗的可能性。=> 我可以計算每個時間點、任何模型和任何間隔的後驗。

問題:如果我只是使用最大後驗概率來分割時間序列,我會有太多的變化點。HMM 可以是一個解決方案,但它也只考慮一個點,而不是“查看”整個區間。也很難將 HMM 應用於非正態數據。

可以用滑動窗口來解決,但不清楚如何選擇滑動窗口的大小。

是否有這種類型的貝葉斯變化點檢測算法(當您知道可能的模型時)?像 HMM,但考慮了區間並且可以使用任何參數分佈?啟發式算法也很好。

我如何為這個問題應用最大似然聚類?

UPD:問題的模擬:

variances <- runif(1000,0.01,0.5)

coverages <- c()

for (i in seq(1:100)) {
 coverages <- c(coverages, rnorm(1, mean=0, sd=variances[i]))
}

for (i in seq(101:200)) {
 coverages <- c(coverages, rnorm(1, mean=-log(2), sd=variances[i] / 0.75))
}

for (i in seq(201:300)) {
 coverages <- c(coverages, rnorm(1, mean=log(3/2), sd=variances[i] * 0.75))
}

for (i in seq(301:1000)) {
 coverages <- c(coverages, rnorm(1, mean=0, sd=variances[i]))
}

plot(coverages)

在此處輸入圖像描述

在現實生活中,我知道每個時間點可能的差異和均值。我需要推斷該細分市場中一種模型的流行程度。

簡而言之,該軟件包進行mcp貝葉斯變點回歸。從 v0.2 開始,它採用高斯、二項式、伯努利和泊松。將您的數據建模為四個僅截取段:

model = list(
 y ~ 1,  # Intercept
 ~ 1,  # etc...
 ~ 1,
 ~ 1
)

library(mcp)
df = data.frame(x = seq_along(coverages), y = coverages)
fit = mcp(model, df, par_x = "x")

讓我們用預測間隔繪製它,只是為了好玩(綠色虛線)。藍色曲線是變化點位置的後密度。灰線是從後面隨機抽取的。

plot(fit, q_predict = T)

在此處輸入圖像描述

您可以使用plot_pars()繪製單個參數估計值。以下是摘要。cp_*變化點估計值在哪裡:

summary(fit))

Family: gaussian(link = 'identity')
Iterations: 9000 from 3 chains.
Segments:
 1: y ~ 1
 2: y ~ 1 ~ 1
 3: y ~ 1 ~ 1
 4: y ~ 1 ~ 1

Population-level parameters:
   name    mean  lower    upper Rhat n.eff
   cp_1 101.280  99.38 103.0000    1  5627
   cp_2 199.562 199.00 200.4314    1  5038
   cp_3 299.365 296.85 301.7760    1  2340
  int_1  -0.047  -0.11   0.0104    1  5614
  int_2  -0.620  -0.68  -0.5592    1  5792
  int_3   0.423   0.37   0.4838    1  6463
  int_4  -0.018  -0.04   0.0036    1  5382
sigma_1   0.295   0.28   0.3082    1  5963

在mcp 網站上閱讀更多內容。免責聲明:我是mcp.

引用自:https://stats.stackexchange.com/questions/198104

comments powered by Disqus