博客已经迁移到Marcovaldo’s blog
Andrew Ng在Machine Learning的第九周介绍了异常检测(anomaly detection)和推荐系统(recommender system),将笔记整理在下面。
Anomaly Detection
Density Estimation
Problem Motivation
视频开头,Andrew Ng告诉我们,异常检测(anomaly detection)主要应用于无监督式学习,但它更像是监督式学习。我们以飞行器发动机为例来介绍异常检测。飞行器发动机会有很多特征,这里我们用x1表示产生的热量,用x2表示振动强度,且假设有数据集{x(1),x(2),…,x^{(m)}}(注意,这里的数据是标记的),下图坐标系中每个点代表一组数据。我们的问题是怎样根据现有的这些未标记数据去判断一组新数据是否可靠(如新数据是真实的,还是编造的)。下图中有两组绿色标记的数据点,直观上,我们会觉得上面的那组数据应该更可靠一些,因为该数据点周围有许多其他的数据点;而下面的那组太孤立,可能存在问题。
这里我们引入了一个密度估计的模型来判断新数据xtest异常与否,其中p(x)是指数据点在整个数据集中的密度分布,其具体公式会在后面给出。
p(xtest)<?→anomalous
p(xtest)≥?→OK
对于下图中的training set,我们发现数据点从中心(图中的小圆圈处)到四周(图中的大圆圈处),其密度由大到小。处于中心的数据点其更有可能是正常的,而处于边缘处的数据点则更有可能是异常的。
异常检测的应用有很多,如下图中给出的流量监测中的反作弊、装备制造、监测数据中心的机器运作情况。在前一个应用中,首先提取用户的特征(如用户登录频率、用户访问页面数量、用户的post数量等),收集数据,然后得出密度分布模型p(x),最后用来判断某个用户是否作弊。在后一个应用中,我们可能会提取的特征有内存使用情况、磁盘可用/占用情况、CPU工作量、CPU工作量/流量等等。通过这些特征值,我们可以判断机器运作是否正常。例如,若CPU利用率很高,而流量很小,则该机器可能进入了死循环。
Gaussian Distribution
这一小节我们介绍Gaussian分布,也就是高中就开始学的正态分布。如果你对Gaussian分布已经相当熟悉的话,就可以跳过这一节了。假设x∈R,如果x服从期望值为μ,方差为σ2的Gaussian分布的话,则有
x~N(μ,σ2)
p(x;μ,σ2)=12π??√σexp(?(x?μ)22σ2)
概率密度函数的图像如下图所示
下图给出不同参数的Gaussian分布的图像,反映了概率分布函数随数据样本点期望和方差的变化情况。
我们知道概率分布函数中两个参数的定义,对于给定的数据集{{x(1),x(2),...,x(m)}},其中x∈R。下面给出计算公式:
μ=1m∑i=1mx(i)
σ2=1m∑i=1m(x(i)?μ)2
Algorithm
给定训练数据集{x(1),…,x(m)},其中x∈R,对于x我们有
p(x)=p(x1;μ1,σ21)p(x2;μ2,σ22)?...?(xn;μn,σ2n)=∏i=1np(xi;μi,σ2i)
其中xi是x的第i个分量(i的取值是从1到n),且有
xi~N(μn,σ2n)
这就前面提到的密度估计模型。(这里,特征x1到xn是互不相关的)下图给出了具体的密度估计算法:
下图给出了一个具体的应用,特征x1和x2分别服从于N(μ1,σ21)、N(μ2,σ22)的正态分布,二者互不相关。图中标出了两个测试数据x(1)test、x(2)test,通过计算得知x(1)test为正常数据,而x(2)test为异常数据。
Building an Anomaly Detection System
Developing and Evaluating an Anomaly Detection System
在构建一个学习算法(选择特征等)时, 一个能够衡量学习算法性能的指标会其很大的帮助作用。假设我们有一些已经标记了的数据(正常数据标记为y=0,异常数据标记为y=1),我么应该让training set中的数据全部为正常数据,cross-validation set和test set中的大部分是正常数据,小部分是异常数据。
下面沿用前面的飞行棋发动机的例子,给出具体的数据分布。注意第二种数据分布中,cross-validation set和test set中的正常数据是一样的,这在很多时候是允许的。
当然,在处理未标记的数据集时,采用的是同样的一个过程。另外,这里提到了评判学习算法性能的指标,如precision、recall、F1score,不明白的可以查看第六周笔记二。
Anomaly Detection vs. Supervised Learning
通过前面的学习,我们发现异常检测和有监督式学习很像,这一节我们就来讨论一下,那些情况适合使用异常检测,那些时候适合有监督式学习。
首先是数据集的分布上有区别:异常检测适用于positive examples(异常数据,y=1)占很少一部分而negative examples(正常数据,y=0)占很大一部分的数据集;而有监督式学习适用于positive examples和negative examples数量相当的数据集。另外,异常检测可以应对多种类型的异常数据,其处理的新的异常数据很可能是以前没有遇到过的(比如,电脑异常中可能会遇到CPU利用率多高、流量过大等多种异常,而这些异常的数量肯定都很低,且必须都能被检测出来);而监督式学习处理的新数据与training set中的数据是相似的。
在这里我们结合前面提到的几个应用来对比二者的不同。异常检测的应用有流量监测中的反作弊、装备制造、监测数据中心的机器运作情况等,这里的异常用户/设备(发动机)/电脑相对于正常用户/设备(发动机)/电脑数量很少很少,且种类多样。监督式学习的应用有垃圾邮件系统、天气预测、癌症分类,这几种应用都是讲数据分成数量相当的几类,且同一类中的数据很相似。
Choosing What features to Use
这一小节我们介绍在异常检测中如何设计特征。我们是使用概率密度分布来处理数据,检测异常,因此我们需要是数据集中的特征满足某一分布,如Gaussian分布(当然,你也可以使用其他的分布,这时你就要调整前面的p(x))。下图中左上是一个特征的频率直方图,基本符合Gaussian分布,这时我们可以直接进行异常检测;类似左下这样的明显不符合Gaussian分布,这时我们就需要对其进行调整(图中将x1改成了log(x1)),再进行异常检测。
通常情况下,在对新数据进行检测时,我们希望由正常数据得到的p(x)值很大,而由异常数据得到的p(x)值很小,这样就能成功的将二者分开了。但是,有时候却发现,异常数据和正常数据得到的p(x)值相当,不能区分开,此时我们就要考虑添加新的特征了。(我的理解是,原有特征对这个异常对敏感,需要增添对此类异常敏感的特征)视频中举了检测电脑运行异常的例子:机器可能出现CPU利用率很高但网络流量很小的情况,原有的特征可能不能检测出这种异常,这时我们要增加类似x5、x6这样的特征,如下图所示。
Multivariate Gaussian Distribution(Optimal)
下面这两小节都是在介绍多维Gaussian分布,可查阅相关概率书籍。
Multivariate Gaussian Distribution
这里使用电脑异常检测的例子,下图左侧给出了数据点在坐标系中的分布情况,其中横坐标x1表示CPU利用率(CPU load),纵坐标x2表示内存占用情况(memory use)。下图右侧给出了x1、x2的频率直方图。我们取坐标系中绿色叉叉对应的数据点x,按照原来的计算方法来检测其是否异常。按照右侧的频率直方图,我们可以发现p(x1;μ1,σ21)和p(x2;μ2,σ22)都不会取到太小的值,因此最终的p(x)会取到一个不是很小的值,系统会将其认定为正常数据。但观察左侧坐标系,我们发现x1和x2是正相关的,而绿色叉叉的CPU利用率比较小,内存占用比较大,应该是一个异常数据。很显然,原来的异常检测未能正确判断这组数据。
发生上面情况的原因是,x1和x2不是相互独立的。此时,我们就应该使用多维正态分布。对于x∈R,我们不再挨个单独计算p(xi)。而是计算下面的公式(搞了半天没写出Latex公式,只好截图(X_X)):
下面几张图给出了概率密度函数随参数μ和∑的变化情况,足够我们使用。若有兴趣了解更多,请查阅相关概率论教材。
Anomaly Detection Using the Multivariate Gaussian Distribution
给定training set{x(1),x(2),...,x(m)},下图给出计算参数μ和∑的计算公式:
μ=1m∑i=1mx(i)
∑=1m∑i=1m(x(i)?μ)(x(i)?μ)T
使用前面给出的Gaussian分布概率密度函数p(x)来对新数据x进行判断,若p(x)<?,则标记为异常数据。
前面原始模型与多维Gaussian分布模型的区别在于特征的相关性:原始模型中的特征之间是相互独立,其对应于多维Gaussian分布模型中的协方差矩阵∑是一个对角矩阵(即将原始模型的参数放到矩阵中,对角线上是n个特征的方差,其他位置为0);而多维Gaussian分布的协方差矩阵∑是一个对称矩阵(对角线上是n个特征的方差,而非对角线位置表示的是两两特征之间的相互影响)。想了解更多数学原理的话,请查阅概率论教材。
原始模型和多维Gaussian分布模型均可以处理特征不相互独立的问题,差别在于原始模型需要人工去估计两两特征之间的影响,而多维Gaussian分布则自动的量化了两两特征之间的影响。相对应地,前者的计算较简单,后者的计算量增加很多。
当提取到的特征很多,达到了104及其以上时,我们建议使用传统模型,因为这时∑(?1)将会有超大的计算量。多维Gaussian分布模型则要求训练数据量m远大于n(视频说起码要m>10n),否则参数∑可能会是不可逆的。
推荐系统部分笔记会在看完视频后整理上传