gtjamesa / php-zscore
平滑z分数峰值检测算法(https://stackoverflow.com/questions/22583391/peak-signal-detection-in-realtime-timeseries-data/22640362#22640362)
Requires
- php: ^7.4|^8.0
Requires (Dev)
- phpunit/phpunit: ^8.0|^9.5
README
此包是Jean-Paul提出的“稳健峰值检测算法(使用z分数)”的实现。
安装
您可以通过composer安装此包
composer require gtjamesa/php-zscore
用法
可以使用流畅接口设置算法的配置参数,或者当创建对象时作为第二个参数指定。
// Create object using fluent interface $zScore = (new ZScore())->lag(30) ->threshold(5) ->influence(0); // Create object using options as an array $zScore = new ZScore([ 'lag' => 30, 'threshold' => 5, 'influence' => 0, ]); // Calculate peak signals for the supplied dataset // Returns [0, 1, 0, 0, ..., -1, 0, 0, 1] $results = $zScore->calculate($data);
算法将在第一次计算时遍历整个提供的数据集。在实际实时数据流上运行将是不高效的,因为它将重新计算数据集中的每个信号。
可以在创建后通过调用add()
方法向数据集中添加新信号
$signal = $zScore->add(155); // returns -1, 0 or 1
保存/加载
可以将ZScore
类序列化/反序列化,以便将先前计算的数据保存到磁盘或缓存,以便稍后重新加载。您可以在序列化之前调用shrink()
方法以忽略数据集,因为它对于未来的信号计算是不必要的。
$serialized = serialize($zScore); // 3766 bytes $serializedSmall = serialize($zScore->shrink()); // 3081 bytes
算法配置参数
lag
:滞后参数确定数据将平滑到何种程度以及算法对数据长期平均变化的自适应程度。数据越稳定,应包含更多的滞后(这应提高算法的鲁棒性)。如果数据包含时间变化趋势,您应该考虑算法适应这些趋势的速度。例如,如果将lag
设置为10,则算法的阈值需要10个“周期”才能调整到长期平均的任何系统性变化。因此,请根据数据趋势行为和您希望算法具有的自适应程度来选择lag
参数。
influence
:此参数确定信号对算法检测阈值的影响。如果设置为0,信号对阈值没有影响,这意味着未来的信号将基于不受过去信号影响的平均值和标准差计算出的阈值进行检测。另一种思考方式是,如果将影响设置为0,则隐含地假设了平稳性(即无论有多少信号,时间序列在长期内总是返回到同一平均值)。如果不是这种情况,则应在0和1之间设置影响参数,具体取决于信号可以系统地影响数据的时间趋势的程度。例如,如果信号导致时间序列长期平均的结构性行为变化,则应将影响参数设置得较高(接近1),以便阈值可以快速调整这些变化。
阈值
:阈值参数是指从移动平均值以上的标准差数量,当算法将新的数据点分类为信号时,这个参数就会起作用。例如,如果一个新数据点比移动平均值高4.0个标准差,而阈值参数设置为3.5,则算法会将该数据点识别为信号。此参数应根据预期的信号数量进行设置。例如,如果您的数据呈正态分布,则阈值为3.5(或:z分数)对应于0.00047的信号概率(参见此表),这意味着您每2128个数据点期望出现一次信号(1/0.00047)。因此,阈值直接影响了算法的敏感度以及算法发出信号的频率。请检查您自己的数据并确定一个合理的阈值,使算法在您希望的时候发出信号(可能需要一些试错才能找到适合您目的的良好阈值)。
测试
composer test
变更日志
请参阅变更日志了解最近的变化。
贡献
请参阅贡献指南获取详细信息。
安全
如果您发现任何安全相关的问题,请通过电子邮件aus.james@gmail.com联系,而不是使用问题跟踪器。
致谢
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。