0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Python在数据流中查找异常值的方法

汽车玩家 来源:未知 作者:闻数起舞 2020-05-03 18:17 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一种简单的方法,可通过Python实现在数据流中查找异常值

在上一篇文章中,我解释了流算法的概念,并给出了许多如何应用流算法的示例。 其中之一是在不保存数据流元素的情况下计算数据流的滚动平均值。 现在,我想扩展这个示例,并在异常值检测的背景下向您展示另一种流算法的用例。

当我们监视机器的功耗以检测任何异常行为时,可能会出现类似的问题。 如果我们发现异常值有所增加(异常观察),则可能表明这台机器的默认值,可能值得检查。

定义和示例

离群值可以通过多种方式定义。 在本文中,我们将使用以下定义:

如果数字数据流中的元素与到目前为止所见元素的平均值不在3个标准偏差之内,则该元素被视为离群值。

这需要一个小例子。 假设我们按顺序获得数据3、2、4、3、5、3、2、10、2、3、1。 让我们进一步假设,我们从零的均值和方差(以及因此的标准差)开始,即,如果不等于零,则始终将第一个元素视为离群值。

因此,将3视为离群值,因为3> 0 3 * 0。 现在,我们根据到目前为止看到的元素(仅是数字3)更新均值和方差。因此,新均值是3,方差是0。

然后我们看到2。我们有2> 3 3 * 0,所以2也被认为是离群值。 这是有道理的,因为到目前为止我们只看到了3,所以其他任何数字都不适合该模式。 平均值更新为(3 2)/2=2.5,方差更新为((3-2.5)²(2-2.5)²)/2=0.25,这意味着标准偏差为0.5。

现在我们看到4。由于2.5–3 *0.5≤4≤2.53 * 0.5,因此该数字不是异常值(即正常值)。 平均值更新为(3 2 4)/ 3 = 3,方差更新为((3–3)²(2–3)²(4–3)²)/ 3 = 2/3,因此标准偏差为 约0.81。

以下数字3、5、3、2被认为是正常的。 凭直觉,我们将下面的数字10视为离群值。 让我们看看该算法的作用。 此时的平均值约为3.1,标准偏差约为1。由于10> 3.1 3 * 1,因此我们希望将10视为离群值。

如果继续最后三个元素,您将看到它们都是正常的。

问题:要计算平均值和标准偏差,我们必须记住到目前为止看到的所有元素。 如果我们有一个每天输出成千上万个元素的系统,那么这不是一个选择。

救援的流式算法

解决此问题的一种方法是使用流算法,该算法在从数据流中每个被扫描元素之后更新其内部状态。 内部状态由到目前为止在任何点看到的所有元素的均值和方差组成,从看到任何元素之前的均值和方差为零开始。 确切地说,在看到数据流的第n个元素之后,令mₙ为平均值,vₙ为方差,并附加定义m₀=v₀= 0。

计算均值

在我有关流算法的文章中,我们看到了如何仅使用旧的均值,正在扫描的最新元素以及到目前为止看到的元素数量来更新均值。 这意味着我们只需要随时使用这种方法存储两个数字,而不是像幼稚的方法那样存储n。 让我再次显示它,将数据流的第i个传入元素表示为aᵢ:

基于Python在数据流中查找异常值的方法

这个公式不难开发,对吧? 有了它,我们就有了我们期望的元素大小的基线。 现在,我们只需要可以用均值围绕的标准偏差即可将输入的示例分类为离群值和正常数据点。 我们通过计算方差来做到这一点,然后取其平方根即可达到标准偏差。

计算方差

在这种情况下,我们也可以轻松找到递归公式。 首先,看到n个元素后的方差为

基于Python在数据流中查找异常值的方法

让我们尝试再次根据n,vₙ和最新元素来写。 由于方差取决于均值,因此我们也要包含mₙ。 在开始之前,让我们重新安排这个公式,以使事情变得更容易:

基于Python在数据流中查找异常值的方法

现在,目标是使vₙ进入那里。 一种进行方式是从以下简单的重新排列开始,以隔离平方和直到索引n,它也以vₙ中的一项出现:

基于Python在数据流中查找异常值的方法

这相当于

基于Python在数据流中查找异常值的方法

反过来导致

基于Python在数据流中查找异常值的方法

现在,我们有了公式,让我们看看它在Python中是如何工作的!

用Python实现

我们可以通过以下方式实现上述解释:

class StreamingMeanAndVariance:

def __init__(self):

self.mean = 0

self.variance = 0

self.n_elements = 0

def update(self, element):

self.variance = ((self.variance + self.mean ** 2) * self.n_elements + element ** 2) / (self.n_elements + 1)

self.mean = ((self.mean * self.n_elements) + element) / (self.n_elements + 1)

self.variance = self.variance - self.mean ** 2

self.n_elements += 1

关于此的注释:update方法的第一行计算方差,但不减去当前均方根。 在第二行中,计算当前平均值。 在第三行中,然后将其从方差中减去,因为在第一行中仍然缺少此值。

要使用它,我们会

import numpy as np

m = StreamingMeanAndVariance()

n = 10000

for i, s in enumerate(np.random.randn(n)):

if not - 3 <= (s - m.mean) / np.sqrt(m.variance) <= 3:

print(i, s)

m.update(s)

这将扫描数据流,该数据流在此示例中由10000个正态分布的数字组成(我们将其表示为N(0,1)),并在出现异常时打印异常值。

如果将法线的间隔和平均值(以黄色表示)作图,则会得到以下图片:

以蓝色显示,您可以看到测量值。绿色区域包含法线点,其外部的测量值(红色表示)被认为是异常值。以黄色显示您的期望值(平均值)。

讨论区

该算法可以达到我们的期望! 但是,到目前为止,我们还没有看到它如何处理分配的变化,而是始终只有标准的正态分布数。

让我们测试执行以下操作时算法的行为:

结果看起来像这样:

Everything adapts slowly to the new data.

优点

这看起来很有希望! 一切都会自动适应新数据。 当数据的平均值从0变为2时,我们可以看到很多离群值,这是有道理的。 新平均值2越多,观测到的异常值就越少,因为2左右是新的常态。

当将平均值从2更改为-2时,我们可以看到更多的离群值,因为这种变化要严重得多。 到目前为止,一切都很好。

缺点

如果查看图的右半部分,可以看到对新数据的适应非常慢。 如您所见,平均值和标准偏差将在一段时间后再次达到正确的水平,因为黄线(均值)下降并且绿色区域再次变窄。 但是直到稳定为止,没有发现异常值。

为了解决这个问题,我们只能使用最后k个样本来计算均值和标准差,因为


这会破坏第一次测量的影响。 如果将k设置为无穷大,则可以从之前获得算法。

我们将k设置得越低,算法就越快地适应新数据。 但是,将k设置得太小可能会导致丢弃异常值,因为该算法认为新数据就是这样。 在设置k = 1的极端情况下,没有元素被视为离群值,因为仅考虑了最新元素。

根据用例,可能几百或几千个就可以了。

结论

在本文中,我们已经看到了如何为数据流建立一个非常简单的异常检测机制。 我们的算法不需要存储所有测量值,因此非常容易应用,也可以在极其受限制的硬件上使用,并且只需固定存储即可。 该算法甚至可以适应数据更改,因此无需手动更新。

唯一需要调整的是自适应率,我们在本文中没有介绍,但是很容易做到。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据流
    +关注

    关注

    0

    文章

    129

    浏览量

    15666
  • python
    +关注

    关注

    57

    文章

    4858

    浏览量

    89592
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    欧姆龙推出全新数据流边缘控制器DX1

    2025年11月,欧姆龙自动化(中国)有限公司发布新品【数据流控制器DX1】。DX1作为一款数据流边缘控制器,面对生产现场数据采集与活用困难、数据需求因人/设备而异、需关停设备才能引入
    的头像 发表于 11-26 18:02 1006次阅读
    欧姆龙推出全新<b class='flag-5'>数据流</b>边缘控制器DX1

    在以下嵌入式软件设计模型,属于数据流模型的是,哪里有设计模型的介绍?

    在以下嵌入式软件设计模型,属于数据流模型的是()。A. CCSB. CSPC. FSMD. Petri Net
    发表于 11-24 15:55

    可信数据空间解锁数据流新范式

    在数字经济时代,数据已成为关键生产要素和战略性资源。而可信数据空间作为实现数据要素安全流通和价值释放的新型基础设施,正受到国家政策的高度重视和产业界的广泛关注。什么是可信
    的头像 发表于 08-12 09:37 1652次阅读
    可信<b class='flag-5'>数据</b>空间解锁<b class='flag-5'>数据流</b>新范式

    CNC数据台有什么功能

    状态、报警信息等数据,实现实时数据流处理和批量数据处理。 数据清洗与转换:通过数据去重、异常值
    的头像 发表于 07-23 15:16 340次阅读

    FX3板是否兼容2k和4k分辨率的视频数据流

    ,实现了 1920 * 1080 @ 60 fps 的设计,但现在我想检查与上述更高分辨率的兼容性。 关于这一点,我有几个问题 1.FX3 板是否兼容 2k 和 4k 分辨率的视频数据流? 2.视频数据流
    发表于 05-23 06:35

    使用FX3测试程序数据流时,遇到了每8个字节重复的场景,是什么原因导致的?

    我在使用 FX3 测试程序数据流时,遇到了每 8 个字节重复的场景。
    发表于 05-21 06:59

    FX3图传过程异常停止的原因?

    Current_Thread_DMA_Ready,FLAGB表示Current_Thread_DMA_WaterMark。 2. SDK 项目 SDK工程描述如下:Thread0用于传输图像数据流,Thread2用于传输上位机下发的命令
    发表于 05-19 08:00

    ad77681数据读取异常的原因?

    数据发送到arm,两个spi均使用了DMA。 在采样率为128KHz时,adc的数据异常,会有接近于参考电压的突变值,并且会有其他异常值,正常的数据
    发表于 04-16 07:26

    利用SSIS源、查找及目标组件集成PostgreSQL数据至ETL流程

    的 Devart SSIS 数据流组件,您可以: 快速构建基于 SSIS 的 PostgreSQL 集成解决方案 通过 SSIS 数据流任务自动
    的头像 发表于 02-07 09:24 1692次阅读
    利用SSIS源、<b class='flag-5'>查找</b>及目标组件集成PostgreSQL<b class='flag-5'>数据</b>至ETL流程

    使用ADS1281做调制器,两个调制器都是输出1位的数据流,那合并之后数据流是几位的呢?

    ]). 现在有以下两个问题: 1.两个调制器都是输出1位的数据流,那合并之后数据流是几位的呢? 2.如果取所有可能的情况,Y[n]的输出范围就是-24~+25,这个又要怎么理解呢?
    发表于 02-05 09:10

    适用于Oracle的SSIS数据流组件:提供快速导入及导出功能

    使用SSIS 数据流组件,通过与关键数据库和云服务的 Oracle 数据集成来改进您的 ETL 流程,这些组件提供快捷和可靠的数据导入和导出功能。   Oracle SSIS
    的头像 发表于 01-15 10:51 1450次阅读
    适用于Oracle的SSIS<b class='flag-5'>数据流</b>组件:提供快速导入及导出功能

    Devart SSIS数据流组件

    Devart SSIS 数据流组件是功能强大的工具,旨在简化 SQL Server Integration Services (SSIS) 包内的 ETL 流程,使用户无需编写复杂的代码即可
    的头像 发表于 01-05 11:08 1913次阅读
    Devart SSIS<b class='flag-5'>数据流</b>组件

    使用ADS1018的过程,出现了读取数据在0和正常值间隔跳动的现象,为什么?

    使用ADS1018的过程,出现了读取数据在0和正常值间隔跳动的现象,大部分情况同这样跳动,少部分情况是连续长时间读取值0,读取的是ADS1018自带的温度数据,这种现象怎么回事,怎
    发表于 12-23 08:20

    cmp在数据处理的应用 如何优化cmp性能

    CMP在数据处理的应用 CMP(并行处理)技术在数据处理领域扮演着越来越重要的角色。随着数据量的爆炸性增长,传统的串行处理方法已经无法满足
    的头像 发表于 12-17 09:27 1762次阅读

    ADS1299+RK3399在数据采样的过程,有数据丢失的情况怎么解决?

    我们在数据采样的过程,发现有数据丢失的情况,通过逻辑分析仪发现,出现数据丢失时,时序存在问题。具体见下图: 从图中可以看出,DRDY出现了异常
    发表于 12-16 06:58