文章目录

  • Dixon 检验——单侧检验
    • 原理步骤
    • Python 实现
  • Dixon 检验——双侧检验
  • 小案例

本文主要根据 GB/T 4883-2008 的 7.3 条款写成。

记样本为 x1,x2,⋯,xnx_1, x_2, \cdots, x_nx1​,x2​,⋯,xn​,n 为样本容量,按照升序排序,得到持续统计量为 x(1),x(2),⋯,x(n)x_{(1)}, x_{(2)}, \cdots, x_{(n)}x(1)​,x(2)​,⋯,x(n)​

Dixon 检验——单侧检验

原理步骤

Dixon 检验一般是根据可能离群值,和离它最接近的值的距离,以及整个样本的跨度,来判断该值是否为离群值。这些可能离群值,需要接收判断的值,有时候也叫歧离值。

Dixon 检验一般用在 [3,30] 时,比较有效。因此,本文主要讨论 [3, 30] 的情况。

Dixon 检验的检验统计量为(DnD_nDn​ 为上侧检验时的统计量,Dn′D_n^\primeDn′​ 为下侧检验时的统计量):
Dn=r10=x(n)−x(n−1)x(n)−x(1)3≤n≤7Dn′=r10′=x(2)−x(1)x(n)−x(1)3≤n≤7Dn=r11=x(n)−x(n−1)x(n)−x(2)8≤n≤10Dn′=r11′=x(2)−x(1)x(n−1)−x(1)8≤n≤10Dn=r21=x(n)−x(n−2)x(n)−x(2)11≤n≤13Dn′=r21′=x(3)−x(1)x(n−1)−x(1)11≤n≤13Dn=r22=x(n)−x(n−2)x(n)−x(3)14≤n≤30Dn′=r22′=x(3)−x(1)x(n−2)−x(1)14≤n≤30D_n = r_{10} = \frac{x_{(n)} - x_{(n-1)}} {x_{(n)} - x_{(1)}} \text{~~~~~~} 3 \leq n \leq 7 \\ \text{ }\\ D_n^\prime = r^\prime_{10} = \frac{x_{(2)} - x_{(1)}} {x_{(n)} - x_{(1)}} \text{~~~~~~} 3 \leq n \leq 7 \\ \text{ }\\ D_n = r_{11} = \frac{x_{(n)} - x_{(n-1)}} {x_{(n)} - x_{(2)}} \text{~~~~~~} 8 \leq n \leq10 \\ \text{ } \\ D_n^\prime = r^\prime_{11} = \frac{x_{(2)} - x_{(1)}} {x_{(n-1)} - x_{(1)}} \text{~~~~~~} 8 \leq n \leq 10 \\ \text{ }\\ D_n = r_{21} = \frac{x_{(n)} - x_{(n-2)}} {x_{(n)} - x_{(2)}} \text{~~~~~~} 11 \leq n \leq13 \\ \text{ } \\ D_n^\prime = r^\prime_{21} = \frac{x_{(3)} - x_{(1)}} {x_{(n-1)} - x_{(1)}} \text{~~~~~~} 11 \leq n \leq 13 \\ \text{ }\\ D_n = r_{22} = \frac{x_{(n)} - x_{(n-2)}} {x_{(n)} - x_{(3)}} \text{~~~~~~} 14 \leq n \leq30 \\ \text{ } \\ D_n^\prime = r^\prime_{22} = \frac{x_{(3)} - x_{(1)}} {x_{(n-2)} - x_{(1)}} \text{~~~~~~} 14 \leq n \leq 30 \\ Dn​=r10​=x(n)​−x(1)​x(n)​−x(n−1)​​      3≤n≤7 Dn′​=r10′​=x(n)​−x(1)​x(2)​−x(1)​​      3≤n≤7 Dn​=r11​=x(n)​−x(2)​x(n)​−x(n−1)​​      8≤n≤10 Dn′​=r11′​=x(n−1)​−x(1)​x(2)​−x(1)​​      8≤n≤10 Dn​=r21​=x(n)​−x(2)​x(n)​−x(n−2)​​      11≤n≤13 Dn′​=r21′​=x(n−1)​−x(1)​x(3)​−x(1)​​      11≤n≤13 Dn​=r22​=x(n)​−x(3)​x(n)​−x(n−2)​​      14≤n≤30 Dn′​=r22′​=x(n−2)​−x(1)​x(3)​−x(1)​​      14≤n≤30

对于单侧检验,若 suspected 的离群值是 x(1)x_{(1)}x(1)​,则计算 Dn′D_n^\primeDn′​;若离群值可能是 x(n)x_{(n)}x(n)​,则计算 DnD_nDn​,择定一个检测水平 α\alphaα,并根据 GB/T 4883-2008 的 A.3 表,查询检验统计量 D 的临界值,表格摘录如下:

记临界值为 DDD,若 Dnor Dn′>DD_n \text{ or }D_n^\prime > DDn​ or Dn′​>D,则意味着 x(n)或 x(1)x_{(n)} \text{ 或 } x_{(1)}x(n)​ 或 x(1)​ 是歧离值(straggler)。之后,再择定一个更为严格的剔除水平,并找出临界值 D∗D^*D∗,若 Dnor Dn′>D∗D_n \text{ or }D_n^\prime > D^*Dn​ or Dn′​>D∗,则意味着 x(n)或 x(1)x_{(n)} \text{ 或 } x_{(1)}x(n)​ 或 x(1)​ 是离群值(outlier)。

Python 实现

我们把表格保存为一个叫 dixon_critical_value.xlsx 的表格之中:

import numpy as np
import pandas as pddef perform_dixon_test_one_tailed(x, lower=True, alpha=0.95):if isinstance(x, pd.Series) or isinstance(x, pd.DataFrame):x = x.astype('float').valuesif isinstance(x, list):x = np.array(x)if alpha not in [0.95, 0.99, 0.90]:raise(Exception('置信水平可选择:[0.95, 0.99, 0.90]'))x_sort = np.sort(x)# 样本个数n = len(x)if n < 3 or n > 30:raise(Exception('Dixon 检验一般用在样本容量为 [3,30] 时才会比较准确'))if alpha == 0.95:dection_level = 0.95deletion_level = 0.99elif alpha == 0.90:dection_level = 0.90deletion_level = 0.95elif alpha == 0.99:dection_level = 0.99deletion_level = 0.995if n >= 3 and n <= 7:if lower:Q = (x[1] - x[0])/(x[-1] - x[0])else:Q = (x[-1] - x[-2])/(x[-1] - x[0])elif n >= 8 and n <= 10:if lower:Q = (x[1] - x[0])/(x[-2] - x[0])else:Q = (x[-1] - x[-2])/(x[-1] - x[1])elif n >= 11 and n <= 13:if lower:Q = (x[2] - x[0])/(x[-2] - x[0])else:Q = (x[-1] - x[-3])/(x[-1] - x[1])elif n >= 14 and n <= 30:if lower:Q = (x[2] - x[0])/(x[-3] - x[0])else:Q = (x[-1] - x[-3])/(x[-1] - x[2])path = r'./dixon_critical_value.xlsx'critical_values = pd.read_excel(path)critical_value = critical_values.loc[critical_values['n']==n][dection_level]critical_value = float(critical_value.values)if Q > critical_value:if lower:straggler = x[0]else:straggler = x[-1]else:print('无离群值')return xcritical_value = critical_values.loc[critical_values['n']==n][deletion_level]critical_value = float(critical_value.values)# 根据剔除水平,检测出离群值if Q > critical_value:outlier = stragglerprint('样本中带有离群值值: ', outlier)x = np.delete(x, np.where(x==outlier))return xelse:print('样本中带有歧离值: ', straggler)return x

(注意:GB/T 4883-2008)中的案例是错误的,其 D16′D_{16}^\primeD16′​ 的值算错了,大家注意。

Dixon 检验——双侧检验

双侧检验其实也是一样的,计算出 DnD_nDn​ 和 Dn′D_n^\primeDn′​,在从两者的最大值中,得到检验统计量 max⁡(Dn,Dn′)\max(D_n, D_n^\prime)max(Dn​,Dn′​),当然,哪个大,就对应 x(1),x(n)x_{(1)}, x_{(n)}x(1)​,x(n)​ 哪个是可能的离群值。

之后,再从表 A.3′^\prime′ 中找出 DnD_nDn​ 的临界值 DDD。临界值表摘录如下:

我们将表格保存为: dixon_critical_value.xlsx 的工作簿 ‘two-tailed’ 中,实现代码如下:

if __name__ == '__main__':
def perform_dixon_test_two_tailed(x, alpha=0.95):if isinstance(x, pd.Series) or isinstance(x, pd.DataFrame):x = x.astype('float').valuesif isinstance(x, list):x = np.array(x)if alpha not in [0.95]:raise(Exception('置信水平可选择:[0.95]'))x_sort = np.sort(x)# 样本个数n = len(x)if n < 3 or n > 30:raise(Exception('Dixon 检验一般用在样本容量为 [3,30] 时才会比较准确'))dection_level = 0.95deletion_level = 0.99if n >= 3 and n <= 7:Q_lower = (x[1] - x[0])/(x[-1] - x[0])Q_upper = (x[-1] - x[-2])/(x[-1] - x[0])elif n >= 8 and n <= 10:Q_lower = (x[1] - x[0])/(x[-2] - x[0])Q_upper = (x[-1] - x[-2])/(x[-1] - x[1])elif n >= 11 and n <= 13:Q_lower = (x[2] - x[0])/(x[-2] - x[0])Q_upper = (x[-1] - x[-3])/(x[-1] - x[1])elif n >= 14 and n <= 30:Q_lower = (x[2] - x[0])/(x[-3] - x[0])Q_upper = (x[-1] - x[-3])/(x[-1] - x[2])Q = np.array([Q_lower, Q_upper])idx_max = np.argmax(Q)Q_max = Q[idx_max]path = r'./dixon_critical_value.xlsx'critical_values = pd.read_excel(path, sheet_name='two-tailed')critical_value = critical_values.loc[critical_values['n']==n][dection_level]critical_value = float(critical_value.values)if Q_max > critical_value:straggler = x[-idx_max]else:print('无离群值')return xcritical_value = critical_values.loc[critical_values['n']==n][deletion_level]critical_value = float(critical_value.values)# 根据剔除水平,检测出离群值if Q_max > critical_value:outlier = stragglerprint('样本中带有离群值值: ', outlier)x = np.delete(x, np.where(x==outlier))return xelse:print('样本中带有歧离值: ', straggler)return x

小案例

if __name__ == '__main__':# Dixon 检验案例x = np.array([1125, 1248, 1250, 1259, 1273, 1279, 1285, \1285, 1293, 1300, 1305, 1312, 1315, 1324, 1325, 1350])x_1 = perform_dixon_test_one_tailed(x, alpha=0.95, lower=True)x_2 = perform_dixon_test_two_tailed(x, alpha=0.95)

Dixon 检验法判断正态分布离群值——原理和 Python 实现相关推荐

  1. 机器学习笔记——2 简单线性模型及局部加权线性模型的基本原理和python实现(参数估计的两个基本角度:几何直观和概率直观。函数最值问题的两大基本算法:梯度方法与迭代方法)

    简单线性模型及局部加权线性模型的基本原理和python实现(参数估计的两个基本角度:几何直观和概率直观.函数最值问题的两大基本算法:梯度方法与迭代方法) 线性模型是什么? 线性模型是监督学习的各类学习 ...

  2. 单链表反转的原理和python代码实现

    链表是一种基础的数据结构,也是算法学习的重中之重.其中单链表反转是一个经常会被考察到的知识点. 单链表反转是将一个给定顺序的单链表通过算法转为逆序排列,尽管听起来很简单,但要通过算法实现也并不是非常容 ...

  3. 浅谈特征选择的原理和Python实现

    0.引言 在现实世界中,我们总是倾向于收集尽可能多的特征来描述一个事物,以期能够更加全面准确的对其进行刻画.然而,我们了解事物的目的是变化着的,所以并非每一次对事物的刻画都需要所有特征.例如在机器学习 ...

  4. 回归分析---线性回归原理和Python实现

    2019独角兽企业重金招聘Python工程师标准>>> 本文主要运用Python进行简单的线性回归,首先是介绍了线性回归的基本理论,然后是运用一些网络爬虫数据进行回归分析. 1 2 ...

  5. 【图像处理】——图像质量评价指标信噪比(PSNR)和结构相似性(SSIM)(含原理和Python代码)

    目录 一.信噪比(PSNR) 1.信噪比的原理与计算公式 2.Python常规代码实现PSNR计算 3.TensorFlow实现PSNR计算 4.skimage实现PSNR计算 5.三种方法计算的结果 ...

  6. EM算法原理和python简单实现

    目录 第一章最大似然估计    1 第二章最大似然估计到EM    2 第三章 EM算法推导    3 第四章 EM例子和python代码    7 参考文献    8 最大似然估计 这篇文章主要是在 ...

  7. 高斯模糊原理和python实现

    高斯模糊是一种常见的模糊技术,相关知识点有:高斯函数.二维卷积. 更多优质文章可以关注微信公众号[kelly学挖掘],欢迎访问 (一)一维高斯分布函数 一维(连续变量)高斯函数形式如下,高斯函数又称& ...

  8. 线性插值法的原理和python代码实现

    假设我们已知坐标 (x0, y0) 与 (x1, y1),要得到 [x0, x1] 区间内某一位置 x 在直线上的值.根据图中所示,我们得到 由于 x 值已知,所以可以从公式得到 y 的值 已知 y  ...

  9. python 隐马尔科夫_隐马尔可夫模型原理和python实现

    隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程.其难点是从可观察的参数中确定该过程的隐含参数. 隐马尔可夫模型注意包含以下参数 ...

最新文章

  1. Linux(9)用户、组和权限管理
  2. 刚从阿里、头条面试回来,尚硅谷java数据结构与算法百度云
  3. java判断字符串是什么编码_java可供判断某字符串是什么编码的一行代码
  4. PIC32单片机harmony开发环境 - SPI例程和代码分析
  5. 【CodeForces - 1199C】MP3(思维,离散化)
  6. LVS学习笔记--DR模式部署
  7. 你是如何离编程越来越远的?
  8. OpenCV Sobel和Scharr (索贝尔和夏尔滤波器检测边缘)
  9. 学51单片机需要专门把C语言学透吗
  10. ArcGIS 计算地块容积率
  11. android怎么执行命令,Android程序中执行adb命令
  12. SpringBoot集成Jsoup爬虫——三级列表
  13. 微信开发者工具调试H5项目报错:XXXXfail, the permission value is offline verifying解决方案
  14. k8s集群添加master节点
  15. Android开发者上手宝典(三)
  16. MYSQL5.7(64位)安装包及安装步骤
  17. ChinaSoft 论坛巡礼 | 优秀博士生论坛
  18. 从C快速入门C++ (命名空间、引用、函数重载)
  19. 关于数据库系统的学习
  20. LiveNVR配置拉转RTSP传统海康大华安防摄像机直播流输出RTSP/RTMP/HLS/HTTP-FLV如何获取直播流地址

热门文章

  1. 智能家居系统的发展趋势
  2. GitLab 无法显示头像的解决方法
  3. 如何用excel做多元回归分析
  4. 手机串号和SIM卡串号
  5. cnn和rnn可以结合使用吗,rnn和cnn优点缺点对比
  6. 粗粒度和细粒度的区别
  7. 三行代码搭建一个全能书籍系统(wiki)
  8. 手机App开发的基础概念
  9. CoM+日志错误 Help!!!
  10. PowerPoint演示文档大瘦身