来自ng 的ml-003 15_XV._Anomaly_Detection
异常检测本是一个无监督问题,但是也类似于一个有监督问题。就是在大量的无标签数据中检测那些异常的样本
一、异常检测的概念
假设是考虑的飞机引擎问题,这里有至少2个特征,图中的红色叉就是根据以往的数据所可视化的正常的样本,这是按照数据收集获得的,没有加标签,当给定的test样本是如图所示的绿色时,那么久认为是正常样本,当给定的样本离以往的样本较远时,那么通过算法得到这是个异常所以被称之为anomaly/
再来个更直观的:
从无限远到这里的类别中心的方向为0-1,那么当test样本在无限远处,那么他的概率就几乎为0,越靠近类别中心,他的概率越大。
这里举了个例子,当在一个很大的计算机集群机房中,检测一个异常的电脑是比较有意义和必要的,这里就举了这么个例子。
数学插入: 高斯
u就是函数的均值,而sigma就是均值中心离样本点概率的距离,如上图所示。
如上图所示,u控制的是高斯分布函数的中心位置,而sigma控制的是函数的形状,因为他们和x轴围成的面积都是大小为 1 ,所以sigma越小,那么就得越高,相反sigma越大,那么就会越矮,这样高斯下面横跨的x轴范围也会越大(这里模糊的认为超过 x 的值多少,分布就和x轴重合,相当于紧贴x轴,只是为了直观的理解)
得到了高斯函数,那剩下的问题就是估计参数u,sigma了,他们的计算方式如图上, 这是当都知道样本的情况下才这么计算的。在数学上方差是需要除以( m-1 )的,而不是简单的除以 m, 但是对于机器学习来说,这个m数值很大,减一还是不减,其实没多大影响,因为都是分分钟至少以万为级别的。
二、异常检测算法
假设样本x的每个分值都来自于不同的高斯分布,那么P(x)的值就如图是累乘的结果。分别来自不同的高斯分布的相乘。
这里算是算法的开始吧,uj是计算样本的每个特征的均值(期望),和每个特征的方差。
通过计算训练样本的特征均值和方差来使得n-变量高斯模型的参数可以固定,然后用这些固定的参数来计算新的样本的高斯概率,如果很小,那么就是离得中心很远(这么一说 好像高斯函数也可以 隐藏的计算距离啊,这可以深挖,还是已经被大神挖的不能在挖了)。
按照上图所示,红色叉是训练的样本,通过训练得到的参数结果就是右边蓝色框框出来的,然后可以画出两个特征的对应的高斯图像,下面是对应的3d图像,冲着了可以看出,对于x1特征来说,他的方差是在x轴上样本离中心轴的距离,x2的sigma是样本离y轴中心轴的距离,然后当给出两个不同的样本,,在通过给出阈值(0.02),通过计算每个样本的正常程度,如果正常程度小于阈值,那么这就是个异常点。
上面是如何来定义异常检测的模型,这里采用的是有监督学习算法,因为涉及到了标签。通过正常类进行训练模型,然后在通过交叉验证集合来调整(是否过拟合啊,是否需要特征缩放啊等等),最后在测试集上进行测试(有交叉验证集的好处是可以中间模型的调整,坏处是缺少了这部分的信息)。
上图是举个例子怎么来划分数据集,上面的划分方法是比较建议的,因为CV集合和test集合是完全不重叠的数据,这样比较有说服力,但是也有一些人按照下面的方法来划分,将数据集分为测试集和其他部分,这里的其他部分就是即当作CV集也当作test集,只不过将一场类区分成两部分分别给CV和test,但是这样就相当于即拿这个数据集来调整模型,又拿这个数据集测试模型一样。随机性不够大,难以服众。
上图就是更具体的步骤,在CV集合上评估这个模型好不好的方法是图中介绍的几种,在最开始的博文中有所提及,特别是精度/召回 和f-得分在那些偏移太重的数据集上比较适合。而且可以通过观察CV的结果图来精确的选择阈值。
三、异常检测算法VS有监督学习
看了第二部分的内容,会疑问这种异常检测算法一下又是度量 一下又是数据集的划分,而且很像有监督学习算法,那为什么不直接用线性回归 或者nn什么的直接有监督学习搞定呢?
对于两者比较,一个比较显著的就是异常检测中异常样本是很少的,而有监督学习来说异常和正常样本都相差差不多,基本上是在一个数量级别上的。另一个不同就是异常检测来说相当于“one of all”一样,对于大千世界很多情况只对正常类进行训练,所有与正常类不同的都是异常,而对于有监督学习来说,就是假定两种类(正常类a,异常类b)而就算后续的样本也是异常类b中的某种其他表现形式,而不是来自于异常类c。所以相当于有监督学习算法是记忆了两种类,而异常检测算是排除其他类的原理。
这是两个不同方向上的一些例子,但是当比如第一个欺骗检测是类别固定而且样本较多,那么就可以用有监督来搞定。
四、如何选择特征
当特征不是由高斯分布生成的咋办,这时候如图,进行可视化发现对于一个特征来说,他的形状很像高斯,所以我们何以用高斯函数来拟合,当下面这样的和高斯函数形状不像的时候,可以采用log(x+c)的函数来进行先预处理,之后就是类似与高斯函数,这里的原理就是通过方法整的和钟好像,然后用高斯
ng通过对x样本进行不同程度的小于1 的幂次计算,会发现所获得的的图像越来越接近高斯图像
上图是较为接近原始图像的样子,(这里的具体的原理还需要后续想想,虽然实验如此,但是如何用数学表达出来,更趋于逻辑一些。。。。)
这里就是通过小于1 的幂次计算或者通过log计算获得的新的样本,这两者所得到的直方图是类似的,都可以用(也就是说可以通过多种方法将原始样本给弄得和高斯函数形状差不多。)
先看上图中下面两个坐标系,左边的是当只考虑一个特征的时候,这时候发现没法将绿色的异常点进行区分,(升维的一个好处,就是将低维不可分的情况给映射到高维可分的情况),右图就是当考虑了两个特征会发现绿色的点可以轻松的区分。
举个例子,当这里的x3的cpu超载了,一个是因为异常机子,一个是因为代码不好写了个无限循环,但是这时候这个特征就没法进行区分,所以可以人为的多设定几个特征,比如这里的x5 和x6就是按照前面的特征来重新生成特征(也算是一个升维吧)。
五、多变量高斯分布
多变量高斯分布能够同时检测好几个异常,而之前的高斯分布却不行
上图中右边是左边的单一特征情况下的高斯函数
当出现一个异常点的时候,将这个异常点按照单独的特征进行高斯概率的计算,发现这个异常点在x1特征上高斯概率很高,在x2上高斯概率也很高,如果按照前面的方法计算,这个异常点就完全无法计算出来,会被误认为是正常点的
因为按照上面之前的,数据是按照差不多一个园的,这里的异常点明显是符合上面的定义的,但是对于这里的数据集来说,不是一个圆形而是椭圆
长条形状,这时候用之前的方法累乘肯定就不好了
这就是多变量高斯分布,他的期望是n(特征维度)维的,方差这里是协方差矩阵sigma 是n * n的。
这里是先用2个变量来简单的说明多变量高斯的形状和位置,按照上面的定义 期望u决定着中心的位置,而方差 ,这里时协方差,决定这函数的形状,他与x0y的平面所形成的额面积依然是1,因为概率的总和是 1 ,所以协方差越小,那么就会越高,也就是越瘦,相反协方差越大,那么就越胖,也就是越矮。
这里是另个比较了,通过上图中第二个和第三可以得到,协方差不同位置的值控制这这个方向上高斯函数形状的大小。
可是当协方差的反对角线有值的时候,就是表示不同特征之间的相关性,值越大相关性越强,月接近与x=y这条线,而且为正是y=x,为负就是y=-x方向
六应用多变量高斯分布到异常检测
这和最上面的使用训练集来进行参数的训练,训练好多变量高斯分布函数的u和sigma,这里的协方差和pca 以及白化中使用的是一个
然后顺带和以前的进行对比了下:
其实这章多看图就能理解
通过上图对比就能发现原始的高斯和多变量高斯的不同,不论是在对数据量的要求还是自身模型所具有的表现特征独立信息还是特征之间的信息 都是有所不同的,而且前者是简单的累乘,而后者是一个大的高斯函数,得计算很大的矩阵,所以开销较大,******值得注意的是最后那个,m最好远大于n,因为有些特征是重复或者是冗余的,在计算协方差的时候,最后会发现这个协方差其实是个不可逆矩阵,那么就没法求了,当m远大于n的时候这个问题就不需要担心了,或者是训练前先检查特征是否冗余,先剔除这部分特征****