主要内容

检测信号的爆发和重大变化

这个例子展示了如何通过累积和和变点检测来确定信号中的变化或爆发。

通过累积和检测病毒爆发

在许多实际应用程序中,您正在监视数据,并且希望在底层流程发生更改时尽快收到警报。一种非常流行的技术是通过累积和(CUSUM)控制图来实现这一点。

为了说明CUSUM是如何工作的,首先检查2014年西非埃博拉疫情报告的病例总数疾病控制和预防中心

负载WestAfricanEbolaOutbreak2014plot(WHOreportdate,[几内亚病例总数利比里亚病例总数塞拉利昂],“。”)传说(几内亚的利比里亚的“狮子山”)标题(“埃博拉病毒病疑似、疑似和确诊病例总数”

图中包含一个轴。标题为“埃博拉病毒病疑似病例总数、可能病例数和确诊病例数”的轴包含3个类型线对象。这些物品代表几内亚,利比里亚,塞拉利昂。

如果你看一下几内亚第一次疫情爆发的前沿,你会发现前100例病例是在2014年3月25日左右报告的,此后病例显著增加。值得注意的是,虽然利比里亚在3月份也出现了一些疑似病例,但直到大约30天后,病例数量仍处于相对控制状态。

为了了解新患者的传入率,绘制从2015年3月25日发病开始的病例总数的相对每日变化。

daysSinceOutbreak = datetime(2014, 3,24 +(0:400));cases = interp1(WHOreportdate, TotalCasesLiberia, days since inceoutbreak);dayOverDayCases = diff(cases);情节(dayOverDayCases)标题(2014年3月25日以来利比里亚新增病例(每天));ylabel (“每日报告病例数的变化”);包含(“从爆发开始算起的天数”);

图中包含一个轴。标题为“2014年3月25日以来利比里亚新病例率(每天)”的轴包含一个类型为line的对象。

如果放大前100天的数据,可以看到虽然最初有大量病例涌入,但其中许多病例在第30天之后就被排除了,因为第30天的变化率暂时降到了零以下。在第95天和第100天之间,也出现了显著的上升趋势,达到了每天7例新病例的速度。

xlim(101年[1])

图中包含一个轴。标题为“2014年3月25日以来利比里亚新病例率(每天)”的轴包含一个类型为line的对象。

对输入数据执行CUSUM测试可以快速确定何时发生爆发。CUSUM跟踪两个累积和:一个是检测局部均值何时向上移动的上和,一个是检测均值何时向下移动的低和。集成技术为CUSUM提供了忽略传入速率中较大(瞬态)峰值的能力,但仍然对稳定的小速率变化敏感。

使用默认参数调用CUSUM将检查前25个样本的数据,并在遇到均值偏离初始数据超过5个标准差时发出警报。

cusum (dayOverDayCases(1:10 1)传说(“上金额”和较低的

图中包含一个轴。标题为CUSUM Control Chart \mu_{target} = 1.080000 \sigma_{target} = 1.629734的轴包含6个类型为line的对象。这些对象代表上和、下和。

请注意,CUSUM在第30天(第33天)发现了虚假报告的病例,并从第80天(第90天)开始发现了暴发的最初发作。如果您仔细地将这些结果与前面的图进行比较,您可以看到CUSUM能够忽略第29天的虚假上升,但仍然在第95天开始的大上升趋势前5天触发警报。

如果调整CUSUM使其目标平均值为每天零例,目标为每天正负3例,则可以忽略第30天的假警报,并在第92天发现爆发:

气候= 5;Mshift = 1;Tmean = 0;Tdev = 3;cusum (dayOverDayCases(1:10 0)、climit mshift, tmean, tdev)

图中包含一个轴。标题为CUSUM Control Chart \mu_{target} = 0.000000 \sigma_{target} = 3.000000的轴包含5个line类型的对象。

寻找方差的显著变化

检测统计数据突变的另一种方法是通过变点检测,它将信号划分为相邻的段,其中每个段内的统计数据(例如均值、方差、斜率等)是常数。

下一个例子分析了尼罗河在公元622年至1281年期间在开罗附近的罗达标尺上测量的年最低水位。

负载水位计年份= 622:1284;情节(年,nileriverminima)标题(“尼罗河年最低水位”)包含(“年”) ylabel (“水平(m)”

图中包含一个轴。标题为尼罗河年最低水位的轴包含一个类型为线的对象。

公元715年左右,一种更新更精确的测量设备开始建造。在此之前,我们所知不多,但经过进一步的研究,你可以看到,在722年前后,变化就小得多了。为了找到新设备开始运行的时间段,您可以在执行元素微分以去除任何缓慢变化的趋势后,搜索均方根水位的最佳变化。

I = findchangepts(diff(nileriverminima),“统计”“rms”);Ax = gca;Xp =[年(i) ax。XLim([2 2])年(i)];Yp = ax。YLim([1 1 2 2]);补丁(xp, yp,[。5 .5 .5],“FaceAlpha”, 0.1)

图中包含一个轴。标题为尼罗河年最低水位的轴包含了2个类型为线、斑块的对象。

虽然样本分化是去除趋势的简单方法,但还有其他更复杂的方法来检查更大范围内的方差。有关如何使用此数据集通过小波执行变化点检测的示例,请参见小波变换点检测(小波工具箱)

检测输入信号中的多个变化

下一个例子涉及以1毫秒间隔采样的CR-CR 4速传输块的45秒模拟。汽车发动机转速和扭矩的仿真数据如下图所示。

负载simcarsigsubplot(2,1,2) plot(carTorqueNM) xlabel(“样本”) ylabel (力矩(N m))标题(“扭矩”次要情节(2,1,1);情节(carEngineRPM)包含(“样本”) ylabel (“速度(RPM)”)标题(发动机转速的

图包含2个轴。标题为Torque的坐标轴1包含一个类型为line的对象。标题为Engine Speed的坐标轴2包含一个line类型的对象。

在这里,汽车加速,换档三次,切换到空挡,然后踩下刹车。

由于发动机转速可以自然地建模为一系列的线性段,您可以使用findchangepts找到汽车换挡的样本。

图findchangepts (carEngineRPM,“统计”“线性”“MaxNumChanges”(4)包含“样本”) ylabel (发动机转速(RPM)

图中包含一个轴。标题为Number of changepoints = 4 Total residual error = 342535085.7709包含3个line类型的对象。

在这里,您可以看到四个变化(在五个线性段之间),它们发生在10,000、20,000、30,000和40,000个样本标记附近。放大到波形的空闲部分:

xlim(22000年[18000])

图中包含一个轴。标题为Number of changepoints = 4 Total residual error = 342535085.7709包含3个line类型的对象。

直线拟合密切跟踪输入波形。不过,贴合度还可以进一步提高。

观察信号间共享的多阶段事件的变化

将换挡点增加到20个,观察换挡点附近的变化,样本数19000

findchangepts (carEngineRPM“统计”“线性”“MaxNumChanges”,20) xlim([18000 22000])

图中包含一个轴。标题为Number of changepoints = 20的轴包含3个类型为line的对象。

观察发动机转速在19035处开始下降,在19550处稳定下来之前取510个样本。由于采样间隔是1毫秒,这是一个~0.51秒的延迟,是换档后的典型时间量。

现在看看同一区域内发动机扭矩的变化点:

findchangepts (carTorqueNM“统计”“线性”“MaxNumChanges”,20) xlim([19000 20000])

图中包含一个轴。标题为Number of changepoints = 20的轴包含3个类型为line的对象,Total residual error = 435882.0922。

观察发动机扭矩完全传递到轴在19605样本,55毫秒后,发动机转速完成沉降。这个时间与发动机进气冲程和扭矩产生之间的延迟有关。

要找到离合器何时开始工作,您可以进一步放大信号。

xlim(19050年[19000])

图中包含一个轴。标题为Number of changepoints = 20的轴包含3个类型为line的对象,Total residual error = 435882.0922。

离合器在样品19011处被压下,大约用了30个样品(毫秒)才完全脱离。

另请参阅

||