异常检测
异常检测定义
我们按常规从一个例子入手:
这是一个飞机引擎的例子,有很多包括特征x1:产生的热量,x2:振动强度 等等…
收集了很多数据集(m个),这是没有标签的数据,然后来了一个新的飞机引擎,测出新的数据
xtest
x
t
e
s
t
。在图中可以看出,如果
xtest
x
t
e
s
t
位于上面的绿点,那么这个飞机引擎是ok的;如果在下面的绿点,这个飞机引擎可能就是异常的。
更正式的定义
给定一个数据集{
x(1),x(2),...,x(m)
x
(
1
)
,
x
(
2
)
,
.
.
.
,
x
(
m
)
},如何判断
xtest
x
t
e
s
t
是否是异常的?
首先我们确定这个数据集的数据都是正常的/非异常的。然后通过这些数据集建立
x
x
的概率模型。
当
p(xtest)<ϵ
p
(
x
t
e
s
t
)
<
ϵ
,那么我们可以标记这个是异常的。
反之,如果
p(xtest)≥ϵ
p
(
x
t
e
s
t
)
≥
ϵ
,那么我们可以标记这个是正常的。
异常检测算法
第一步,选择特征。第二步,计算每个特征在所有样本上的期望值和方差。第三步,计算概率模型p(x)。计算的方法是将每个特征的高斯分布概率函数累乘起来。
我们从图例来解析算法。
第一幅图是样本的分布,第二幅图是计算出的两个特征的高斯分布图。我们通过累乘两个特征的高斯分布概率,得到第三幅图。这幅图中高度是p(x)的值。可以看出,当
p(x)<ϵ
p
(
x
)
<
ϵ
时指的是当样本点分布在很偏的地方。
算法评价
训练集上都是正常的数据。通过交叉验证可以调整
ϵ
ϵ
的值。
异常检测vs监督学习
既然异常检测和监督学习都是为了预测给定一个样本判断它的标签是1还是0(异常还是正常),为什么不直接用监督学习代替异常检测呢?
下面是异常检测和监督学习的一些区别:
异常检测 | 监督学习 |
---|---|
大量y=0(正常)样本,极少量y=1(异常)样本(常见的是0-20) | 正样本和负样本都非常多 |
有很多不同类型的异常,异常样本数量很少,其算法可能难以从中学习,出现新的正样本无法用其他算法检测出来,这种情况我们更适合用异常检测 | 正样本足够多,出现新的正样本可能跟以前的正样本类似,这种情况更适合用监督学习 |
当特征看起来不像高斯分布
我们对特征进行改变,比如取对数log,或者对特征开方等,使得特征的分布近似于高斯分布。
多元高斯分布
在我们之前所举的例子中,p(x)趋向于形成上图左边中的品红线,而不会形成蓝色的椭圆线。在这种情况下,对绿色样本点的划分会有差别。
从上图的右图中可以看出,尽管有些案例分布在x1的最左边或者x2的左右两边,但是这些不会认为是异常值。
因此,我们需要一种改良版的异常检测算法来应对上图的情况。
我们需要用到多元高斯分布。
在多元高斯分布中,我们不会单独对
p(x1),p(x2),...
p
(
x
1
)
,
p
(
x
2
)
,
.
.
.
进行建模,然后累乘为
p(x)
p
(
x
)
。而是一次性的建模
p(x)
p
(
x
)
。
参数:
μ
μ
和
Σ
Σ
(协方差矩阵)
多元高斯分布的公式不需要记住,只要在需要的时候去查就可以。
我们来举个例子说明多元高斯分布到底是怎么样的:
图1:
图2:
图3:
现在来解释一下:
图1和图2中协方差矩阵的反对角都是0,代表的是x1和x2特征不相关,可以推出x1和x2独立,最终得到的多元高斯分布仍然可以看做是累乘。
图3中开始有了x1和x2之间的相关系数,x1和x2不独立,即我们获得了我们想要的“椭圆”的效果。
下面是x1和x2负相关的例子:
应用多元高斯分布到异常检测
第一步,先计算出特征的联合概率分布p(x),通过计算
μ
μ
和
Σ
Σ
第二步,给定一个样本x,计算概率p(x),当
p(x)<ϵ
p
(
x
)
<
ϵ
时标记样本点为异常。
原高斯分布vs多元高斯分布
事实上,Andrew Ng提及只有当m远远大于n的时候(样本数远远大于特征数)时才会使用多元高斯分布,可以得到更好的效果,并减少你手动创建特征的时间。
如果 Σ Σ 是奇异的或者说是不可逆的,那么可能是因为样本数小于特征数,或者有冗余的特征,