python实现时序异常检测_时序预测 01 - 异常检测 Smoothed z-score algorithm 标准化的一些实践、调参总结 -Python/pandas/numpy...
z-score 的基础概念
这种方法基于原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。
将A的原始值x使用z-score标准化到x’,
x′=x−μδ ,μ为数据的均值, δ为方差。
z-score标准化方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。
将数据按其属性(按列进行)减去其均值,然后除以其方差。
最后得到的结果是,对每个属性/每列来说所有数据都聚集在0附近,方差值为1。
Python使用平滑移动+z-score进行时序数据的异常值检测 (调参总结见代码注释及后续结果输出)
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import math
def smoothed_z_score_test(data):
""" 一点调参总结
平滑z-score 测试
:param y: 原DataFrame的数据列
:param lag: 滞后数(初始滑动窗口大小) , 建议设置为业务线的循环周期需要的天数, 看业务线的周期规律——估算出回归周期,乘上系数; 按天变化的设置为7*4天, 按周的设置为7*4*4天, 等
:param threshold: 阈值 = 当前值超出前面所有的值的平均水平的绝对值 除以 前面所有的值的标准差的倍数 的上限, 建议2倍
:param influence: 平滑系数,发生异常点时使用的平滑系数,(0,1),值越大越受当前值的影响,及异常值的折算系数,建议0.5左右
:return:
"""
input_id = 157 # 输入数据的id
output_id = 161 # 聚合并输出的数据的id
start_date = '2017-01-01' # 开始转换的时间
end_date = '2020-01-31' # 结束转换的时间
y = data[input_id]['data_value']
# 设置z-score参数
lag, threshold, influence = 8 * 2, 2, 0.5
signals = np.zeros(len(y))
filteredY = np.array(y)
avgFilter = [0] * len(y)
stdFilter = [0] * len(y)
avgFilter[lag - 1] = np.mean(y[0:lag])
stdFilter[lag - 1] = np.std(y[0:lag])
for i in range(lag, len(y)):
if abs(y[i] - avgFilter[i - 1]) > threshold * stdFilter[i - 1]:
if y[i] > avgFilter[i - 1]:
signals[i] = 1
else:
signals[i] = -1
filteredY[i] = influence * y[i] + (1 - influence) * filteredY[i - 1]
avgFilter[i] = np.mean(filteredY[(i - lag + 1):i + 1])
stdFilter[i] = np.std(filteredY[(i - lag + 1):i + 1])
else:
signals[i] = 0
filteredY[i] = y[i]
avgFilter[i] = np.mean(filteredY[(i - lag + 1):i + 1])
stdFilter[i] = np.std(filteredY[(i - lag + 1):i + 1])
series_dict = dict(signals=np.asarray(signals),
avgFilter=np.asarray(avgFilter),
stdFilter=np.asarray(stdFilter)
)
data[output_id] = data[input_id].copy()
data[output_id]['data_value'] = np.asarray(series_dict['signals'])
def paint(dfs=[], labels=[], title='暂无'):
assert len(dfs) == len(labels)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文标签
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(16, 8))
for i in range(0, len(dfs)):
plt.plot(dfs[i]['data_value'], label=labels[i])
plt.legend(loc='best')
plt.title(title)
plt.show()
if __name__ == '__main__':
idx = pd.date_range('2020-01-01', periods=90, freq='D')
cos_arr = np.arange(len(idx)) * np.pi / 8
for i in range(0, len(cos_arr)):
cos_arr[i] = math.cos(cos_arr[i])
# 人为制造两个异常点
cos_arr[24] -= 1
cos_arr[25] -= 2
cos_arr[32] += 1
data_value = pd.Series(cos_arr, index=idx)
# 设置z-score参数
df = pd.DataFrame({
'data_time': idx, # 时间列
'data_value': data_value # 数据列
})
data = {}
data[157] = df
data[161] = pd.DataFrame()
smoothed_z_score_test(data)
paint(dfs=[data[157], data[161]], labels=['origin', 'signal'])
输出绘图
正弦函数模拟测试01 (上面的代码的直接输出)
输入数据特征: 回归周期为8*2天,阈值2倍, 异常值折算为0.5倍
对应使用的参数为lag, threshold, influence = 8 * 2, 2, 0.5
历史某业务线数据测试 (多次调整后)
输入数据特征: 回归周期为24小时(再74后就是一个月),阈值3倍, 异常值折算为0.5倍
使用参数为: lag, threshold, influence = 2474, 3, 0.5
蓝线为业务数据, 红线为 z-score计算出的脉冲数据乘以100倍
参考链接:
python实现时序异常检测_时序预测 01 - 异常检测 Smoothed z-score algorithm 标准化的一些实践、调参总结 -Python/pandas/numpy...相关推荐
- mysql时序性数据库_时序数据库入门
数据库的模型包含关系型.key-value 型.Document 型等很多种,那么为什么新型的时序数据库成为监控数据存储的新宠呢? 下面就会从 为什么需要时序数据库? 时序数据库的数据结构 两个方面来 ...
- tensorflow图形检测_社交距离检测器——Tensorflow检测模型设计
在隔离期间,我花时间在github上探索Tensorflow的大量预训练模型.这样做时,我偶然发现了一个包含25 个带有性能和速度指标的预训练对象检测模型的存储库.拥有一些计算机视觉知识并给出了实际的 ...
- keras faster物体检测_全网 | 深度学习目标检测算法(精选12篇)
太多的公众号每天的文章是否让你眼花缭乱?刷了好多文章,发现大都是转来转去?今天我在全网公众号里为大家精选主题为深度学习目标检测算法的文章12篇,其中包括综述,R-CNN,SPP-Net,Fast R- ...
- 【文件上传绕过】——后端检测_文件的扩展名检测漏洞
文章目录 一.漏洞说明: 二.工具: 三.实验环境: 四.实验目的: 五.检测方法: 1. 黑名单: 2. 白名单: 六.绕过方式: 1. 白名单绕过: 1.1 解析漏洞: 1.2 截断上传: 原理: ...
- opencv表面缺陷检测_彩钢板表面缺陷在线检测--Smart Vision
原标题:彩钢板表面缺陷在线检测--Smart Vision 彩涂板是冶金和化工结合的产物,既有有机聚合物的良好着色性.耐蚀性,又有钢板的高强度和易加工性,这就使彩涂板具有优良的实用性.耐久性等特点.彩 ...
- java异常机制_全面理解java异常机制
在理想状态下,程序会按照我们预想的步骤一步一步的执行,但是即使你是大牛,你也不可避免出错,所以java为我们提供了异常机制.本文将会从以下几个方面介绍java中的异常机制: 异常机制的层次结构 异常的 ...
- java 波峰检测_脉搏波波峰波谷自动检测方法
脉搏波波峰波谷自动检测方法 [技术领域] [0001]本发明属人体健康监护技术领域,涉及一种脉搏波波峰波谷自动检测方法,尤其涉及脉搏波中存在大量人为.系统噪声以及心率快速变化的情况.可用于临床心电图自 ...
- python xgboost调参_XGBoost完全调参指南(Python)
花了三四天学习XGBoost,这篇文章教会了我如何调参.我把文章的主要内容作翻译和摘录,也算是为XGboost中文社区贡献一份资源. 前言 XGBoost中的算法已经成为了许多数据科学家的终极武器了! ...
- python基于svm的异常检测_[scikit learn]:异常检测-OneClassSVM的替代方案
不幸的是,scikit目前只学习implements一类支持向量机和用于离群点检测的鲁棒协方差估计 通过检查2d数据上的差异,可以尝试比较这些方法(as provided in the doc):im ...
- python图片目标检测_图像中的目标检测(HOG)
我想探测显微镜图像细胞内的物体.我有很多带注释的图片(app.有对象的图像为50000,没有对象的图像为500000).在 到目前为止,我尝试使用HOG提取特征,并使用logistic回归和Linea ...
最新文章
- C 函数别名简单记录
- 送书拉!给开发者们的几本书籍 |福利
- cocos2d-js 3.0 RC0 监听返回键、菜单键、进入后台(home键)、恢复显示等事件
- java.util.concurrent BlockingQueue详解
- 【运维技术】Zookeeper单机以及集群搭建教程
- 贪心/栈 - 去除重复字母
- (转) Android平台上关于IM的实践总结
- matlab硬币覆盖问题和八皇后,八皇后问题matlab程序
- Matrix Chain Multiplication (堆栈)
- java string equal 与==的区别
- AcWing 1855. 愤怒的奶牛(枚举+暴力)
- hdu-1521 排列组合 指数型母函数
- MPLS排错练习题分享
- Ubuntu下装codeblocks
- K41H 老笔记本维修升级记
- ubuntu 11.10使用fcitx双拼输入法
- 高并发的核心技术-幂等的实现方案
- 广州住房公积金提取、变更的步骤
- ant design vue全局引用一直提示没有isMoment参数的问题
- 7-30 正常血压 (6 分)