起因
例如:一个飞机引擎,它具有:功率、振动强度等特征。
在生产时,怎么自动判断一个飞机引擎是好是坏。
这需要用到正常的飞机引擎的样本集合(每个样本包括n个特征),再通过该样本集合判断待检测的飞机引擎是否不正常。
如上图,通过 p ( x ) p(x) p(x)进行判断,当 p ( x ) ≥ ϵ p(x)\ge \epsilon p(x)≥ϵ时判断为正常,相反,则不正常。
除处理飞机引擎外,还可以用来识别异常用户和异常计算机。
高斯分布
X ∽ N ( μ , σ 2 ) X \backsim N(\mu,\sigma^2) X∽N(μ,σ2), P ( x ; μ , σ 2 ) = 1 2 π σ e x p ( − ( x − μ ) 2 2 σ 2 ) P(x;\mu,\sigma^2)=\frac{1}{\sqrt{\smash[b]{2\pi}}\sigma}exp(-\frac{(x-\mu)^2}{2\sigma^2}) P(x;μ,σ2)=2πσ1exp(−2σ2(x−μ)2)
其中,
μ
\mu
μ和
σ
\sigma
σ的参数的作用,如下:
实际计算中,
μ
=
1
m
∑
i
=
1
m
x
(
i
)
\mu=\frac{1}{m}\sum_{i=1}^mx^{(i)}
μ=m1∑i=1mx(i)。
σ
2
=
1
m
∑
i
=
1
m
(
x
(
i
)
−
μ
)
2
\sigma^2=\frac{1}{m}\sum_{i=1}^m(x^{(i)}-\mu)^2
σ2=m1∑i=1m(x(i)−μ)2。
其中,
σ
2
\sigma^2
σ2中的
1
m
\frac{1}{m}
m1可以是
1
m
−
1
\frac{1}{m-1}
m−11。
算法过程
- 通过样本训练集,计算得到 μ 1 , … , μ n \mu_1,\dots,\mu_n μ1,…,μn; σ 1 2 , … , σ n 2 \sigma_1^2,\dots,\sigma_n^2 σ12,…,σn2
- 将要检测异常的样本代入下式:
P ( x ) = P ( x 1 ; μ 1 , σ 1 2 ) × ⋯ × P ( x n ; μ n , σ n 2 ) P(x)=P(x_1;\mu_1,\sigma^2_1)\times \dots\times P(x_n;\mu_n,\sigma^2_n) P(x)=P(x1;μ1,σ12)×⋯×P(xn;μn,σn2)
如果 P ( x ) < ϵ P(x)\lt \epsilon P(x)<ϵ,则检测到异常
其中, ϵ \epsilon ϵ可设为0.02
评估算法好坏
获取标记好是否异常的训练集、验证集和测试集:比例是6:2:2
例如训练集中6000个正常的;验证集中2000个好的,10个异常的;测试集2000个好的,10个异常的
异常样本的数量大概2-50个。
在利用训练集训练以上各参数后,用验证集进行验证,通过以下参数进行评估:
- 正确检测为异常,错误检查为异常,正确检查到正常,错误检查为正常
- 查准率(正确检测为异常的数量与全部检测为异常的数量的比)和召回率(正确检测为异常的数量与验证集中异常样本的数量的比)
- 算F分值
异常检测和监督学习
异常检测 | 监督学习 |
---|---|
y=1的样本很少(异常很少) | y=1很多 |
异常的起因很多,且y=1很少,很难通过监督学习去进行学习 | 足够的y=1的样本去学习 |
可以应用于:欺诈检测、制造业如飞机引擎、数据中心的监控计算机 | 垃圾邮件、天气预测、癌症分类 |
其实异常检测就是y=1很少的监督学习(数据偏斜)
如何选择特征
让数据看起来更像高斯分布:
x
1
←
l
o
g
(
x
1
)
或
x
1
←
l
o
g
(
x
1
+
1
)
或
x
1
←
x
1
或
x
1
←
x
1
1
3
x_1 \gets log(x_1)\\或 x_1 \gets log(x_1+1)\\或 x_1 \gets \sqrt{x_1}\\或 x_1 \gets x_1^{\frac{1}{3}}
x1←log(x1)或x1←log(x1+1)或x1←x1或x1←x131
或者,也可以新建特征,因为有些特征要组合才能表示是否异常,比如 x 3 x_3 x3表示CPU负载,而 x 4 x_4 x4表示网络流量,那么,新的特征是 x 3 x 4 \frac{x_3}{x_4} x4x3,因为如果网络流量不变,而CPU负载却很高,就很有可能发生异常
另外,很可能存在的问题是,P对于正常样本或是异常样本来说,都过大,或者说,样本点分布均匀,难以确定异常。
因此,需要挑选在异常样本中,值过大或过小的特征组成样本。
多元高斯分布
如下图,有的数据不是呈圆形分布,而是呈扁圆形
这时,就不用求
p
(
x
1
)
,
…
,
p
(
x
n
)
p(x_1),\dots,p(x_n)
p(x1),…,p(xn)了,应该求如下模型:
p
(
x
;
μ
,
Σ
)
=
1
(
2
π
)
n
2
∣
Σ
∣
1
2
e
x
p
(
−
1
2
(
x
−
μ
)
T
Σ
−
1
(
x
−
μ
)
)
p(x;\mu,\Sigma)=\frac{1}{(2\pi)^{\frac{n}{2}}|\Sigma|^{\frac{1}{2}}}exp(-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu))
p(x;μ,Σ)=(2π)2n∣Σ∣211exp(−21(x−μ)TΣ−1(x−μ))
其中:
μ
=
1
m
∑
i
=
1
m
x
(
i
)
Σ
=
1
m
∑
i
=
1
m
(
x
(
i
)
−
μ
)
(
x
(
i
)
−
μ
)
T
\mu = \frac{1}{m}\sum_{i=1}^mx^{(i)} \\ \Sigma=\frac{1}{m}\sum_{i=1}^m(x^{(i)}-\mu)(x^{(i)}-\mu)^T
μ=m1i=1∑mx(i)Σ=m1i=1∑m(x(i)−μ)(x(i)−μ)T
∣ Σ ∣ |\Sigma| ∣Σ∣运算求得该矩阵的行列式,在octave中使用det()函数算得
Σ
\Sigma
Σ和
μ
\mu
μ(在二维特征时)的变化可视化如下:
算法过程如下:
- 通过训练集训练得到 μ \mu μ和 Σ \Sigma Σ
- 通过上述模型计算待检测的样本,如果 p ( x ) < ϵ p(x)\lt\epsilon p(x)<ϵ,则标记为异常
多元高斯分布与高斯分布的关系在于,矩阵 Σ \Sigma Σ从左上到右下的对角线,对应原高斯分布中的参数 σ 1 2 , … , σ n 2 \sigma_1^2,\dots,\sigma_n^2 σ12,…,σn2
多元高斯与原高斯的对比如下:
原高斯 | 多元高斯 |
---|---|
模型是将多个特征的高斯分布密度函数相乘 | 用矩阵来计算模型 |
通常要自己创建特征,比如cpu负载与网络流量的比,来衡量是否异常 | 能够自动捕捉特征间的关系 |
计算量小 | 计算量大,牵涉到矩阵运算 |
样本很少也可以算 | 样本数量要比特征数量多,否则矩阵 Σ \Sigma Σ不可逆,一般 m ≥ 10 n m\ge10n m≥10n |