尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

如何用 TDengine 统计方法识别时间序列数据中的异常点

如何用 TDengine 统计方法识别时间序列数据中的异常点 如何用 TDengine 统计方法识别时间序列数据中的异常点【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine当你的时序数据如设备采集的电流值、传感器读数里混入了偏离正常区间的突变点需要找出这些异常点所在的时段并做后续统计时可以用 TDengine 的异常状态窗口功能完成这件事。它在查询的窗口子句中通过ANOMALY_WINDOW调用异常检测算法由算法识别出连续异常数据所在的时间窗口并通过窗口伪列_WSTART、_WEND、_WDURATION描述每个异常窗口的起始时间、结束时间和持续时间。使用这类高级分析功能的前提是先部署 TDgpt 服务Taos AI nodeanode并注册到 TDengine 中具体部署步骤见 安装部署。开始前确认环境TDgpt 服务已在运行并注册到 TDengine。可用 SHOW ANODES 查看分析节点信息SHOW ANODES;用SHOW ANODES FULL额外显示节点上已加载的算法明细。可用算法以该命令实际返回为准也可以通过 INS_ANODES / INS_ANODES_FULL 系统表查询注意 SYSINFO 为 0 的用户不能查看这两张表。待检测的列必须是数值类型NCHAR、VARCHAR、VARBINARY等字符类型不能作为输入支持结果为数值类型的表达式不支持 tag 和非数值结果。ANOMALY_WINDOW 的写法语法如下ANOMALY_WINDOW(column_expr [, column_expr ...] [, option_expr]) option_expr: { algoexpr1 [,wncheck1|0] [,expr2] }column_expr参与异常检测的输入数据列可以有多个。自v3.4.1.0起支持多列输入对于只能处理单列的算法只识别第一列多余的列自动忽略v3.4.1.0之前传多列会报错。option_expr以逗号分隔的KV字符串指定算法和参数字符串内不需要单引号、双引号或转义符不能使用中文及其他宽字符。例如algoksigma,k2表示使用 ksigma 算法、参数 k 为 2。算法相关的两个基础参数参数含义默认值algo调用的异常检测算法iqrwncheck是否对输入数据列进行白噪声检查取值为 0 或 11输入数据默认进行白噪声检查如果输入是白噪声查询不会返回任何异常窗口信息。异常检测的结果可以作为外层查询的子查询输入在SELECT子句中使用的聚合函数、标量函数与其他窗口查询相同。选择统计类算法并执行查询TDengine 内置算法分为 统计学、数据密度和机器学习三类。不指定algo时默认调用iqr。统计类算法的适用条件和用法如下按你的数据特征选择IQR默认四分位距方法。$IQR Q3 - Q1$落在 $Q1 - 1.5 \times IQR$ 到 $Q3 1.5 \times IQR$ 区间内视为正常区间之外是异常值。无输入参数不要求数据服从特定分布是最通用的起点-- 使用 IQR 算法对 i32 列做异常检测同时输出异常窗口起止时间、窗口内求和与异常标识 SELECT _wstart, _wend, SUM(i32), _anomalymark FROM foo ANOMALY_WINDOW(i32, algoiqr);ksigma基于 68–95–99.7 规则以序列均值 ± k 倍标准差为边界超过边界的点是异常值。要求数据整体上服从正态分布参数k选填默认3-- 指定调用的算法为 ksigma参数 k 为 2 SELECT _WSTART, COUNT(*) FROM foo ANOMALY_WINDOW(foo.i32, algoksigma,k2);Grubbs最大标准残差测试常用于检验最大值、最小值偏离均值的程度是否异常。要求单变量数据集遵循近似标准正态分布非正态分布数据集不能使用。无输入参数SELECT _WSTART, COUNT(*) FROM foo ANOMALY_WINDOW(foo.i32, algogrubbs);SHESD带有季节性的 ESD 检测用于时间序列中的多异常点适合数据含周期性的场景参数说明是否必选默认值direction异常检测方向pos/neg/both否bothmax_anoms异常值比例上界$0 K \le 49.9$文档注明数据集的异常比例一般不超过 5%否0.05period一个周期包含的数据点否0-- direction 为 both异常值比例上界 5% SELECT _WSTART, COUNT(*) FROM foo ANOMALY_WINDOW(foo.i32, algoshesd,directionboth,max_anoms0.05);可选分支——多变量统计算法如果异常需要结合多个数值列联合判断例如同时看温度和压力可用 ECOD、COPOD 或 PCA它们不要求数据服从特定参数分布或不需要预先假设具体分布-- ECOD基于经验累积分布的离群点检测尾部概率越小越异常 SELECT _WSTART, COUNT(*) FROM foo ANOMALY_WINDOW(foo.i32, foo.i64, algoecod,contamination0.1); -- COPOD基于 Copula 的离群点检测 SELECT _WSTART, COUNT(*) FROM foo ANOMALY_WINDOW(foo.i32, foo.i64, algocopod,contamination0.1); -- PCA投影到主成分空间按偏离程度计算离群分数适用于正常数据具有较明显低维线性结构的场景 SELECT _WSTART, COUNT(*) FROM foo ANOMALY_WINDOW(foo.i32, foo.i64, algopca,contamination0.1,n_components2);这三个算法的参数contamination指定预期异常点比例取值范围(0, 0.5]默认0.1PCA 另有n_components主成分数量必须大于 0默认全部主成分和standardization是否对输入特征标准化1启用、0禁用默认1。结果验证如何读返回的异常窗口查询返回的每个异常窗口由伪列描述_WSTART/_WEND/_WDURATION异常窗口的起始时间、结束时间、持续时间用法与其他时间窗口查询一致_anomalymark异常标识列用于输出和标识不同的异常类型。默认情况下所有内置异常检测算法针对异常点的异常值均输出-1。文档示例仅展示输出形态不是你必须得到的固定数值taos SELECT _wstart, _wend, count(*) FROM foo ANOMALY_WINDOW(i32); _wstart | _wend | count(*) | 2020-01-01 00:00:16.000 | 2020-01-01 00:00:17.000 | 2 | Query OK, 1 row(s) in set (0.028946s)拿到异常窗口后可以再针对窗口内的时序数据做聚合、变换等查询。判断结果是否符合预期时注意两点如果没有任何行返回先确认是否触发了默认的白噪声检查输入为白噪声时不返回任何窗口确需跳过检查时设置wncheck0。多列输入传给单列算法时只会识别第一列多余的列自动忽略v3.4.1.0起的行为因此返回结果只反映第一列的检测。限制与边界输入列只能是数值类型tag 和非数值表达式不能直接作为输入。option_expr字符串不能包含中文及其他宽字符否则会失败。ksigma 与 Grubbs 依赖正态/近似正态分布假设数据明显非正态时应改用 IQR、SHESD 或多变量算法。算法列表随版本变化SHOW ANODES FULL的实际返回是判断当前部署支持哪些algo的唯一依据。更多算法数据密度类如 LOF、HBOS以及机器学习类见 异常检测 章节TDgpt 企业版还提供基于查准率、查全率的 模型评估工具可用于对比不同检测算法的有效性。【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表