起因
例如:一个飞机引擎,它具有:功率、振动强度等特征。
在生产时,怎么自动判断一个飞机引擎是好是坏。
这需要用到正常的飞机引擎的样本集合(每个样本包括n个特征),再通过该样本集合判断待检测的飞机引擎是否不正常。

如上图,通过p(x)进行判断,当p(x)≥ϵ时判断为正常,相反,则不正常。
除处理飞机引擎外,还可以用来识别异常用户和异常计算机。
高斯分布
X∽N(μ,σ2),P(x;μ,σ2)=2πσ1exp(−2σ2(x−μ)2)
其中,μ和σ的参数的作用,如下:

实际计算中,μ=m1∑i=1mx(i)。σ2=m1∑i=1m(x(i)−μ)2。
其中,σ2中的m1可以是m−11。
算法过程
- 通过样本训练集,计算得到μ1,…,μn;σ12,…,σn2
- 将要检测异常的样本代入下式:
P(x)=P(x1;μ1,σ12)×⋯×P(xn;μn,σn2)
如果P(x)<ϵ,则检测到异常
其中,ϵ可设为0.02
评估算法好坏
获取标记好是否异常的训练集、验证集和测试集:比例是6:2:2
例如训练集中6000个正常的;验证集中2000个好的,10个异常的;测试集2000个好的,10个异常的
异常样本的数量大概2-50个。
在利用训练集训练以上各参数后,用验证集进行验证,通过以下参数进行评估:
- 正确检测为异常,错误检查为异常,正确检查到正常,错误检查为正常
- 查准率(正确检测为异常的数量与全部检测为异常的数量的比)和召回率(正确检测为异常的数量与验证集中异常样本的数量的比)
- 算F分值
异常检测和监督学习
异常检测 |
监督学习 |
y=1的样本很少(异常很少) |
y=1很多 |
异常的起因很多,且y=1很少,很难通过监督学习去进行学习 |
足够的y=1的样本去学习 |
可以应用于:欺诈检测、制造业如飞机引擎、数据中心的监控计算机 |
垃圾邮件、天气预测、癌症分类 |
其实异常检测就是y=1很少的监督学习(数据偏斜)
如何选择特征
让数据看起来更像高斯分布:

x1←log(x1)或x1←log(x1+1)或x1←x1或x1←x131
或者,也可以新建特征,因为有些特征要组合才能表示是否异常,比如x3表示CPU负载,而x4表示网络流量,那么,新的特征是x4x3,因为如果网络流量不变,而CPU负载却很高,就很有可能发生异常
另外,很可能存在的问题是,P对于正常样本或是异常样本来说,都过大,或者说,样本点分布均匀,难以确定异常。
因此,需要挑选在异常样本中,值过大或过小的特征组成样本。
多元高斯分布
如下图,有的数据不是呈圆形分布,而是呈扁圆形

这时,就不用求p(x1),…,p(xn)了,应该求如下模型:
p(x;μ,Σ)=(2π)2n∣Σ∣211exp(−21(x−μ)TΣ−1(x−μ))
其中:
μ=m1i=1∑mx(i)Σ=m1i=1∑m(x(i)−μ)(x(i)−μ)T
∣Σ∣运算求得该矩阵的行列式,在octave中使用det()函数算得
Σ和μ(在二维特征时)的变化可视化如下:



算法过程如下:
- 通过训练集训练得到μ和Σ
- 通过上述模型计算待检测的样本,如果p(x)<ϵ,则标记为异常
多元高斯分布与高斯分布的关系在于,矩阵Σ从左上到右下的对角线,对应原高斯分布中的参数σ12,…,σn2
多元高斯与原高斯的对比如下:
原高斯 |
多元高斯 |
模型是将多个特征的高斯分布密度函数相乘 |
用矩阵来计算模型 |
通常要自己创建特征,比如cpu负载与网络流量的比,来衡量是否异常 |
能够自动捕捉特征间的关系 |
计算量小 |
计算量大,牵涉到矩阵运算 |
样本很少也可以算 |
样本数量要比特征数量多,否则矩阵Σ不可逆,一般m≥10n
|