异常值处理
来源:互联网 发布:java调用webkit内核 编辑:程序博客网 时间:2024/06/05 21:02
1)基于马氏距离的异常检验
基于马氏距离的异常检验是针对异常样本点的检验,与下面基于箱线图的异常检验不同,箱线图的异常检验是针对单一属性的异常检验。
欧式距离是我们常用的距离度量工具,但是它将目标的不同属性(即各指标或各变量)之间的差别等同看待,这一点有时不能满足实际要求,而马氏距离考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的)并且是尺度无关的(scale-invariant),即独立于测量尺度。对于一个均值为μ,协方差矩阵为Σ的多变量向量,其马氏距离为sqrt( (x-μ)'Σ^(-1)(x-μ) )。当协方差是单位矩阵时,马氏距离与欧式距离等价。
import pandas as pdimport numpy as npfrom numpy import float64from sklearn import preprocessingfrom matplotlib import pyplot as pltfrom pandas import Seriesfrom scipy.spatial import distancefrom mpl_toolkits.mplot3d import Axes3DHeight_cm = np.array([164, 167, 168, 169, 169, 170, 170, 170, 171, 172, 172, 173, 173, 175, 176, 178], dtype=float64)Weight_kg = np.array([54, 57, 58, 60, 61, 60, 61, 62, 62, 64, 62, 62, 64, 56, 66, 70], dtype=float64)hw = {'Height_cm': Height_cm, 'Weight_kg': Weight_kg}hw = pd.DataFrame(hw)print(hw)is_height_outlier = abs(preprocessing.scale(hw['Height_cm'])) > 2is_weight_outlier = abs(preprocessing.scale(hw['Weight_kg'])) > 2is_outlier = is_height_outlier | is_weight_outliercolor = ['g', 'r']pch = [1 if is_outlier[i] == True else 0 for i in range(len(is_outlier))]cValue = [color[is_outlier[i]] for i in range(len(is_outlier))]# print is_height_outlier# print cValuefig = plt.figure()plt.title('Scatter Plot')plt.xlabel('Height_cm')plt.ylabel('Weight_kg')plt.scatter(hw['Height_cm'], hw['Weight_kg'], s=40, c=cValue)plt.show()n_outliers = 2m_dist_order = Series([float(distance.mahalanobis(hw.iloc[i], hw.mean(), np.mat(hw.cov().as_matrix()).I) ** 2) for i in range(len(hw))]).sort_values(ascending=False).index.tolist()is_outlier = [False, ] * 16for i in range(n_outliers): is_outlier[m_dist_order[i]] = Truecolor = ['g', 'r']pch = [1 if is_outlier[i] == True else 0 for i in range(len(is_outlier))]cValue = [color[is_outlier[i]] for i in range(len(is_outlier))]fig = plt.figure()plt.title('Scatter Plot')plt.xlabel('Height_cm')plt.ylabel('Weight_kg')plt.scatter(hw['Height_cm'], hw['Weight_kg'], s=40, c=cValue)plt.show()
2)基于标准偏差的异常值检验
基于标准偏差的异常值检验也称3
P(|x-u|>3sigma)<=0.003 正态分布情况下,如果|x-u|>3sigma说明x出现的概率很小,所以可以看成是异常值。
3)基于箱线图的异常值检验
箱线图通过计算中位数(50百分位数)、上四分为数(75百分位数)、上四分为数(25百分位数)、上边缘(100百分位数)、下边缘(0百分位数)如下:
箱型图识别异常值标准: 异常值被定义为大于
同时也可以自己定义其他异常值检验,如95百分位数,将上下各2.5%的数看做异常
下面是箱线图检测异常值的python实例
数据集:http://download.csdn.net/detail/u010111016/9524285
源码:http://blog.csdn.net/shuaishuai3409/article/details/51428106
import pandas as pdimport matplotlib.pyplot as plt# 设定播放数据路径,该路径为代码所在路径的上一个目录data中.number = 'D:/data/ather/all_musicers.xlsx'data = pd.read_excel(number)data1 = data.iloc[:, 0:10] # 10位歌手的183天音乐播放量plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号plt.figure(1, figsize=(13, 26)) # 可设定图像大小# plt.figure() # 建立图像# 画箱线图,直接使用DataFrame的方法.代码到这为止,就已经可以显示带有异常值的箱型图了,# 但为了标注出异常值的数值,还需要以下代码进行标注.p = data1.boxplot(return_type='dict')# for i in range(0,4):# 'flies'即为异常值的标签.[0]是用来标注第1位歌手的异常值数值,同理[i]标注第i+1位歌手的异常值.for j in range(0, 4): x = p['fliers'][j].get_xdata() y = p['fliers'][j].get_ydata() y.sort() # 从小到大排序 for i in range(len(x)): if i > 0: plt.annotate(y[i], xy=(x[i], y[i]), xytext=(x[i]+0.05 - 0.8/(y[i]-y[i-1]), y[i])) else: plt.annotate(y[i], xy=(x[i], y[i]), xytext=(x[i]+0.08, y[i]))# 展示箱线图plt.show()
- 异常值处理
- 异常值处理
- hive之异常值处理
- 异常处理+异常+处理异常+自定义异常
- 异常处理
- 异常处理
- 异常处理
- 异常处理
- 异常处理
- 异常处理
- 异常处理
- 异常处理
- 异常处理
- 异常处理
- 异常处理
- 异常处理
- 异常处理
- 异常处理
- 【Android】图片压缩
- 缓存之EHCache(一)
- PAT 1002. 写出这个数
- How not to hate Spring in 2017
- Andorid-的面试题
- 异常值处理
- 为什么要使用SLF4J而不是Log4J
- svn常用命令
- python 字典部分常用方法总结
- MongoDB
- Linux下的一些常用操作总结
- css笔记(二)选择器
- Redis 集群方案
- ~dp0