【Machine Learning】笔记:anomaly detection

来源:互联网 发布:vision是什么软件 编辑:程序博客网 时间:2024/05/22 23:31

本文是 Coursera 上 Andrew Ng 的课程 machine learning 第9周的内容之一。

异常检测算法初步

异常检测,虽然主要应用于非监督学习问题,但又有些像监督学习问题。

建立一个模型 p(x),设定阈值 ϵ,当 p(xtest)<ϵ 时,就认为 xtest 是个异常点。

正态分布建立异常检测算法

主要思想是建立一个模型 p(x),检测哪些 x 出现的概率比较高,哪些比较低。
训练集 x(1),x(2),,x(m),其中 x(i)n,并且假设 xjN(μj,σ2j) 即在每个维度都服从独立的正态分布,但在实际中,就算特征独立的假设不成立,算法的效果也不错,
模型可以写成这样:p(x)=j=1np(xj;μj,σ2j),估计 p(x) 又叫密度估计(density estimation)。
所以算法可以这样来做:假设每个特征都服从正态分布,通过样本来估计出每个特征的分布参数,然后计算出新样本的概率密度,来判断它是否为异常点。

评价算法

能否用一个实数来评价算法的性能?这样就能直接看出算法的好坏了。
设想有一些点,已经被标注了是否为异常点。先将一些非异常点(如果混入了少数异常点也不影响)作为 training set,再划分出里面有标注了异常点的 cross validation set 和 test set,然后用这两个集合中的数据进行验证,用预测结果和标签一致的比例来评价算法,这和监督学习很像。
Cross validatin set 中的数据可以用来选择阈值 ϵ.
同样,因为异常点可能很稀疏,依然可以用 F1 值等方法来评价。

异常检测算法 vs. 监督学习

既然有了标注的数据,为什么不直接用监督学习的分类方法,比如 logistic regression 或神经网络呢?什么时候适用异常值检测,什么时候适用监督学习呢?
用异常检测算法的情形:当正样本数很少,而负样本数很多时;当有许多种类的异常时;未来的异常可能和已经出现过的异常都不相同时。而当正负样本都有许多时,就适合用监督学习算法。

选择特征

对该算法影响最大的是,选用什么样的特征。在这点上,有什么好办法呢?
先可以用直方图来画出某个特征,如 hist 等命令,确保它看起来像正态分布,但即使它不是真正的正态分布,算法也可以运行得很好。但如果画出来很偏,或完全不像正态分布,那就可以先对数据进行变换,使得它看起来像正态分布,如果变换了,效果会更好,但不做也可以。
如果在一个特征上,异常点显得比较正常,那就可以人工去分析它问题到底在哪里,想办法构造出新的特征来把它区分出去。这也是误差分析的流程。

多元正态分布

可能会出现这样的情况:数据点的每一个特征都处于正常范围内,但它明显是个异常点。比如有两个特征,基本成比例,且都变动较大的范围,有某个数据点两个特征的值都处于该变动范围内,但不成比例,因此是异常点,但我们之前的方法无法识别出来。
多元正态分布的表达式是:

p(x;μ,σ)=1(2π)n2|Σ|12exp(12(xμ)TΣ1(xμ))

其中的参数 μn 是均值向量,Σn×n 是协方差矩阵。它们可以这样估计:

μ=1mi=1mx(i)Σ=1mi=1m(x(i)μ)(x(i)μ)T

相比之下,原来的异常检测算法需要自己添加一些如特征相除之类的新特征,才能捕捉不同特征之间的联系,而多元正态分布下的异常检测算法,可以自动捕捉这样的相关性,但计算复杂度会更高,当特征数量很大的时候,多元正态分布的估计协方差矩阵及其求逆非常耗费时间,不建议使用。另外,当样本数量小于特征数量时,多元正态分布的参数无法估计,因此也就无法使用这个模型,而原始的异常检测算法可以很好地工作。
老师推荐,只有在样本数大于10倍的特征数时,才使用多元正态分布。

阅读全文
0 0
原创粉丝点击