Bayesian
貝葉斯變化點檢測
真是幼稚的問題。我有一個時間序列。我知道如何執行分割(如二進制分割算法)。目標是找到從不同概率模型生成的區間。
但我有關於可能模型的所有信息(分佈形狀、方差、均值)。因此,對於每個時間點,我都有每個模型及其先驗的可能性。=> 我可以計算每個時間點、任何模型和任何間隔的後驗。
問題:如果我只是使用最大後驗概率來分割時間序列,我會有太多的變化點。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
.