贝叶斯变化点检测

机器算法验证 贝叶斯 变化点
2022-03-26 18:02:04

真是幼稚的问题。我有一个时间序列。我知道如何执行分割(如二进制分割算法)。目标是找到从不同概率模型生成的区间。

但我有关于可能模型的所有信息(分布形状、方差、均值)。因此,对于每个时间点,我都有每个模型及其先验的可能性。=> 我可以计算每个时间点、任何模型和任何间隔的后验。

问题:如果我只是使用最大后验概率来分割时间序列,我会有太多的变化点。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)

在此处输入图像描述

在现实生活中,我知道每个时间点可能的差异和均值。我需要推断该细分市场中一种模型的流行程度。

4个回答

关于这个主题的两篇好论文如下:

1)贝叶斯在线变化点检测

2)在多元时间序列中建模变化的依赖结构

这些不应用聚类算法,而是根据您的要求考虑间隔(从最后一个更改点开始)。他们使用参数分布。Adams 和 Mackay 的论文(第一篇)也有在 MatLab 和 Python 中实现的算法。

简而言之,该软件包进行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.

这更像是评论而不是答案,但评论太长了:

顺序分析的“圣经”可能是Alexander Tartakovsky 2014 年出版的《 Sequential Analysis: Hypothesis Testing and Changepoint Detection 》一书。它似乎详尽无遗地涵盖了该主题。

http://www.amazon.com/Sequential-Analysis-Hypothesis-Changepoint-Probability-ebook/dp/B00MMOIWTS/ref=sr_1_1?ie=UTF8&qid=1445511005&sr=8-1&keywords=sequential+analysis+tartakovsky

也就是说,2014 年 6 月,哥伦比亚赞助了第五届顺序方法论国际研讨会,该研讨会汇集了该领域最新和最伟大的从业者。塔塔科夫斯基是组委会成员。

https://sites.google.com/site/iwsm2015/home

有关摘要和论文,请参见会议网站上的“详细计划”链接。那里可能有一些专门针对您的问题的东西。

从我写的这个 CV 线程中提取的响应: 一个比例的顺序估计器

R 中有许多包可用于变更点或断点检测,但其中大多数是非贝叶斯的。@Jonas Lindeløv 的博客文章中涉及了许多这样的包:https ://lindeloev.github.io/mcp/articles/packages.html 。很高兴他还在上面的答案中指出了他的网站。

此外mcp,bcp也是一种流行的贝叶斯变化点检测模型,它实际上已用于分析拷贝数更改序列数据——与您的出版物相同的用例。为了完整起见,我在此处使用您的示例数据提供了一些快速结果:

set.seed(1234)
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]))
}

library(bcp)
out = bcp(coverages)
plot(out)

这是bcp输出:

在此处输入图像描述

贝叶斯变化点检测的另一个包是Rbeast,它只处理时间序列或类似序列的数据,因此不如mcpor通用bcp但它对您的使用场景很有用。Rbeast还旨在将时间序列分解为周期性和趋势分量。由于您的序列不包含周期性/季节性分量,season='none'因此在下面的代码中进行了设置,并且仅拟合了趋势分量:

library(Rbeast)
out = beast(coverages, season='none')
plot(out)

下面是Rbeast输出:

在此处输入图像描述

对于每个段,Rbeast拟合线性(一阶多项式)或常数(0 阶多项式)模型;充分拟合趋势所需的多项式的平均阶随着时间的推移进行估计,并描绘为图中的 Order_t 曲线:均接近 0,表明各个段上的整体平坦曲线。对于您的样本时间序列,由于我们事先知道这些线段是恒定的,因此我们可以通过将线段(多项式)的最小和最大顺序都设置为 0 来强制执行此强先验:torder.minmax=c(0,0)以便仅拟合恒定线。

out = beast(coverages, season='none', torder.minmax=c(0,0) )
plot(out)

在此处输入图像描述