代码改变世界

Anomaly Detection-异常检测算法(Coursera-Ng-ML课程)

2018-07-07 14:31  bluemapleman  阅读(308)  评论(0编辑  收藏  举报

现实生活中有许多需要提前预防一些异常问题出现的情况,例如在飞机起飞前,对飞机各部分进行评估,看发动机等各个零件是否性能正常,若有潜在的问题(可能出现异常情况),则需要及时检修或更换。

那么我们如何去评估异常是否存在呢?

利用联合概率分布~

联合概率分布

$X表示一系列随机变量{X_1,X_2,X_3,....,X_n}的组合,每个随机变量符合服从各自的一种分布。假设各变量是两两相互独立的,那么这些变量的联合概率分布为:
$$P(X)=P(X_1)P(X_2)....*P(X_n)=\Pi P_i$$

即每个随机变量取相应值的概率的乘积。

正态分布

正态分布是一种非常常用的分布函数,其形式如图所示:

这里写图片描述

图像横轴表示随机变量x的取值,纵轴表示x取相应值的概率(0-1之间)。

该图像的函数形式(概率密度函数)为:

$$y=P(x)=\frac{1}{2\pi\sigma}*exp(-\frac{x-\mu}{2\sigma^2})$$

$\mu$为x分布的均值,$\sigma$为x分布的标准差。整个函数图像是关于x=$\mu$对称的,且整个函数图像针对整个横轴的积分为1.(概率密度函数都有此特性,代表x的值必然落在概率密度函数定义域的某一点上)

根据图像我们可以很清楚地看到,x的值为均值附近的值的概率非常大,而离均值越远的值出现的概率则越小。

并且针对正态分布,有一个非常有名的2-$\sigma$特性,即:
这里写图片描述

区间 函数图像与横轴在区间的积分/面积
[μ-σ,μ+σ] 0.683
[μ-2σ,μ+2σ] 0.954
[μ-3σ,μ+3σ] 0.997

为了让下面的内容更好理解,这里先提示一下:针对正态分布,我们可以将x取距离均值较劲的情况视作正常情况,因为概率很大,而取值离均值很远的情况视为"异常"情况,因为概率很小。而我们检测异常的算法就是由这种思路而来。

异常检测模型训练

那么怎么检测异常呢?

我们首先这样想:什么时候异常最可能出现?是不是应该是在一些比较罕见的情况出现的时候,异常最可能出现。(“比较罕见的情况”在某些其它语境下本身也可以理解为“异常”的意思,但在这里,仅仅指除了我们所关注的目标异常之外的异常状况)。

例如你想知道一台电脑是不是坏了,那么你就观察该电脑是否有和一般电脑不一样的地方,你可能发现它经常运行卡顿(罕见情况1),并且发现它开机特别慢(罕见情况2),那么很大情况下,你就可以判断这台电脑应该有问题。

而体现在异常检测算法里,这些罕见情况就类比为了一个个特征的分布上距离均值比较远的取值出现。

首先假设我们选取了可能可以用于评估一台电脑是否正常工作的一些特征,比如打开一个大型程序所需要花的时间($X_1=20s$)和开机时间($X_2=50s$)这两个特征,然后我们需要搜集一系列已知为正常电脑的相关数据,得到正常电脑在“打开程序耗时”与“开机时间”这两个特征上的值的分布情况,如下表所示:

样本编号 打开程序耗时 开机时间
1 8s 20s
2 11s 15s
3 19s 37s
4 15s 26s
5 17s 12s

那么根据这些搜集到的样本值,我们可以通过对它们求平均获得“打开程序耗时”的平均值$\mu_1=(8+11+19+15+17)/5=14$以及“开机时间”的平均值$\mu_2=(20+15+37+26+12)/5=22$,以及分别求得两特征的标准差$\sigma_1=4$与$\sigma_2=8.87$。计算公式为:
$$\mu=\frac{\Sigma_{i=1}^{n}t_i }{n} \
\sigma2=\frac{\Sigma_{i=1}(t_i-\mu)^2}{n}$$

那么此时,假设两个特征的分布均为正态分布,我们将利用搜集到的样本值计算出的均值$\mu_1,\sigma_1$和$\mu_2,\sigma_2$分别作为两个特征的正太分布函数的参数,然后利用联合概率分布的原理,求得当一台电脑“打开程序耗时”为20s,“开机时间”为50s的联合概率:

$$P(X_1=20,X_2=50)=P(X_1=20)P(X_2=50)=\ [\frac{1}{2\pi4}exp(-\frac{20-14}{2(22)2})]*[\frac{1}{2\pi*8.87}*exp(-\frac{50-22}{2*(8.87)2})]=0.00059755$$

结果是0.0006左右,即0.6%的概率,是一个非常小的概率值了,这个值的含义为:一台正常电脑同时表现为“打开程序耗时”为20s,“开机时间”为50s的可能性是0.6%。

那么,我们基本可以判断:该电脑肯定是有问题的(异常情况)。

这里有两个要注意的问题:

1.为什么我们可以把特征的分布值假设为正态分布?

  • 这个要根据特征取值的特性来决定。特征的取值有离散值和连续值两种,离散值的分布有泊松分布、伯努利分布,连续值的分布有均匀分布、正态分布、卡方分布等。而之所以我们会将以上例子的两个特征值都假设为正态分布,是因为现实情况中绝大多数连续值变量的分布都接近或就是正态分布,并且实验也证明,这样假设的模型效果一般都不错。

2.为什么可以假设两个特征是相互独立的?

  • 这个其实也是一个依赖经验的做法。现实情况下,某些特征很有可能其实是相互关联的,比如如果一个电脑开机时间很慢,很可能是它有太多的开机运行程序在后台运行,那么在它之后打开程序时,自然会需要更多时间,那么这两个特征其实是关联的,并不独立,上述的联合概率的计算公式在这里其实并不理论可行。但是实际当中,我们依然比较简单粗暴地假设为特征互相独立,发现异常检测的效果依然还是很不错的,所以也就不是大问题了。

模型评估