首页 > 编程知识 正文

基于时间序列的异常检测算法,时序异常检测算法

时间:2023-05-06 10:26:14 阅读:194065 作者:3145

  3σ算法检测离群点--实例 一、原数据

如下,共有六列,第一行为空,之后会修正,利用数据整体均值进行代替。

二、文字流程

1. 检测整个数据集的整体均值与标准差,同时利用ks检验判断数据是否符合正态分布。

2. 3σ准则的代码实现(该算法需要数据符合正态分布)

3. 为检测结果图添加各种文字或直线标注,使数据更为直观

三、代码 import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport numpyfrom scipy import statsfrom pylab import *import math# 对整个文件中的数据进行离群点检测def threesigma(str1, n): # 3σ的3可以是n,自己根据数据来调整,选检测效果最好的。 df = pd.read_csv(str1) # 第一部分,求dataframe所有列整体的均值和标准差,同时利用ks检验判断数据是否符合正态分布。 sum = df.sum() sum = sum.sum() u = sum / (df.shape[0] * df.shape[1]) # 计算整体均值 # dataframe按列转list columns = df.columns print(df.shape) print(columns) df1 = [] for c in columns: # 把每列都转为list d = df[c].values.tolist() df1.append(d) print(df1) # df1是大列表,内含六个小列表,每个列表对应我原数据的一列,共六列 list = [] for i in range(df.shape[1]): # 把df1中的六个小列表合成一个大列表 for j in range(df.shape[0]): if math.isnan(df1[i][j]): # 如果值为空,则修正为所有数据的均值 df1[i][j] = u print(i, j, df1[i][j]) list.append(df1[i][j]) print(list) df2 = pd.DataFrame(list, columns=['value']) print(df2.shape) std = df2['value'].std() print("均值为:", u) print("标准差为:", std) print(stats.kstest(df2['value'], 'norm', (u, std))) # 打印出的pvalue大于0.05则该数据集符合正态分布,statistic为统计量, norm为参数cdf,代表此处是正态性检验 # statistic即D,是根据两个样本对应经验分布函数的差所形成的的统计量,用于比较两个总体的真实分布是否相同,此处属于frddy检验。 ''' 第二部分,3σ准则(数据需要符合正态分布) 绘制目标数据散点图 plt.plot(df2) plt.show() ''' min = u - n * std # 此处 max = u + n * std error = df2[(df2['value'] < min) | (df2['value'] > max)] # 寻找落在上下边界之外的异常值。 print(error) if not error.empty: print("存在离群点") row = error.shape[0] print("离群点数量: "+str(row)) index_list = error.index.tolist() # 把error的索引转换成列表 plt.plot(df2) print(index_list) for i in range(row): y = error.values[i][0] # 获取列值 x = index_list[i] # 获取对应行索引,x和y即坐标 plt.plot(x, y, 'rs-', markersize=20, markerfacecolor='none') plt.plot(x, y, 'ro-', markersize=5) # plt.plot(315, df2['value'][315], 'ks') plt.axhline(y=u, ls=":", c="black") # 添加水平均值直线 plt.axhline(y=min, ls="--", c="green") # 添加下界 plt.axhline(y=max, ls="--", c="green") # 添加上界 plt.text(2160, u + 0.05, "Average", fontsize=12, fontweight=60) plt.text(2160, min + 0.05, "Lower bound", fontsize=12, fontweight=60) plt.text(2160, max + 0.05, "Upper bound", fontsize=12, fontweight=60) mpl.rcParams['font.sans-serif'] = ['SimHei'] # 添加中文字体显示 plt.rcParams['axes.unicode_minus'] = False # 防止负号无法正常显示 plt.title("离群点数量为:"+str(row), c='black', fontsize=20) plt.show()str1 = r'C:UsersGaulleDesktopanomaly_Detection_Dataset/overall_fluctuation/data7.xls'threesigma(str1, 3)

注:欢迎大家一起交流,如果各位有异常检测的微信或者QQ群,还请留言给我,我找不到学习团体啊,求队友。PS:有存疑的代码可以回复我,我尽量及时解答。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。