如何计算覆盖度量(CM)以评估变点检测方法性能
覆盖度量(CM)在变点检测评估中的多实现计算问题
一、CM的用途与原理
覆盖度量(CM)用于评估检测出的变点划分的数据段与真实变点形成的真实数据段的匹配程度。
CM实现原理
CM的计算核心是基于真实段与估计段的交集、并集的基数占比,结合各真实段的长度加权求和后归一化得到。
我的需求是:为10次生成的模拟数据计算CM,最终结果取这10次实现CM的平均值。
二、单次实现的CM计算代码(基于DeCAFS方法)
我已编写完成单次实现的计算代码,如下:
library(DeCAFS) set.seed(2001) x=rep(c(0,2,-2,2,-2), c(200,200,200,200, 200))+rnorm(1000) # 含变点的模拟数据 TCP=c(200,400,600,800) # 真实变点位置 splitAt <- function(x, pos) unname(split(x, cumsum(seq_along(x) %in% (pos+1)))) split_by_TCP=splitAt(x, TCP) # 基于真实变点划分数据段 estCP=DeCAFS(x,warningMessage = FALSE)$changepoints # 用DeCAFS方法估计变点 split_by_estCP=splitAt(x, estCP) # 基于估计变点划分数据段 # 计算真实段与估计段的交集 intersec=(Map(\(split_by_TCP, split_by_estCP) intersect(split_by_TCP, split_by_estCP), split_by_TCP, split_by_estCP)) # 计算交集的基数 cardinality_intersection=sapply(intersec,length) # 计算真实段与估计段的并集 unionn=(Map(\(split_by_TCP, split_by_estCP) union(split_by_TCP, split_by_estCP), split_by_TCP, split_by_estCP)) # 计算并集的基数 cardinality_union=sapply(unionn, length) # 计算CM CM=(1/length(x))*sum(sapply(split_by_TCP, length)*(max((cardinality_intersection)/(cardinality_intersection)))) print(CM)
三、扩展到10次实现的尝试(运行失败)
当尝试将代码扩展到10次实现时,我在处理估计变点与真实变点生成的段长度时遇到问题,以下是我编写的10次实现代码,但无法正常运行:
set.seed(1111) y=as.data.frame(replicate(10,rep(c(0,2,-2,2,-2), c(200,200,200,200, 200))+rnorm(1000))) decafs = function (x) DeCAFS(x, warningMessage = FALSE)$changepoints mw=sapply(y, decafs) # 存储10次实现的估计变点 C=rep(c(200,400,600,800),10) # 复制10次真实变点 ps=head(seq(4, 40, by=4),-1) # 拆分真实变点的位置索引 splitAt <- function(x, pos) unname(split(x, cumsum(seq_along(x) %in% (pos+1)))) s=splitAt(C, ps) # 拆分得到10次实现对应的真实变点列表 seg_TCP=mapply(splitAt,x=y, pos=s) # 存储10次实现基于真实变点划分的段 seg_estCPs=mapply(splitAt,x=y,pos=mw) # 存储10次实现基于估计变点划分的段
内容的提问来源于stack exchange,提问作者Tare
相关产品推荐
相关产品推荐

