一、常规标准化

z-score作为一种标准化方法,已经在各种数据处理中被使用,比如最为常见的机器学习,多种组学数据的标准化。

但是,z-score标准化有其自身的限制,这些限制来自于:

  • 异常值的存在
  • 正太分布(方差齐性)的假说

当我们在处理各种组学数据时,常常由于观察值不多导致数据在进行正态性检验的时候,发现并不服从正太假说;有时候,还会受到异常值的影响。

我们先介绍常规的z-score标准化方法:
zi=xi−μδz_i = \frac{x_i-\mu}{\delta}zi​=δxi​−μ​
其中,μ\muμ是均值;xix_ixi​表示样本观察值;δ\deltaδ表示所有样本观察值的标准差;ziz_izi​表示该样本点距离样本均值有多少个标准差,用来表示各原始数据在数据组中的相对位置。

一个常规的应用:

如果样本服从正态分布,当∣zi∣>2|z_i|>2∣zi​∣>2时,该样本点即为异常点。它标示的是距离均值2个标准差范围的数据量有95%(正态分布的性质),有2.5%的数据会被标记为异常。

二、修正后的z-score

由于均值和标准差对于异常值都比较敏感,导致常规的z-score方法出现偏差。因此,对其进行了修正:
Zi=xi−median(xi)MADZ_i=\frac{x_i-median(x_i)}{MAD}Zi​=MADxi​−median(xi​)​
其中,xix_ixi​是样本观察值,median(xi)median(x_i)median(xi​)是所有样本观察值的中位数,MAD(Median Absolute deviation)是中位数绝对偏差,定义如下:
MAD=median∣xi−median(xi)∣MAD=median|x_i-median(x_i)|MAD=median∣xi​−median(xi​)∣

标准差的定义是与均值距离的平方和,对异常值更敏感,比如一个较大的样本值在样本内,则会直接影响到样本的标准差,而MAD不会,它具有更好的鲁棒性

MAD与标准差的关系

MAD的用法类似于样本标准差,为了使用MAD作为一致估计量来估计标准差,我们可以有:
δ=k∗MAD\delta=k*MADδ=k∗MAD
其中,kkk只是一个常量因子,与样本分布有关,如果样本服从正态分布,k=1.4826k=1.4826k=1.4826.

三、实践

例子:这里有一个数据集,包含2012年康涅狄格州学区SAT的学生参与率,我们的任务是找到低参与率的学校,可以看做一个异常检测任务。由于我们要找低参与率的学校,所以阈值是一个负数,这里我们设为-2。
ps: 对于较大的数据集,较大的绝对值z zz(通常为z = 3 z=3z=3)通常用作阈值。因为我们的数据集很小,z zz的大值可能导致没有数据被标记为异常。另外,我们在选择z$时比较保守,因为我们想帮助尽可能多的学校。

# 常规z-score
import scipy.stats as ss
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import random
#用于展示检测结果
def plot_anomaly(score_data, threshold):# Mask to plot values above and below threshold in different colorsscore_data = score_data.copy().sort_values(ascending=False).valuesranks = np.linspace(1, len(score_data), len(score_data))mask_outlier = (score_data < threshold)plt.figure(dpi=150)plt.plot(ranks[~mask_outlier], score_data[~mask_outlier],'o', color='b',label='OK schools')plt.plot(ranks[mask_outlier], score_data[mask_outlier],'o', color='r', label='anomalies')plt.axhline(threshold,color='r',label='threshold', alpha=0.5)plt.legend(loc = 'lower left')plt.title('Z-score vs. school district', fontweight='bold')plt.xlabel('Ranked School district')plt.ylabel('Z-score')plt.show()
data = pd.read_csv('SAT_CT_District_Participation_2012.csv')
zscore_rate = ss.zscore(ct_test['Participation Rate'], ddof=0)#ddof是标准差计算中的自由度修正,默认为0,即标准差分母是n,而不是n-1
data=data.assign(zscore=zscore_rate)
plot_anomaly(data['zscore'], -2)
anomalies = data[(data['zscore'] < -2)]
anomalies


--------------------------------------------------------

# 修正z-score
def plot_anomaly(score_data, threshold):# Mask to plot values above and below threshold in different colorsscore_data = score_data.copy().sort_values(ascending=False).valuesranks = np.linspace(1, len(score_data), len(score_data))mask_outlier = (score_data < threshold)plt.figure(dpi=150)plt.plot(ranks[~mask_outlier], score_data[~mask_outlier],'o', color='b',label='OK schools')plt.plot(ranks[mask_outlier], score_data[mask_outlier],'o', color='r', label='anomalies')plt.axhline(threshold,color='r',label='threshold', alpha=0.5)plt.legend(loc = 'lower left')plt.title('Z-score vs. school district', fontweight='bold')plt.xlabel('Ranked School district')plt.ylabel('Z-score')plt.show()
#修正z-score方法
def modify_zscore(data,k=1.4826):data_median=np.median(data)dev_from_med=np.array(data)-data_medianMAD=np.median(np.abs(dev_from_med))mod_zscore=dev_from_med/(k*MAD)#使用的是标准差的一致性估计return mod_zscore,MADdata = pd.read_csv('SAT_CT_District_Participation_2012.csv')
mod_zscore,MAD=modified_zscore(data['Participation Rate'])
data = data.assign(mod_zscore=mod_zscore)
plot_anomaly(data['mod_zscore'],-2)
anomalies = data[(data['zscore'] < -2)]
anomalies


效果比较:

我们可以发现,z-score方法识别出的异常点一共4项,而修正后的z-score方法识别结果除此之外,还识别出第55项0.47为低参与率。另外,通过计算,可以发现k ∗ M A D k*MADk∗MAD比样本标准差更小,也体现MAD统计量受异常点影响较小,具有更好的鲁棒性。

如何看待 z-score 和 修正z-score(中位数标准化)相关推荐

  1. 计算机控制z反变换公式,第三章 计算机控制系统的数学描述(修正Z变换).ppt

    第三章 计算机控制系统的数学描述(修正Z变换) * §3.4 修改Z变换 1.具有多采样频率系统 在某些控制系统中,存在着不同采样频率的采样开关,如图3.10所示. 图3.10 具有不同采样频率系统结 ...

  2. 怎么设置html z值,Z-score(Z值)的意义--转载

    http://blog.sina.com.cn/s/blog_72208a6a0101cdt1.html http://www.docin.com/p-350677620.html http://we ...

  3. ftp上传老是失败 [L] TYPE A [L] 200 Type set to A. [L] MODE Z [L] 200 MODE Z ok. [L] PASV [L] 550 Pa

    [L] TYPE A[L] 200 Type set to A.[L] MODE Z[L] 200 MODE Z ok.[L] PASV[L] 550 Passive mode not allowed ...

  4. Z源逆变器,Z源逆变器光伏并网控制系统,光伏并网系统加蓄电池,风光储发电互补系统

    Z源逆变器,Z源逆变器光伏并网控制系统,光伏并网系统加蓄电池,风光储发电互补系统,Matlab电力电子仿真!变压器保护仿真,差动保护,励磁涌流,外部故障,内部故障等变压器故障仿真,光伏直流系统,光伏交 ...

  5. c语言中宏定义的字符替换#define M(x,y,z) x*y+z

    C语言中宏定义的字符替换问题 例子: 在c语言中定义如下宏 #define M(x,y,z) x*y+z 给定如下程序 #include<stdio.h> #include<stdl ...

  6. 要求计算 X+Y=Z,将结果 Z 输出到屏幕,其中 X=001565A0H, Y=0021B79EH

    二进制双精度加法运算 本实验要求计算 X+Y=Z,将结果 Z 输出到屏幕,其中 X=001565A0H, Y=0021B79EH. 实验利用累加器 AX,先求低十六位和,并存入低址存储单元,后求高 1 ...

  7. z世代中的z是什么意思_如果您认为z世代可以免于假新闻,那您就错了

    z世代中的z是什么意思 A study by College Reaction carried out for Axios concludes that members of Generation Z ...

  8. matlab z x y,matlab z=x*y

    根据x+x+x+y+y=54,x+x+y+y+y=56,求出x.y的值 x+x+x+y+y=54,x+x+y+y+y=56得出3X+2Y=54,2X+3Y=56扩大后得出6X+4Y=108,6X+9Y ...

  9. 统计学(一): Z 分数 正态分布 (附 Python 实现代码) --Z 检验先修; Z 分数与正态分布两者关系; Z 分数与百分位数的异同;面试要点(以心理学实验为舟)

    背景介绍   笔者的第一本心理学启蒙教材<西奥蒂尼社会心理学>:揭开了自我.环境.群体之间看不见的影响力." 行为背后的目的到底是什么?" " 目的背后的人和 ...

最新文章

  1. vue el-upload上传组件限制文件类型:accept属性
  2. 携手伙伴谋增长 同心协力齐飞飏
  3. Arduino笔记-WeMos D1通过HTTP亮熄灯
  4. QQ聊天记录不会被盗取的绝招
  5. python数据挖掘学习笔记】十.Pandas、Matplotlib、PCA绘图实用代码补充
  6. 12.3日个人工作总结
  7. leetcode 456. 132 Pattern 132模式 题解(栈)
  8. 面向对象15:单例设计模式、main方法的使用
  9. 深度学习在摄影技术中的应用与发展
  10. java在regedit找不到_Windows找不到文件regedit打不开注册表的解决办法
  11. C/C++在线餐馆预订管理系统
  12. Security2:角色和权限
  13. 联邦学习隐私保护相关知识总结
  14. 爬虫-模拟点击,实现加载页面全部内容
  15. 怎么让input输入框最右侧一直默认有百分号
  16. 陈老师排课12A(6天上4下4)小学专用版使用方法
  17. 明解C语言入门篇_第4章_程序的循环控制
  18. 设计模式 #1(7大设计原则)
  19. matlab利用magnify作图
  20. 博客系统的前端页面设计

热门文章

  1. matlab newff函数弃用了,matlab的newff函数
  2. 360v6 增加散热
  3. Docker配置host地址
  4. 现在叠一条毛巾要15分钟,但未来机器人必然包家务
  5. Linux服务器联网
  6. 全面深入理解卷积神经网络与LeNet 5 的结构
  7. 三元组的基本操作------JAVA
  8. checkbox数组转json存数据库
  9. 属于哪个单元_标配三单元8英寸低音炮!STARKE Echo5.1时尚卫星家庭影院试用
  10. 什么是码表,什么是维度表?