基于统计和数值分析方法进行动态去除异常值
*
- 前言
- 一:拟合方法原理介绍
- 二:建立异常值检测步骤
- 三:代码实现
- 四:总结
前言
对于异常值的检验方法很多,针对不同数据集有不同的方法,比如3-sigm原则、聚类方法、箱线图观察法、自编码器观察法等等。本文将介绍一种对于大数据集的有效便捷的异常值检测法,即基于数值分析中拟合技术和统计方法来建立动态规则处理数据中的异常值。
岁月如云,匪我思存,写作不易,望路过的朋友们点赞收藏加关注哈,在此表示感谢!
; 一:拟合方法原理介绍
- *拟合方法的由来
我们知道,差分曲线必须经过所有给定的数据,这使得我们不可能在插补过程中通过添加节点约束来弱化由“不确定性”引起的“差”。那么解决的办法就是允许节点上的误差,并将满足节点约束改为最小化节点内的整体误差,从而得到解决实际问题中常用的拟合计算。
[En]
We know that the difference curve must pass through all the data given, which makes it impossible for us to weaken the "difference" caused by "uncertainty" by adding node constraints during interpolation. Then the solution is to allow errors on the nodes, and change "meet the node constraints" to "minimize the overall errors in the nodes", resulting in the fitting calculation which is commonly used in solving practical problems.
- *最小二乘拟合方法
最小二乘拟合就是在一类曲线 Φ \Phi Φ 中求出一曲线 φ ( x ) \varphi(x)φ(x ) 使它与被拟合曲线 f ( x ) f(x)f (x ) 在
节点 x 1 , . . . x n x_1,...x_n x 1 ,...x n 的误差平方和∑ i = 1 n [ f ( x i ) − φ ( x i ) ] 2 \sum_{i=1}^{n}{\left[ f(x_i)-\varphi(x_i) \right]^2}∑i =1 n [f (x i )−φ(x i )]2 最小。
- *举例说明
假如我们从简单的线性拟合出发,即设拟合函数为 φ ( x ) = a + b x \varphi(x)=a+bx φ(x )=a +b x ,已知
x 1 , . . . x n x_1,...x_n x 1 ,...x n 及 y i = f ( x i ) ( i = 1 , 2 , . . . , n ) y_i=f(x_i)(i=1,2,...,n)y i =f (x i )(i =1 ,2 ,...,n ) ,那么由最小二乘法求 f ( x ) f(x)f (x ) 的拟合函数由如下步骤:
1:记误差平方和为 e ( a , b ) = ∑ i = 1 n [ y i − φ ( x i ) ] 2 = ∑ i = 1 n [ y i − ( a + b x i ) ] 2 e(a,b)=\sum_{i=1}^{n}{\left[ y_i-\varphi(x_i) \right]^2}=\sum_{i=1}^{n}{\left[ y_i-\left( a+bx_i \right) \right]^2}e (a ,b )=∑i =1 n [y i −φ(x i )]2 =∑i =1 n [y i −(a +b x i )]2
2:设 ∂ e ∂ a = ∂ e ∂ b = 0 \frac{\partial e}{\partial a}=\frac{\partial e}{\partial b}=0 ∂a ∂e =∂b ∂e =0 得
n a + ( ∑ i = 1 n x b ) b = ∑ i = 1 n y i na+\left( \sum_{i=1}^{n}{x_b} \right)b=\sum_{i=1}^{n}{y_i}n a +(∑i =1 n x b )b =∑i =1 n y i
和 ( ∑ i = 1 n x i ) a + ( ∑ i = 1 n x i 2 ) b = ∑ i = 1 n x i y i \left( \sum_{i=1}^{n}{x_i} \right)a+\left( \sum_{i=1}^{n}{x_i^2} \right)b=\sum_{i=1}^{n}{x_iy_i}(∑i =1 n x i )a +(∑i =1 n x i 2 )b =∑i =1 n x i y i
当 n > 1 n>1 n >1 时,上式的系数行列式为:
D = n ∑ i = 1 n x i 2 − ( ∑ i = 1 n x i ) 2 = n ∑ i = 1 n ( x i − x ˉ ) 2 ≠ 0 D =n\sum_{i=1}^{n}{x_i^2}-\left( \sum_{i=1}^{n}{x_i}\right)^2=n\sum_{i=1}^{n}{\left( x_i-\bar{x} \right)^2}\ne0 D =n ∑i =1 n x i 2 −(∑i =1 n x i )2 =n ∑i =1 n (x i −x ˉ)2 =0 ,
其中 x ˉ = 1 n ∑ i = 1 n x i \bar{x}=\frac{1}{n}\sum_{i=1}^{n}{x_i}x ˉ=n 1 ∑i =1 n x i ,从而系数 a , b a,b a ,b 有唯一解!
- *多项式拟合方法简介
多项式拟合函数是一种基本而常见的拟合函数。最小二乘法的常用理论是根据内积运算得到的“法方程”确定拟合函数系数。然后直接给出多项式函数的正规方程。
[En]
The polynomial fitting function is a kind of basic and common fitting function. The common theory is to determine the fitting function coefficient based on the "normal equations" obtained from the inner product operation for the least square method. Then the normal equations of the polynomial function are given directly.
对于多项式幂函数, φ 0 ( x ) = 1 , φ 1 ( x ) = x , . . , φ m ( x ) = x m \varphi_0(x)=1,\varphi_1(x)=x,..,\varphi_m(x)=x^m φ0 (x )=1 ,φ1 (x )=x ,..,φm (x )=x m 。由内积运算
( φ j , φ k ) = ∑ i = 1 n x i j + k , ( f , φ k ) = ∑ i = 1 n x i k y i \left( \varphi_j,\varphi_k \right)=\sum_{i=1}^{n}{x_i^{j+k}},\left( f,\varphi_k \right)=\sum_{i=1}^{n}{x_i^ky_i}(φj ,φk )=∑i =1 n x i j +k ,(f ,φk )=∑i =1 n x i k y i ,这样得到法方程如下:
从上述矩阵表达形式我们知道,系数向量 [ a 0 , a 1 , . . . a m ] \left[ a_0,a_1,...a_m \right][a 0 ,a 1 ,...a m ] 就是求得的最优系数向量。 当m m m 比较大也就是多项式拟合次数过于高时,该线性方程组往往是病态的,幂次运算过大而导致误差过大,所以一般会采用斯密特正交多项式来进行拟合修正,这里将不再过多展开,有兴趣的可以查看相关数值分析资料。
二:建立异常值检测步骤
"拟合"我们在上面也提到过非常适用于大的数据集(插值一般适用于小的数据集),一般情况下,我们会选择3次左右的多项式来进行拟合,达到一种非线性效果,所以当应用于实际数据时我们由如下步骤:
- 对数据进行多项式拟合,选择合理的多项式阶数,
- 对拟合出来的多项式曲线进行上下界的选取,一般会选择拟合出的数据集的标准差倍数,也可以是此数据集的均值倍数等等,
- 把在上下界之外的数据集作为异常值处理。
三:代码实现
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
choosedata = pd.read_csv('建模数据.csv', index_col=0)
def check_outlier(data,multi):
colls = list(data.columns)
for i in colls:
plt.figure(figsize=(15,8))
value = data[i]
x = [j for j in range(len(value))]
coeffs = np.polyfit(x, value, 3)
p = np.poly1d(coeffs)
sigm = p(x).std()
sigm_up = p(x) + multi * sigm
sigm_down = p(x) - multi * sigm
fil_S = value[(value >= sigm_down) & (value sigm_up)]
print('\033[1;32m原数据长度:%s,经过异常排除后还剩:%s\033[0m'%(len(value),len(fil_S)))
plt.scatter(x,value,label='原始数值')
plt.plot(p(x),'r',label='拟合曲线')
plt.plot(sigm_up,'g',label='拟合上限曲线')
plt.plot(sigm_down,'b',label='拟合下限曲线')
plt.legend(fontsize=15)
plt.tick_params(labelsize=15)
plt.show()
check_outlier(choosedata,6)
图1
图2
图3
上图中的图1,图2,图3就是我们大致处理异常值的过程。
四:总结
异常值处理方法很多,这种基于统计+数值分析的方法对处理数据量大的情况是比较实用的,能充分展现其高效性。当然,在处理实际问题中,以上逻辑涉及的参数是可以相应变化的,尤其是拟合的上下界范围。
Original: https://blog.csdn.net/weixin_43577256/article/details/124361033
Author: 月~时光之笛
Title: 基于统计和数值分析方法进行动态去除异常值

Win10+RTX3060+Python3.8+Pytorch1.8/Tensorflow2.5+Anaconda+Pycharm

信息隐藏与数字水印实验2-WAV 音频的 LSB 信息隐藏

3050ti安装TensorFlow与Pytorch

手把手教你语音识别

Network Service in Chrome

卷积层(FCN)替换全连接层(FC)的意义

【TF2】Eager Execution机制

将yolov5的detect.py改写成可以供其他程序调用的方式,并实现低时延(<0.5s)直播推理

基于个性化的电影推荐系统全流程设计

AI+语音方面总结(一)

炼丹日记之安装tensorflow(1)

JetsonNano国产套件成功部署YoloV5手把手图解教程

通俗解读NLP中几种常见的注意力机制

深度学习与计算机视觉教程(14) | 图像分割 (FCN,SegNet,U-Net,PSPNet,DeepLab,RefineNet)(CV通关指南·完结)
