机器学习算法(十一):异常检测(Anomaly detection)—高斯分布

1 异常检测

        异常检测虽然主要用于非监督学习问题,但从某些角度看,它又类似于一些监督学习问题。

        什么是异常检测呢?如下例:

        假想你是一个飞机引擎制造商,当你生产的飞机引擎从生产线上流出时,你需要进行QA(质量控制测试),而作为这个测试的一部分,你测量了飞机引擎的一些特征变量,比如引擎运转时产生的热量,或者引擎的振动等等。

            

        这样一来,你就有了一个数据集,从x(1)x(m),如果你生产了m个引擎的话,你将这些数据绘制成图表,看起来就是这个样子:

                 

        这里的每个点、每个叉,都是无标签数据。这样,异常检测问题可以定义如下:我们假设后来有一天,你有一个新的飞机引擎从生产线上流出,而你的新飞机引擎有特征变量xtest。所谓的异常检测问题就是:我们希望知道这个新的飞机引擎是否有某种异常,或者说,我们希望判断这个引擎是否需要进一步测试。因为,如果它看起来像一个正常的引擎,那么我们可以直接将它运送到客户那里,而不需要进一步的测试。

        给定数据集x(1),x(2),..,x(m),我们假使数据集是正常的,我们希望知道新的数据xtest是不是异常的,即这个测试数据不属于该组数据的几率如何。我们所构建的模型应该能根据该测试数据的位置告诉我们其属于这一组数据的可能性P(x)

                

        上图中,在蓝色圈内的数据属于该组数据的可能性较高,而越是偏远的数据,其属于该组数据的可能性就越低。

        这种方法称为密度估计,表达如下:

                  

        欺诈检测:模型P(x)为我们其属于一组数据的可能性,通过P(x)<ε检测非正常用户。

        异常检测主要用来识别欺骗。例如在线采集而来的有关用户的数据,一个特征向量中可能会包含如:用户多久登录一次,访问过的页面,在论坛发布的帖子数量,甚至是打字速度等。尝试根据这些特征构建一个模型,可以用这个模型来识别那些不符合该模式的用户。再一个例子是检测一个数据中心,特征可能包含:内存使用情况,被访问的磁盘数量,CPU的负载,网络的通信量等。根据这些特征可以构建一个模型,用来判断某些计算机是不是有可能出错了。

2 高斯分布

        高斯分布,也称为正态分布。通常如果我们认为变量x符合高斯分布x~N(u,σ2),其概率密度函数为:

                 

       我们可以利用已有的数据来预测总体中的 \mu 和 \sigma ^{2} 的计算方法如下:

           

           

        高斯分布样例:

             

        注:机器学习中对于方差我们通常只除以m而非统计学中的(m-1)。这里顺便提一下,在实际使用中,到底是选择使用1/m还是1/(m-1)其实区别很小,只要你有一个还算大的训练集,在机器学习领域大部分人更习惯使用1/m这个版本的公式。这两个版本的公式在理论特性和数学特性上稍有不同,但是在实际使用中,他们的区别甚小,几乎可以忽略不计。

3 标准高斯分布

 3.1 高斯分布开发异常检测算法

        对于给定的数据集x(1),x(2),..,x(m),我们要针对每一个特征计算 \mu 和 \sigma ^{2} 的估计值。

             

             

         一旦我们获得了平均值方差的估计值,给定新的一个训练实例,根据模型计算P(x)

             

        当P(x)<ε时,为异常。

        下图是一个由两个特征的训练集,以及特征的分布情况:

            

        下面的三维图表表示的是密度估计函数z轴为根据两个特征的值所估计P(x)值

               

        选择一个ε,将P(x)=ε作为我们的判定边界,当P(x)>ε时预测数据为正常数据,否则为异常。

        我们介绍了如何拟合P(x),也就是x的概率值,以开发出一种异常检测算法。同时,也给出了通过给出的数据集拟合参数,进行参数估计,得到参数uσ然后检测新的样本,确定新样本是否是异常。

3.2 开发和评价一个异常检测系统

        异常检测算法是一个非监督学习算法,意味着我们无法根据结果变量y的值来告诉我们数据是否真的是异常的。我们需要另一种方法来帮助检验算法是否有效。当我们开发一个异常检测系统时,我们从带标记(异常或正常)的数据着手,我们从其中选择一部分正常数据用于构建训练集,然后用剩下的正常数据异常数据混合的数据构成交叉检验集测试集

例如:我们有10000台正常引擎的数据,有20台异常引擎的数据。我们这样分配数据:

  • 6000台正常引擎的数据作为训练集
  • 2000台正常引擎和10台异常引擎的数据作为交叉检验集
  • 2000台正常引擎和10台异常引擎的数据作为测试集

        具体的评价方法如下:

        根据测试集数据,我们估计特征的平均值方差并构建P(x)函数。交叉检验集,我们尝试使用不同的ε值作为阀值,以及在考虑要不要纳入某个特征时,来预测数据是否异常,根据F1值或者查准率与查全率的比例选择ε、特征。选出ε后,针对测试集进行预测,计算异常检验系统的F1值,或者查准率与查全率之比。

系统的推导和评估如下:

  • 使用训练集拟合模型 p(x) ,即是把6000个样本都用高斯函数来拟合;
  • 对于交叉验证集,尝试使用不同 ξ 值作为阈值,并对数据进行预测,根据以下指标选择最合适的 ξ
    • 计算True positive、false positive、false negative、true negative的比例
    • 计算出算法的精确率和召回率
    • 计算出F1-score,来总结和反映精确率和召回率
  • 选出 ξ 后,针对测试集进行预测,计算异常检验系统的F1值,进行评价

3.3 异常检测与监督学习对比

        之前构建的异常检测系统也使用了带标记的数据,与监督学习有些相似,下面的对比有助于选择采用监督学习还是异常检测

异常检测监督学习
非常少量的正向类(异常数据y=1),大量的负向类(正常数据y=0),甚至只有负向类同时有大量的正向类和负向类
异常数据有很多不同种类,很难根据非常少的异常数据来训练算法有足够多的正向类数据,可以用来训练算法
未来遇到的异常数据可能和已掌握的异常完全不同未来可能出现的正样本与当前训练集中的正样本类似
欺诈行为检测;生产(例如飞机引擎);检测数据中心的计算机运行状况邮件过滤器;天气预报;肿瘤分类

3.4 特征的选择

        对于异常检测算法,特征的选择是极其重要的。
        首先数据特征最好符合高斯分布,如果数据的分布不是高斯分布,异常检测算法也能够工作,但是最好还是将数据转换成高斯分布,例如使用对数函数:x=log(x+c),其中c为非负常数;或者x=xcc为0-1之间的一个分数,等方法。(编者注:在python中,通常用np.log1p()函数,log1p就是log(x+1),可以避免出现负数结果,反向函数就是np.expm1()); 等,如下图所示。然后将转化后的结果作为特征。

               

        误差分析:

        一个常见的问题是一些异常的数据可能也会有较高的P(x)值,因而被算法认为是正常的,如下左图所示,。这种情况下误差分析能够帮助我们,我们可以分析那些被算法错误预测为正常的数据,观察能否找出一些问题。我们可能能从问题中发现我们需要增加一些新的特征,增加这些新特征后获得的新算法能够帮助我们更好地进行异常检测。如下右图所示,看是否能得到新的特征x2来帮助算法更好的进行异常检测。通过特征x2,使得数据能够像下右图一样显示出来,发现异常数据处于外层,从而更容易将异常样本从正常的样本中区分出来。

             

        异常检测误差分析:

                

        我们还可以通过将一些相关的特征进行组合,来获得一些新的更好的特征(异常数据的该特征值异常地大或小),例如,在检测数据中心的计算机状况的例子中,我们有四个特征:x1:内存使用量; x2:磁盘的容量;x3:CPU的负载程度;x4:网络流量,我们可以用CPU负载与网络通信量的比例作为一个新的特征x5,如果该值异常地大,便有可能意味着该服务器是陷入了一些问题中,算法便可以捕捉到这一异常值。

4 多元高斯分布

4.1 多元高斯分布

        假设有两个相关的特征,而且特征的值域范围很大,如下图所示。此时异常检测检测的范围是红色圆圈,即中间的概率最大,而图中的绿色点明显为异常值,其原因在于一般的高斯分布尝试去同时抓住两个特征的偏差,因此有一个比较大的判定边界。而蓝色椭圆为多元高斯分布所判定的边界。在多元高斯分布模型中,我们构建特征的协方差矩阵,用所有的特征一起来计算p(x) 。

                

        首先我们先计算所有特征的平均值协方差矩阵

               

        其中是一个向量,表示每个特征的均值表示整个数据集。然后计算多元高斯分布的 p(x) :

                

上图为五个不同的高斯模型,从左向右依次为不同的协方差矩阵对模型带来的影响:

  • 一般的原始高斯分布模型
  • 通过协方差矩阵,x1有较小的偏差,x2不变
  • 通过协方差矩阵,x2有较大的偏差,x1不变
  • 通过协方差矩阵增加了两者的正相关性
  • 通过协方差矩阵增加了两者的负相关性

        很明显,原本的高斯模型是多元高斯模型的一个特殊情况,原高斯模型的协方差矩阵为一个对角单位矩阵(如上图第一)。

 4.2 标准高斯分布与多元高斯分布的对比

标准高斯模型多元高斯模型
不能捕捉特征之间的相关性,需要手动创建新特征,如x1/x2可以自动捕捉特征之间的相关性
计算成本低可以进行大规模运算,即可以支持数量巨大的特征成本高,能适应的n值范围小
即使有一个较小的有一定相关性的训练集,也能顺利运行必须m>n,不然协方差矩阵不可逆的,通常需要m>10n;另外特征冗余(比如存在两个相同特征,或者两特征间存在线性关系)也会导致矩阵不可逆

4.3 异常检测

        在使用多元高斯模型进行异常检测时,应该先根据数据集求得特征平均值协方差矩阵:            

             

        然后由待检测的数据 x 求得p(x) 

               

       计算结果后,若,则样本正常,否则异常。

附:

1 协方差矩阵

        在统计学与概率论中,协方差矩阵每个元素是各个向量元素之间的协方差,是从标量随机变量维度随机向量的自然推广。

协方差矩阵的证明:https://blog.csdn.net/weixin_39910711/article/details/101693614

1.1 概念

        设  为n维随机变量,称矩阵

             为n维随机变量的协方差矩阵(covariance matrix),也记为,其中的分量 和的协方差(设它们都存在)。

       例如,二维随机变量的协方差矩阵为

                 

        其中 

                

        由于 ,所以协方差矩阵为对称非负定矩阵。

1.2 性质

协方差矩阵具有如下性质:

  1. ,其中A是矩阵,b是向量。

通俗地讲, 协方差可以理解为:两个变量在变化过程中是同方向变化?还是反方向变化?同向或反向程度如何?
你变大,同时我也变大,说明两个变量是同向变化的,这时协方差就是正的。
你变大,同时我变小,说明两个变量是反向变化的,这时协方差就是负的。
从数值来看,协方差的数值越大,两个变量同向程度也就越大。反之亦然。

1.3 应用

        协方差矩阵可用来表示多维随机变量的概率密度,从而可通过协方差矩阵达到对多维随机变量的研究。以二维随机变量为例,由于

                  

               

        引入矩阵

                  

        及 的协方差矩阵

                   

        由此可得

                    

        由于

                      

                   

        于是的概率密度

                       

        此式可以推广到n维正态分布的情形。

2 基于Box–Muller变换的正态随机数生成方法

https://blog.csdn.net/weixin_39910711/article/details/101773776

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值