应用高斯分布来解决异常检测问题(一)
(原创文章,转载请注明出处!)
异常检测的样本数据,可能有标签,但通常正常状况的样本很多,异常状况的样本很少,并且出异常的原因通常也不尽相同。所以,可以只针对正常状况的样本建模。
而如果收集到一堆的数据没有标签,则可以对所有的样本数据用一个模型建模,因为通常数据中异常状况的样本很少,对最终模型的影响很小。
通常样本数据是多维的,所在使用高斯分布来建模的时候,可以分别对每一维使用一个一元高斯分,或者是对多维使用使用一个多元高斯分布来描述正常状况的样本数据。
这样得到高斯分布模型对正常状况的样本计算得到的概率值就会比较大,对异常状况的样本计算得到的概率值就会比较小。
可以设定一个阈值,对一个新样本,使用训练得到的多元高斯分布模型计算概率值,如果得到的概率值比阈值小,就认为它是一个异常情况。
一、多个一元高斯分布模型
假设样本数据是三维。第一维的分布函数:f(x1;μ1,σ12) = {1 / [(2π)1/2σ1]} * exp{-(x-μ1)2/(2σ12)}
第二维的分布函数:f(x2;μ2,σ22) = {1 / [(2π)1/2σ2]} * exp{-(x-μ2)2/(2σ22)}
第三维的分布函数:f(x3;μ3,σ32) = {1 / [(2π)1/2σ3]} * exp{-(x-μ3)2/(2σ32)}
它们的联合分布函数:f(x1,x2,x3;μ1,σ12,μ2,σ22,μ3,σ32) = f(x1;μ1,σ12) * f(x2;μ2,σ22) * f(x3;μ3,σ32) (假设三个维度独立)
目标就是要估计出三个维度的分布函数中的参数:μ1,σ12,μ2,σ22,μ3,σ32
通过大数定律,一元高斯分布的总体的期望μ的估计值是样本均值,总体的方差σ2的估计值是样本方差,即:
μ1 = (1/m) * [∑i=1m(x1i)] , μ2 = (1/m) * [∑i=1m(x2i)] , μ3 = (1/m) * [∑i=1m(x3i)]
σ12 = [1/(m-1)] * [∑i=1m(x1i-μ1)2] , σ22 = [1/(m-1)] * [∑i=1m(x2i-μ2)2] , σ32 = [1/(m-1)] * [∑i=1m(x3i-μ3)2]
这样就通过训练计算得到了模型的参数,对新样本,即可通过f(x1,x2,x3;μ1,σ12,μ2,σ22,μ3,σ32)计算得到它的概率,
通过与阈值比较即可判断新样本是否异常。
二、一个多元高斯分布模型
在上面的模型中,假设三个维度特征是独立的,这在很多情况下不符合实际。可以使用多元高斯分布来克服这个问题。
在多元高斯分布中,每个维度上的随机变量也服从高斯分布,各维度之间的关系通过协方差矩阵来描述。
所以,使用多元高斯分布来描述样本数据是,目标就是估计出多元高斯分布密度函数的期望向量和协方差矩阵
还是假设样本数据是三维的,对期望向量的估计如下:
μ = (1/m) * [∑i=1m(xi)] // xi是三维列向量
C = [1/(m)] * [∑i=1m(xi-μ)(xi-μ)T] // x, μ是三维列向量
// 假设 m =3, 即有三个样本
= [1/3] * { (x1-μ)(x1-μ)T + (x2-μ)(x2-μ)T + (x3-μ)(x3-μ)T}
= [1/3] * {
+
+ }
同过以上公式及可计算出模型的参数。
可以看出,以上对多元高斯分布模型的应用,有点类似GDA模型,但不同与GDA,在异常检测中,只对一类数据进行了建模,
即:只需要计算一个高斯分布的参数,且没有关于label的0-1分布。
三、样本数据
上述两个模型都使用了高斯分布来建模,如果样本数据的分布不是高斯分布,那么使用模型来进行异常检测的效果就会不佳。
可以先使用柱状图将样本的数据的各维都plot出来,看柱状图的整体形状是否与一元高斯分布的钟型图相似,如果形状差别比较大,说明样本数据不是高斯分布。
可以通过对原始的数据计算log、sqrt等方法,将柱状图的整体形状往一元高斯分布的钟型图形状调整。
另外,模型一没有考虑特征间的相关性,所以有时候可能需要使用已有特征的组合,构造新的特征,以描述原始特征间的关系。