基于统计和数值分析方法进行动态去除异常值

人工智能104

基于统计和数值分析方法进行动态去除异常值

*
- 前言
- 一:拟合方法原理介绍
- 二:建立异常值检测步骤
- 三:代码实现
- 四:总结

前言

对于异常值的检验方法很多,针对不同数据集有不同的方法,比如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次左右的多项式来进行拟合,达到一种非线性效果,所以当应用于实际数据时我们由如下步骤:

  1. 对数据进行多项式拟合,选择合理的多项式阶数,
  2. 对拟合出来的多项式曲线进行上下界的选取,一般会选择拟合出的数据集的标准差倍数,也可以是此数据集的均值倍数等等,
  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: 基于统计和数值分析方法进行动态去除异常值

相关文章
手把手教你语音识别 人工智能

手把手教你语音识别

朋友们,语音识别这块最近研究了一段时间,有所收获,比较重要的一点是,对于模型,现在大家都知道大概,很多非常小的细节可能很多人注意的少,从这篇文章开始,我打算讲一讲模型的细节,从数据处理到怼入model...
AI+语音方面总结(一) 人工智能

AI+语音方面总结(一)

开始总结语音相关知识点 1、语音分离和增强的本质是什么? a) 一个是分类,一个是回归。 b) 分类和回归的区别在于输出变量的类型。定量输出称为回归,或者说连续变量预测;定性输出称为分类,或者说是离散...
炼丹日记之安装tensorflow(1) 人工智能

炼丹日记之安装tensorflow(1)

博主配置是乞丐版MB Air,没有GPU,并且本身深度学习的基础就很薄弱,所以选择了简单易上手的Keras架构先跑个能用的414。另外自己折腾了重装系统之后不喜欢anaconda那些花里胡哨的,所以就...
通俗解读NLP中几种常见的注意力机制 人工智能

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

1 前言 注意力机制在NLP领域中有广泛的应用,诸如机器翻译、智能对话、篇章问答等。在模型设计中使用注意力机制,可以显著提升模型的性能。然而,对于初识注意力机制的朋友来说,可能会有这样的疑问:自然语言...