在接下来的一系列课程中,我将向大家介绍异常检测(Anomaly detection)问题。这是机器学习算法的一个常见应用。这种算法的一个有趣之处在于它虽然主要用于非监督学习问题,但从某些角度看,它又类似于一些监督学习问题。
1 定义
异常检测问题更正式一些的定义如下:
假设我们有m个正常的样本数据
我们要采取的方法是:给定无标签的训练集,对数据集x建立一个概率分布模型
那么就将其标记为异常。
因此当我们看到一个新的引擎在我们根据训练数据得到的
2 高斯分布中,μ和σ的关系
我们举例来说明一下高斯分布中μ和σ这两个参数之间的关系:
μ=0,σ=1 | μ=0,σ=0.5 | μ=0,σ=2 | μ=3,σ=0.5 |
---|---|---|---|
具体来说,高斯分布中的参数估计公式如下:
还有一点,如果你在学习统计学时,可能会见到这个式子:
σ2=1m−1∑mi=1(x(i)−μ)2 ,但在机器学习领域,大家习惯使用σ2=1m∑mi=1(x(i)−μ)2 ,其实在实际情况中,具体使用1m 还是1m−1 其实区别很小,只要你有一个稍大的数据集。这两个版本的公式在理论特性和数学特性上稍有不同,但在实际应用中,他们的区别甚小,几乎可以忽略不计。
3 异常检测的具体算法
假如说我们有一个无标签的训练集,其中共有m个训练样本,并且这里的训练集里的每一个样本都是n维的特征,因此你的训练集应该是m个n维的特征构成的样本矩阵:
对于我们的异常检测算法,我们要从数据中建立一个p(x)概率模型。由于x是一个向量,因此:
我们假定特征x_1服从高斯正态分布:
根据上节学到的知识,你可以得出对应的μ_1和σ_1:
这样p(x_1)就可以写成这样一个高斯分布:
同样地,我假设x_2也服从高斯分布,可以得出:
与此类似x_3服从另外一个高斯分布:
直到x_n:
因此可以得出:
其中Π(读作pai,是π的大写形式)类似∑符号,只不过这里将连加换成了连乘。顺便要说的是,估计p(x)的分布问题,通常被称为密度估计问题。
4 异常检测算法步骤总结
让我们来总结一下异常检测算法的具体步骤:
1.从样本中选择一些能体现出异常行为的特征x_i。
我们可以尝试找出一些特征,比如在你的系统里,那些能看出用户异常行为或者欺诈行为的特征。2.分别计算出每个特征的参数
μ1,…,μn,σ21,…,σ2n。
μ=⎡⎣⎢⎢⎢⎢μ1μ2┋μn⎤⎦⎥⎥⎥⎥=1m∑i=1mx(i)
σ2=⎡⎣⎢⎢⎢⎢σ21σ22┋σ2n⎤⎦⎥⎥⎥⎥=1m∑i=1m(x(i)−μ)2
其中:
对
3.给定一个新的样本x,计算出它对应的p(x):
通过判断p(x)<ε,来判断是否有异常发生。
给定一个用户行为的样本,如何知道用户行为是否异常呢?我们将用户行为数据带入到p(x)的计算中来,如果这个结果非常小,那么我们就将这个行为标注为异常行为。
异常分析例子
假如说我们有下面这样的数据集:
从图中我们可以看出,数据集有两个特征
其中特征
这两个特征对应的分布如下:
如果绘制出p(x)的图像,那么这个图像如下:
假如x_1=2,x_2=2那么就是这个点:
在3-D表面图上的高度就代表p(x)的值。而这个p(x)完整的写出来就是下面的形式:
那么有了这个表达式,我们如何鉴定新的样本是否异常呢?
要回答这个问题,我们可以先给计算机设某个无穷小的数值ε,假如我设置ε=0.02(我会在后面讲到如何选取ε的值)。
现在我们有两个样本,分别为
我们用上面的式子来计算出
具体相关细节详见