您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
拉依达准则(拉以达准则算法)
异常,数据,临界值拉依达准则(拉以达准则算法)
发布时间:2016-12-08加入收藏来源:互联网点击:
很多朋友想了解关于拉依达准则的一些资料信息,下面是小编整理的与拉依达准则相关的内容分享给大家,一起来看看吧。
近期,工作需要试了很多异常检测的方法,统计学和算法相关的都有,所以来总结一下。
在本篇文章主要从原理、python实现、局限的方式讲述以下几种统计学的异常检测的方法:
1、3Sigma
2、Numeric Outlier
3、格拉布斯准则(Grubbs算法)
4、多维度异常检测:马氏距离
1、3igma原理:
3Sigma又称为拉依达准则,这种判别处理原理及方法仅局限于对正态或近似正态分布的
样本数据处理,原则:
数值分布在(μ-σ,μ+σ)中的概率为0.6827
数值分布在(μ-2σ,μ+2σ)中的概率为0.9545
数值分布在(μ-3σ,μ+3σ)中的概率为0.9973
所以,数据在(μ-3σ,μ+3σ)的概率低于0.01,我们可以称这些数据为异常值。
Python实现:
1、依据历史数据计算出正常区间(μ-3σ,μ+3σ)
2、判断目标数据是否有异常值
#输出正常区间def ThreeSigmod(value): #value是单维的历史数据 avg = np.mean(value) std = np.std(value) threshold_up = avg + 3*std threshold_down = avg -3*stdreturn [float(threshold_down),float(threshold_up)] #输出异常值def function_ar(histroy,predict): threshold = ThreeSigmod(histroy) error = list(filter(lambda s:(sthreshold[0])|(sthreshold[1]),predict) return error局限:
1、要保证历史数据异常点较少(均值容易被异常点拉偏)
2、只能检测单维数据
3、需假定数据服从正态分布或近正态分布
2、Numeric Outlier原理:
这种方法有另外一个耳熟能详的名字:箱线图法。箱线图法计算原理:
1、计算第一四分位数(Q1)及第三四分位数(Q3)
2、计算IQR (IQR = Q3 - Q1)
3、输出正常区间[Q1-1.5IQR,Q3+1.5IQR]
Python实现:
#输出正常区间def NumericOutlier(value): #value是单维的历史数据 iqr = np.quantile(value,0.75) - np.quantile(value,0.25) quan_down = np.quantile(value,0.25)-1.5*iqr quan_up = np.quantile(value,0.75)+1.5*iqr return [float(quan_down),float(quan_up)] #输出异常值def function_ar(histroy,predict): threshold = ThreeSigmod(histroy) error = list(filter(lambda s:(sthreshold[0])|(sthreshold[1]),predict) return error局限:
1、只能检测单维数据
3、格拉布斯准则(Grubbs算法)1、数据:8.2、5.4、14.0、7.3、4.7、9.0、6.5、10.1、7.7、6.0。2、排列数据:将上述测量数据按从小到大的顺序排列,得到4.7、5.4、 6.0、6.5、7.3、7.7、8.2、9.0、10.1、14.0。可以肯定,可疑值 不是最小值就是最大值。3、计算平均值x-和标准差s:x-=7.89;标准差s=2.704。计算时,必 须将所有10个数据全部包含在内。4、计算偏离值:平均值与最小值之差为7.89-4.7=3.19;最大值与平均 值之差为14.0-7.89=6.11。5、确定一个可疑值:比较起来,最大值与平均值之差6.11大于平均值与最 小值之差3.19,因此认为最大值14.0是可疑值。6、计算Gi值:Gi=(xi-x- )/s;其中i是可疑值的排列序号 ——10号;因此G10=( x10-x- )/s=(14.0-7.89)/2.704=2.260。 由于 x10-x-是残差,而s是标准差,因而可认为G10是残差与标准差的 比值。下面要把计算值Gi与格拉布斯表给出的临界值GP(n)比较,如果计 算的Gi值大于表中的临界值GP(n),则能判断该测量数据是异常值,可以 剔除。但是要提醒,临界值GP(n)与两个参数有关:检出水平α (与置信概 率P有关)和测量次数n (与自由度f有关)。7、定检出水平α:如果要求严格,检出水平α可以定得小一些,例如定α=0.01, 那么置信概率P=1-α=0.99;如果要求不严格,α可以定得大一些,例如定 α=0.10,即P=0.90;通常定α=0.05,P=0.95。8、查格拉布斯表获得临界值:根据选定的P值(此处为0.95)和测量次数n(此处为10), 查格拉布斯表,横竖相交得临界值G95(10)=2.176。9、比较计算值Gi和临界值G95(10):Gi=2.260,G95(10)=2.176,Gi>G95(10)。10、判断是否为异常值:因为Gi>G95(10),可以判断测量值14.0为异常值,将它从 10个测量数据中剔除。11、余下数据考虑:剩余的9个数据再按以上步骤计算,如果计算的Gi>G95(9), 仍然是异常值,剔除;如果Gi<G95(9),不是异常值,则不剔除。本例余下 的9个数据中没有异常值Python实现:
吐槽:刚开始想自己实现,看步骤也不算复杂,但看到需要查格拉布斯表就慌了,因为网上找到最大n值是100,意思是那这个方法最多只能测100的数据量,这也太少了吧...后来往下找,既然找到有大神已经实现了(https://github.com/c-data/outlier-utils),那我就不重复造轮子了。
#输出异常值from outliers import smirnov_grubbs as grubbsdef func_error(value): #value是单维的数据 error = set(value) - set(list(grubbs.test(value,alpha=0.05))) return value局限:
1、只能检测单维度数据
2、无法像以上两种方法精确的输出正常区间
3、它的判断机制是“逐一剔除”,所以每个异常值都要单独计算整个步骤,数据量大吃不消。
4、需假定数据服从正态分布或近正态分布
4、多维度异常检测原理:多维度利用统计学的方法做异常检测其中一个核心思想:计算每个点与中心点的距离,距离较远的可判断为异常点。计算距离的公式有很多,我们这里采用马氏距离。马氏距离的计算方式及与其他距离的差别因不是本文重点,这里就不描述了,感兴趣的可以看这篇:https://zhuanlan.zhihu.com/p/46626607
Python实现:
from scipy.spatial import distancedef func_mahalanobis(df,n_outliers): #n_outliers:异常值的个数,df:Dataframe #计算出异常值所对应的索引,越靠前的越异常 m_dist_order = Series([float(distance.mahalanobis(df.iloc[i], df.mean(), np.mat(df.cov().as_matrix()).I) ** 2) for i in range(len(df))]).sort_values(ascending=False).index.tolist() #假设n_outliers =2,说明你认为有2个异常,然后筛选出来 error_index = m_dist_order[:n_outliers] error = df.iloc[error_index] return error局限:1、需要自己设定异常个数。
2、不能精确输出正常区间
3、各维度均应符合正态分布
4、不能处理非线流形上的问题
小结:1、几种方法都有各自的优缺点,可以跟进自身业务去选择。以我自身的业务为例,需要我输出正常范围,所以在统计学的方法的选择上,我选了前两种方法。
2、统计学的方法局限不少,而且在一些存在时序周期的数据上表现非常差,这块将在下篇的“建模-异常检测”篇尝试解决。
感谢阅读!
一个记录会计到数据、算法路上所学的微信公众号:Dathon数据分析
本文到此结束,希望对大家有所帮助呢。
上一篇:中国外债总额168万亿(2020中国外债总额300万亿)
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |