2026a

# cusum


使用累计和检测平均值的微小变化

函数库: TySignalProcessing

# 语法

iupper, ilower, uppersum, lowersum = cusum(x)
iupper, ilower, uppersum, lowersum = cusum(x, climit, mshift, tmean, tdev)
cusum(; plotfig=true)

# 说明

iupper, ilower, uppersum, lowersum = cusum(x) 返回已漂移超过目标均值上下五个标准差的 x 的上限和下限累积总和的第一个索引。最小可检测均值偏移设置为一个标准偏差。目标均值和标准差是根据 x 的前 25 个样本估计的。


iupper, ilower, uppersum, lowersum = cusum(x, climit, mshift, tmean, tdev) 指定 climit,允许上限和下限累积总和偏离均值的标准差数。 它还指定了最小可检测均值偏移、目标均值和目标标准差。


cusum(; plotfig=true) 启用绘图功能。

# 示例

累积默认值

生成并绘制具有线性趋势的 100 样本随机信号。重置随机数生成器以获得可重现的结果。

using TyPlot 
using TySignalProcessing
using TyMath
rng = MT19937ar(1234)
rnds = rand(rng, 100)
trnd = LinRange(0, 1, 100)
fnc = rnds + trnd
plot(fnc)

使用输入参数的默认值将 cusum 应用于函数。

cusum(fnc; plotfig=true)

计算前 25 个样本的均值和标准差。 使用这些数字作为目标平均值和目标标准偏差来应用累积和。 突出显示累积总和漂移超过目标均值五个标准差的点。 将最小可检测均值偏移设置为一个标准偏差。

mfnc = mean(fnc[1:25])
sfnc = std(fnc[1:25])
cusum(fnc, 5, 1, mfnc, sfnc; plotfig=true)

使用负线性趋势重复计算。

nnc = rnds - trnd
cusum(nnc; plotfig=true)
不稳定的运动检测

生成类似于由于磨损而变得不稳定的轴运动的信号。

using TyPlot 
using TySignalProcessing
using TyMath
rng = MT19937ar(1234)
sz = 200
dr = airybi.(LinRange(-14.9371, 1.2, sz))
rd = dr .+ sin.(2 * pi * (1:sz) / 5) + randn(rng, sz) / 3
figure(1)
plot(dr)
hold("on")
plot(rd, ".-")
hold("off")

如果不存在漂移且没有噪声,则求平均值和标准偏差。 绘制理想的无噪声信号及其稳定背景。

id = 0.3 * sin.(2 * pi * (1:sz) / 20)
st = id + sin.(2 * pi * (1:sz) / 5)
mf = mean(st)
sf = std(st)
figure(2)
plot(id)
hold("on")
plot(st, ".-")
hold("off")

使用 CUSUM 控制图查明不稳定的开始。 假设当信号超出其理想行为的三个标准偏差时,系统变得不稳定。 指定一个标准偏差的最小可检测偏移。

cusum(rd, 3, 1, mf, sf; plotfig=true)
cusum(rd, 3, 1.2, mf, sf, "all"; plotfig=true)
高尔夫记分卡

高尔夫球场的每个球洞都有一个相关的“标准杆”(par),表示将球击入洞中所需的预期杆数。技术娴熟的球员通常以非常接近标准杆的杆数完成每个球洞。因此,需要打若干个球洞并累计分数,才能在比赛中决出明显的胜者。

Ben、Jen 和 Ken 打完一轮完整的比赛,包括 18 个球洞。球场有各种标准杆为 3 杆、4 杆和 5 杆的球洞。比赛结束时,球员们统计他们的得分。

using TySignalProcessing
using TyPlot
using TyBase
using TyMath

rng = mt19937ar(5489)
hole = 1:18
par = vec([4 3 5 3 4 5 3 4 4 4 5 3 5 4 4 4 3 4])

nms = ["Ben"; "Jen"; "Ken"]

Ben = vec([4 3 4 2 3 5 2 3 3 4 3 2 3 3 3 3 2 3])
Jen = vec([4 3 4 3 4 4 3 4 4 4 5 3 4 4 5 5 3 3])
Ken = vec([4 3 4 3 5 5 4 4 4 4 5 3 5 4 5 4 3 5])

T = DataFrame((hole=hole, par=par, Ben=Ben, Jen=Jen, Ken=Ken))
T = 18×5 DataFrame
 Row │ hole   par    Ben    Jen    Ken   
     │ Int64  Int64  Int64  Int64  Int64 
─────┼───────────────────────────────────
   1 │     1      4      4      4      4
   2 │     2      3      3      3      3
   3 │     3      5      4      4      4
   4 │     4      3      2      3      3
   5 │     5      4      3      4      5
   6 │     6      5      5      4      5
   7 │     7      3      2      3      4
   8 │     8      4      3      4      4
   9 │     9      4      3      4      4
  10 │    10      4      4      4      4
  11 │    11      5      3      5      5
  12 │    12      3      2      3      3
  13 │    13      5      3      4      5
  14 │    14      4      3      4      4
  15 │    15      4      3      5      5
  16 │    16      4      3      5      4
  17 │    17      3      2      3      3
  18 │    18      4      3      3      5

这一轮的获胜者是在最后累计总杆数低于标准杆最多的人。计算三位选手的总杆数,以确定获胜者。设置一个小的阈值,使平均值的每一次变化都可检测到。

_, b, _, Bensum = cusum(Ben - par, 1, 1e-4, 0)
_, j, _, Jensum = cusum(Jen - par, 1, 1e-4, 0)
_, k, _, Kensum = cusum(Ken - par, 1, 1e-4, 0)

figure(1)
plot(Bensum)
hold("on")
plot(Jensum)
plot(Kensum)
hold("off")
legend(nms; loc="best")

Ben 赢得了这一轮。通过在每个洞随机增加或减少一杆的方式来模拟他们的下一场比赛。

Ben = Ben + randi(rng, 3, 1, 18)' .- 2
Jen = Jen + randi(rng, 3, 1, 18)' .- 2
Ken = Ken + randi(rng, 3, 1, 18)' .- 2

_, b, _, Bensum = cusum(Ben - par, 1, 1e-4, 0)
_, j, _, Jensum = cusum(Jen - par, 1, 1e-4, 0)
_, k, _, Kensum = cusum(Ken - par, 1, 1e-4, 0)

figure(2)
plot(Bensum)
hold("on")
plot(Jensum)
plot(Kensum)
hold("off")
legend(nms; loc="best")

# 输入参数

x - 输入信号
向量

输入信号,指定为向量。

数据类型: Float

climit - 控制限度
5 (默认) | 实标量

要操作的维度,指定为正整数标量。

mshift - 要检测的最小均值偏移
1 (默认) | 实标量

要检测的最小均值偏移,指定为以标准差表示的实数标量。

tmean - 目标均值
mean(x[1:25]) (默认) | 实标量

目标均值,指定为实数标量。 如果未指定 tmean,则将其估计为 x 的前 25 个样本的均值。

tdev - 目标标准差
std(x[1:25]) (默认) | 实标量

目标标准偏差,指定为实数标量。 如果未指定 tdev,则将其估计为 x 的前 25 个样本的标准偏差。

# 输出参数

iupper,ilower - 失控点索引
整数标量 | 整数向量

失控点索引,以整数标量或向量形式返回。 如果所有信号样本都在指定的容差范围内,则 cusum 返回空的 iupper 和 ilower 参数。

uppersum,lowersum - 上限和下限累积和
向量

上限和下限的累加和,以向量形式返回。

# 详细信息

CUSUM 控制图

CUSUM 控制图旨在检测过程中微小的增量变化。

给定序列 x1, x2, x3,…,xn,估计平均 mx 和估计标准差 σx,定义上下累积过程和:

上累积的总和:

较低和:

由 mshift 参数在 cusum 中表示的变量 n 是与目标均值 tmean 的标准偏差数,它使偏移可检测。

如果过程遵循 Uj > cσx 或 Lj < –cσx,则该过程在样本 xj 处违反了 CUSUM 准则。 控制极限 c 由 climit 参数在 cusum 中表示。

# 另请参阅

mean