Andrew Ng 机器学习笔记 14 :异常检测

异常检测问题

异常检测问题的定义如下:

假设我们有m个正常的样本数据 x ( 1 ) x ( 2 ) x ( m ) ,我们需要一个算法来告诉我们一个新的样本数据 x t e s t 是否异常。

我们要采取的方法是:给定无标签的训练集,对数据集 x 建立一个概率分布模型 p ( x ) 。当我们建立了 x 的概率模型之后,我们就会说,对于新的样本 x t e s t ,如果概率 p 低于阈值 ε

p ( x t e s t ) < ε

那么就将其标记为异常,反之,我们就认为它是正常的。

高斯分布

假设x是一个实数随机变量(即:x∈R),如果x的概率分布服从高斯分布:其中均值为μ,方差为 σ 2 ,那么将它记作:

x N ( μ , σ 2 )

这里的∼符号读作:”服从…分布”。大写字母N表示Normal (正态),有两个参数,其中μ表示均值, σ 2 表示方差。

如果我们将高斯分布的概率密度函数绘制出来,它看起来将是这样一个钟形的曲线:

这个钟形曲线有两个参数,分别是μ和σ。其中μ控制这个钟形曲线的中心位置,σ控制这个钟形曲线的宽度。

从图中可以看出来,x取中心区域的值的概率相当大,因为高斯分布的概率密度在这里很大;而x取远处和更远处数值的概率将逐渐降低,直至消失。

高斯分布中,μ和σ的关系

这里写图片描述

  • 值得提醒的是,在高斯分布的图像中,不管曲线的形状如何,曲线围城的总面积都是1。
  • 所以如果σ很大,就意味着数据的离散化程度越大,中间区域就会变宽,但由于总概率为1,所以高度会降低。
  • 反之如果σ很小,就意味着数据的离散化程度越小,中间区域就会变窄,但由于总概率为1,所以高度会升高。

异常检测的具体算法

假如说我们有一个无标签的训练集,其中共有m个训练样本,并且这里的训练集里的每一个样本都是n维的特征,因此你的训练集应该是m个n维的特征构成的样本矩阵:

x ( 1 ) , , x ( m ) x R n

对于我们的异常检测算法,我们要从数据中建立一个p(x)概率模型。由于x是一个向量,因此:

p ( x ) = p ( x 1 ) p ( x 2 ) p ( x 3 ) p ( x n )

假定特征 x ( 1 ) x ( m ) 都服从高斯正态分布:

p ( x ) = p ( x 1 ; μ 1 , σ 1 2 ) p ( x 2 ; μ 2 , σ 2 2 ) p ( x 3 ; μ 3 , σ 3 2 ) p ( x n ; μ n , σ n 2 ) = Π j = 1 n p ( x j ; μ j , σ j 2 )

其中 Π (读作pai,是 π 的大写形式)类似 符号,只不过这里将连加换成了连乘。顺便要说的是,估计 p ( x ) 的分布问题,通常被称为密度估计问题。

异常检测算法步骤总结

  1. 从样本中选择一些能体现出异常行为的特征 x i
  2. 分别计算出每个特征的参数 μ 1 , , μ n , σ 1 2 , , σ n 2

    (3) μ = [ μ 1 μ 2 μ n ] = 1 m i = 1 m x ( i )

    (4) σ 2 = [ σ 1 2 σ 2 2 σ n 2 ] = 1 m i = 1 m ( x ( i ) μ ) 2

  3. 给定一个新的样本x,计算出它对应的p(x):

    p ( x ) = Π j = 1 n p ( x j ; μ j , σ j 2 ) = Π j = 1 n 1 2 π σ j e x p ( ( x j μ j ) 2 2 σ j 2 )

    通过判断p(x)<ε,来判断是否有异常发生。

异常检测 VS 监督学习

评价一个异常检测算法时,使用了一些带标签的数据,以及一些我们知道是异常或者正常的样本(用y=1或y=0来表示)。

这就引出了这样一个问题:既然我们有了带标签的数据,那么为什么我们不直接用监督学习的方法(比如逻辑回归或者神经网络)呢?

异常检测 监督学习
负样本量很少(通常是在0到20个之间),正样本很多的时候 正负样本都很多的时候
有多种不同的异常类型时(因为对任何算法来说,从大量正样本中去学习到异常具体是什么,都是困难的);未知的异常与我们已知的异常完全不一样时。 有足够多的正样本来让你的算法学习到对应的特征,并且在未知的正样本中,也和已知的样本是类似的。

其实关键区别就是在异常检测算法中我们只有一小撮正样本,因此监督学习算法不能从这些样本中学到太多东西。

对不服从高斯分布的数据进行转换

在我们的异常检测算法中,我们做的事情之一就是使用正态(高斯)分布来对特征向量建模。

通常情况下,我们都需要用直方图来可视化这些数据,为了在使用算法之前,确保我们的数据看起来是服从高斯分布的(当然即使你的数据并不是高斯分布,它也基本上可以良好地运行,但最好转换成高斯分布的样式之后在带入计算)。

如果你的样本的某个特征展示效果完全不像一个正态分布的形状:

那么我们就需要对数据进行一些转换,来确保这些数据能看起来更像高斯分布。一般情况下,我们都会对原始数据尝试求对数或者开根号操作进行转换:

通过多元高斯分布改良异常检测算法

在多元高斯分布中,对于n维特征x∈Rn,不要把模型 p ( x 1 ) p ( x 2 ) ,…, p ( x n ) 分开,而要建立 p ( x ) 整体的模型。

多元高斯分布的参数包括向量µ和一个n×n的协方差矩阵Σ:

p ( x ; µ , Σ ) = 1 ( 2 π ) n 2 | Σ | 1 2 e x p ( 1 2 ( x µ ) T Σ 1 ( x µ ) )

对于多元高斯分布来说,一个很棒的事情就是我们可以用它来对数据的相关性建模。也就是说,我们可以用它来给 x 1 x 2 高度相关的情况建立模型。

猜你喜欢

转载自blog.csdn.net/lk3030/article/details/79953315