你如何判断好的表现是否连续出现?

机器算法验证 时间序列 可能性
2022-03-12 19:05:35

我解决魔方是一种爱好。我记录了我使用一些软件解决立方体所花费的时间,所以现在我有来自数千个解决方案的数据。数据基本上是一长串数字,表示每个顺序求解所用的时间(例如 22.11、20.66、21.00、18.74,...)

我解决立方体所需的时间自然会因解决方案而有所不同,因此有好的解决方案和坏的解决方案。

我想知道我是否“变热” - 好的解决方案是否连续出现。例如,如果我刚刚连续解决了几个好问题,我的下一个解决方案是否更有可能是好的?

什么样的分析是合适的?我可以想到一些具体的事情要做,例如将解决方案视为马尔可夫过程,并查看一个解决方案预测下一个解决方案的效果,并与随机数据进行比较,查看最后一个连续解决方案的最长条纹低于中位数的时间100 是并且与随机数据中的预期值等进行比较。我不确定这些测试会有多大的洞察力,并且想知道是否有一些成熟的方法来解决这类问题。

4个回答

Wald-Wolfowitz Runs Test似乎是一个可能的候选者,其中“运行”就是您所说的“连续”。它需要二分数据,因此您必须根据某个阈值将每个解决方案标记为“坏”与“好” - 比如您建议的中位时间。零假设是“好”和“坏”解决方案随机交替。与您的直觉相对应的一个片面替代假设是“好”解决了长条中的聚集问题,这意味着随机数据的运行次数少于预期。检验统计量是运行次数。在 R 中:

> N      <- 200                          # number of solves
> DV     <- round(runif(N, 15, 30), 1)   # simulate some uniform data
> thresh <- median(DV)                   # threshold for binary classification

# do the binary classification
> DVfac <- cut(DV, breaks=c(-Inf, thresh, Inf), labels=c("good", "bad"))
> Nj    <- table(DVfac)                  # number of "good" and "bad" solves
> n1    <- Nj[1]                         # number of "good" solves
> n2    <- Nj[2]                         # number of "bad" solves
> (runs <- rle(as.character(DVfac)))     # analysis of runs
Run Length Encoding
lengths: int [1:92] 2 1 2 4 1 4 3 4 2 5 ...
values : chr [1:92] "bad" "good" "bad" "good" "bad" "good" "bad" ...

> (nRuns <- length(runs$lengths))        # test statistic: observed number of runs
[1] 92

# theoretical maximum of runs for given n1, n2
> (rMax <- ifelse(n1 == n2, N, 2*min(n1, n2) + 1))
199 

当您只有几个观察值时,您可以计算在原假设下每个运行次数的确切概率。否则,“运行次数”的分布可以近似为标准正态分布。

> (muR  <- 1 + ((2*n1*n2) / N))                     # expected value
100.99 

> varR  <- (2*n1*n2*(2*n1*n2 - N)) / (N^2 * (N-1))  # theoretical variance
> rZ    <- (nRuns-muR) / sqrt(varR)                 # z-score
> (pVal <- pnorm(rZ, mean=0, sd=1))                 # one-sided p-value
0.1012055

p 值适用于“好”解决方案出现条纹的单边替代假设。

一些想法:

  • 绘制时间分布。我的猜测是它们会被正向倾斜,因此某些解决方案的时间真的很慢。在这种情况下,您可能需要考虑对数或其他求解时间的转换。

  • 在 x 轴和求解时间(或在 y 轴上记录求解时间)上创建试验散点图。这应该让您对数据有一个直观的了解。除了“热潮”之外,它还可能揭示其他类型的趋势。

  • 考虑随着时间的推移是否有学习效果。对于大多数谜题,您可以更快地练习。情节应该有助于揭示是否是这种情况。这种效果不同于“热条纹”效果。它将导致试验之间的相关性,因为当您第一次学习时,慢速试验将与其他慢速试验同时发生,并且随着您的经验越来越多,更快的试验将与更快的试验同时发生。

  • 考虑一下您对“热点”的概念定义。例如,它是否仅适用于时间接近或顺序接近的试验。假设您在星期二快速解决了立方体,然后休息了一段时间,在下周五您快速解决了它。这是一个热门的连胜,还是只有当你在同一天做的时候才算?

  • 是否还有其他可能与热点效应不同的影响?例如,您解决难题的时间(例如,疲劳),您实际努力的程度?等等

  • 一旦了解了替代系统效应,您就可以开发一个包含尽可能多的模型的模型。您可以在 y 轴上绘制残差并在 x 轴上进行试验。然后您可以查看模型中的残差是否存在自相关。这种自相关将提供一些热条纹的证据。但是,另一种解释是,您还没有排除其他一些系统效应。

计算过程的相关图如果您的过程是高斯的(从您的样本看起来是),您可以建立下限/上限(B)并检查给定滞后的相关性是否显着。滞后 1 处的正自相关表明存在“运气”。

在查看任何正式测试之前,我建议您首先查看数据的自相关图,以查看求解时间是否与过去滞后值的先前求解时间相关。如果你的表现出现“热点”,那么这应该表现为至少一个滞后时间的正自相关,可能还会更多。您也许可以使用具有一个或多个自相关项的某种时间序列过程对您的求解时间进行建模,然后通过测试过程中的非零自相关来正式测试“热点”。