异常检测: 应用多元高斯分布进行异常检测

多元高斯(正态)分布

多元高斯分布有两个参数u和Σ,u是一个n维向量,Σ协方差矩阵是一个n*n维矩阵。改变u与Σ的值可以得到不同的高斯分布。

参数估计(参数拟合),估计u和Σ的公式如上图所示,u为平均值,Σ为协方差矩阵

使用多元高斯分布来进行异常检测

首先用我我们的训练集来拟合参数u和Σ,从而拟合模型p(x)

拿到一个新的样本,使用p(x)的计算公式计算出p(x)的值,如果p(x)<ε就将它标记为一个异常点

当我们对上图中那个绿色的点进行异常检测时,这些红色的点服从多元高斯正态分布(x1与x2正相关),算法会将绿色的判断为异常点,因为它远离这个高斯分布中心点。

多元高斯分布模型与原来的模型之间的关系(原来的模型是多元高斯分布的一个特例)

原来的模型p(x)=p(x1)*p(x2)*p(x3).....*p(xn)这个模型那就什么样的多元高斯分布呢?

上面图中三个多元高斯分布的图型,它们的等高线位于x1或者x2轴向线平行,原来的模型即那就于这样的高斯分布,即没有x1,x2的关系约束,即Σ在非对角线上的值为0,只在对角线上有值。

所以原来的模型p(x)对应于下面的多元高斯分布,这个多元高斯分布有个约束条件,即Σ只在对角线上有值(分别为σ1222.....σn2),在非对角线上的值都为0,不能给不同特征之间的相关性建模。

该用哪个模型?

original model可能使用得更频繁,多元高斯模型没有那么常用,但是它能捕捉到不同特征之间的相关性(正相关或者负相关)

在original model里面,如果你想捕获不同特征组合之间的异常(如捕获CPU load与memory use之间组合的不正常情况),我们需要建立一个新的feature=这两个特征之间的组合,如x3=CPU load/memory use.这样虽然当x1是正常的,x2是正常的,但是如果x1/x2不正常,我们就可以捕获到这种异常情况。而多元高斯模型可以自动地捕获不同特征变量之间的相关性。

original model计算比较快,运算量更小,适用于特征量非常多的情况,即n值很大的情况;而当n很大时,多元高斯模型要计算Σ的逆矩阵(为n*n),这个计算量非常大,所以多元高斯模型不适合于n值很大的情况。

对于original model即使m很小,即训练集很小,也可以运行的也可以的;而对于多元高斯模型,在数学上必须满足m>n,不然Σ就是不可逆的,但是在实际中,我们使用时只有m远大于n时,即m>=10n(合理的经验法则)时才使用多元高斯模型。因为Σ是一个n*n的矩阵,有n*n/2个参数(Σ为对称矩阵)需要计算,如果我们的训练样本不够大的话,就不能很好的评估这些参数。

实际中,original model更常用,如果我们想捕捉变量之间的相关性的话就另外创建一个新的feature来捕捉特定的不正常值的组合。

在训练集很大,n不大的情况下,多元高斯模型可以考虑,可以帮你省去创建新的feature的时间。

当拟合多元高斯模型时,如果发现Σ不可逆时(奇异的),会有两种情况导致,一种情况是它没有满足m>n的条件,第二种情况是有冗余的特征变量(如x1=x2,x3=x4+x5(x3是冗余的,没有提供额外的信息)),即线性相关的特征变量。所以当在实际中遇到Σ不可逆时,检查m是否比n大得多,然后检查是否有冗余的特征变量(如删掉x1,x3),这样就能很好地运行了,但是我们遇到这些问题的可能性会比较低,我们可以直接应用多元高斯模型,不需要担心Σ不可逆的问题。

总结

1>使用多元高斯模型可以使我们的算法自动捕获不同特征变量之间的相关性(正相关或者负相关),在组合不正常时将其标识为异常。

时间: 08-23

异常检测: 应用多元高斯分布进行异常检测的相关文章

PLSQL_Oracle Exception异常分类、异常抛出、异常处理、异常传播(概念)

2014-06-03 BaoXinjian 一.摘要 在PLSQL程序开发过程中,很重要的部分就是对程序异常的监控和处理,包括如何触发异常,何时进行处理,如何进行处理,是否将程式中的所有异常集中在一起,通过公共异常处理的procedure或function,如果没有完善的程式处理机制,很难说该程式是一只健壮的程式,当程式遇到很多类型或者量很多资料时,系统若没有异常处理必然会导致程式的出错 当预判到了某些异常,需要对预判到的异常进行合适相应的处理,是否抛出异常还是忽略还是其他 当然程式没有预判到或

JAVA之旅(十)——异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别

JAVA之旅(十)--异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别 不知不觉,JAVA之旅这个系列已经更新到第十篇了,感觉如梦如幻,时间过得很快,转眼一个月就这样过去了,我们不多说,继续我们的JAVA之旅 一.异常的概述 异常算是程序中一个比较重要的环节了,我们首先来看一下异常的体系,我们举一个小例子,定义一个除法方法 //公共的 类 类名 public class HelloJJAVA { // 公共的 静态 无返回值 main方

多元高斯分布

直接给出多元高斯分布和单元高斯分布的概率密度函数: μ是一个D维均值向量,Σ是一个D×D的协方差矩阵,我们只考虑正定矩阵(所有特征值都是正数),即|Σ|>0:多元高斯分布和单态量高斯分布尽管在形式上不同,但实际上单态高斯是维数为1的多元高斯分布:当D=1时,Σ是一个1×1的矩阵(即退化为一个数),|Σ|1/2=σ(即标准差),Σ-1=σ-2,(x-μ)T=(x-μ),我们能够把这两个公式很好的对应起来. 在协方差矩阵Σ中,(i,j)元素是X向量中第i个和第j个元素的协方差: 我们这里考虑的协方差

【ThinkingInJava】24、捕获一个异常之后抛出另外一个异常,并且希望吧原始的信息保存下来

/** * 书本:<Thinking In Java> * 功能:捕获一个异常之后抛出另外一个异常,并且希望吧原始的信息保存下来,这个被称为异常链 * 文件:DynamicFields.java * 时间:2015年4月9日16:24:44 * 作者:cutter_point */ package Lesson12_error_handling_with_exceptions; import static net.mindview.util.Print.*; class DynamicFiel

python——异常except语句用法与引发异常

except: #捕获所有异常 except: <异常名>: #捕获指定异常 except:<异常名1,异常名2):捕获异常1或者异常2 except:<异常名>,<数据>:捕获指定异常及其附加的数据 except:<异常名1,异常名2>:<数据>:捕获异常名1或者异常名2,及附加的数据库 常用异常名: 异常名    描述 AttributeError 调用不存在的方法引发的异常 EOFError     遇到文件末尾引发的异常 Impor

java的异常和java web容器的异常

一.java的异常,只要catch住异常了,程序就不会挂,依然会执行catch之后的语句 Java程序发生异常就挂了吗? 为了验证程序不会挂,我写了个例子给大家看看. 测试代码: import java.io.File; import java.io.IOException; /** * Java程序发生异常就挂了吗? * */ publicclass TestException {         publicstaticvoid main(String[] args) {          

“全栈2019”Java异常第一章:什么是异常?

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异常第一章:什么是异常? 下一章 "全栈2019"Java异常第二章:如何处理异常? 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组".

异常~异常用的大多是处理异常,我一般是写自定义异常

自定义异常类: java提供的异常类,不够我们使用,需要自己定义一些异常类格式: public class XXXExcepiton extends Exception | RuntimeException{ 添加一个空参数的构造方法 添加一个带异常信息的构造方法 } 注意: 1.自定义异常类一般都是以Exception结尾,说明该类是一个异常类 2.自定义异常类,必须的继承Exception或者RuntimeException 继承Exception:那么自定义的异常类就是一个编译期异常,如果

异常检测(Anomaly detection): 高斯分布(正态分布)

高斯分布 高斯分布也称为正态分布,μ为平均值,它描述了正态分布概率曲线的中心点.σ为标准差,σ2为方差,σ描述了曲线的宽度.在中心点附近概率密度大,远离中心点概率密度小. 高斯分布图 概率曲线下方的面积为1(积分为1),概率和为1.μ为中心点,σ为宽度.σ小时图形更尖更高,σ大时图形更矮更宽,因为面积不变为1,μ变化时表示中心点的转移. 参数估计 假设我们猜测每个样本xi服从某种分布(如正态分布),我不知道这些参数(μ,σ2)的值是多少. 参数估计=>给定数据集,希望能估算出(μ,σ2)的值 如