异常检测(anomaly detection):
问题动机:
异常检测是一个常用的机器学习的算法,它虽然主要用于非监督学习问题,但是从某些角度来看,它又类似于一些监督学习问题。
以下面这组数据集为例,我们希望做的是,假设给定的数据集都是正常的,当给定一个新的样本时,我们判断它属于这组样本的概率可能性。
在上图中,越靠近中心蓝色圈的数据属于该组数据的可能性就越高,反之则越低。这种方法我们称之为密度估计,表达式如下:
模型为我们其属于一组数据的可能性,通过
来检测非正常数据。
异常检测的应用有:识别欺诈用户,检测数据中心是否有异常。
高斯分布(Gaussian (Normal)distribution):
高斯分布也叫正态分布。一般记作X ~ N(),~表示X服从什么什么分布,N表示正态分布。高斯分布的数学形式为:
它的图像是一个山坡形的曲线,控制着曲线的中心,
也被叫做标准差(standard deviation),所以
也别叫做方差,其中
控制着曲线的宽度。下面列出了几幅典型的正态分布曲线。
参数估计:如果给定一个数据集,我们已经知道它满足正态分布,那么我们需要对它进行参数估计的话,大致的估计如下图所示
这里采用的其实是极大似然估计。
matlab代码实现:
mu = mean(X); %求平均值
sigma2 = sum(bsxfun(@minus X, mu) .^ 2) /m; % 求sigma的平方
算法:
算法流程:首先选择你认为可以表示信息的相关特征,注意是对特征进行密度估计。
下图是一个由两个特征构成的训练集,以及特征的分布情况:
下图表示的是密度估计函数,z轴是根据两个特征值所估计的的值。
然后我们选定一个,将
作为我们的判定边界,来预测新给定的数据是否是异常数据。
开发和评价一个异常检测系统:
将同一个数据集同时用做交叉验证集和测试集,是非常不好的做法。
面对一个包含异常情况的数据集,我们在将数据分成训练集、交叉验证集、和测试集的时候应该将异常数据放在交叉验证集和测试集。
异常检测VS监督学习:
我们可能会发现,异常检测算法和我们的监督学习算法很类似,那么我们为什么不直接对这些有标签的数据用监督学习的算法去学习呢,反而要用异常检测算法呢?
首先异常检测算法使用与在一个数据集中,异常样本数量非常少的情况。这里注意,我们要将异常样本只放在交叉验证集和测试集。而监督学习算法则是在一个数据集中,正样本和负样本的数量在一定程度上是差不多的,不会出现一种样本数量比另一种样本数量多很多的情况。
此外,异常检测算法更适用于检测数据集中可能不存在异常,比如如果检测一批样品中是否有次品,那么每个次品的故障地方可能是不一样的,因此面对一个新的样本的故障,可能数据集当中从来没有的。而如果数据集中的正负样本都具有某种规律,那么用监督学习算法可能会更好一些。
当你的数据集中,正样本的数量足够多时,比如产品的故障检测,你有非常多的故障产品的数据,那么异常检测问题也可以转化为一个监督学习的问题。
选择要使用的功能:
在异常检测算法中,很重要的一步是特征的选择,如果特征选择的不同,算法的性能很可能也是不同的。
如果特征的分布并不满足高斯分布,虽然这样我们仍然可以进行我们的算法,但是还是比较推荐将数据进行转化一下,使它看起来更接近于高斯分布。转换 的方法有取对数,或者取不同次幂等等。下图就展示了取对数的转换过程。
那么如何更好的选择特征值呢,和监督学习一样,我们可以采取先训练好模型,然后将模型应用在交叉测试集,看看预测失败的样本的原因是什么,从中努力找到新的特征值来提高算法的准确性。
多变量高斯分布:
当我们有两个相关的特征时,一般的高斯分布模型可能不能很好的识别异常数据,原因在于,一般的高斯分布模型尝试去同时抓住两个特征的偏差,因此创造出一个比较大的边界。因此我们的解决方法是用多元高斯分布模型。
在多元高斯分布模型中,我们将构建特征的协方差矩阵,用所有的特征一起来计算。
其中表示的是协方差矩阵
的行列式。在Octave/matlab中用det命令计算;
表示的是协方差矩阵的逆矩阵。
接下来我们看看协方差矩阵是如何影响模型的:
当协方差矩阵变大时或者变小时,相应的模型宽度也会变大或者变小。
当我们固定一个特征,让另一个特征改变时,模型相应的改变如下图所示:
如果我们改变协方差矩阵非对角线上的元素,那么我们就可以将这两个特征值建立起一定的关系。
此外,除了改变协方差矩阵的值,你还可以改变的值来移动峰值的位置。
使用多变量高斯分布的异常检测:
原始的高斯分布模型其实是多元高斯分布模型的一种特殊情况,当多元高斯分布模型的协方差矩阵除了对角线上的元素其他都为零时,原高斯分布模型就是多元高斯分布模型。
多元高斯分布与普通高斯分布的区别:
原高斯分布要使用的多一些,多元高斯分布要使用的少一些。