# 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 中表示。