Principal Component Analysis(PCA)是最常见的数据降维的方法。根据 Wikipedia 的介绍,它最早是由 Karl Pearson(同时也是卡方检验的发明者) 在1901年提出,到现在已经一百多年了。作为一种降维的方法,PCA可以将原数据进行线性变换,并找出数据中信息含量最大的主要成分,去除信息含量较低的成分,从而减少冗余,降低噪音。通常在异常检测的语境里,噪音(noise)、离群点(outlier)和 异常值(anomaly)是同一件事情的不同表述。所以,PCA既然可以识别噪音,自然也可以检测异常。
PCA的相关概念
我们先简单回顾一下 PCA的相关概念。假设原始数据是一个 的矩阵,这里m表示数据样本的数量,n表示每一条数据样本的特征数目。一般的,我们先要对原始数据做一些预处理:
1. 中心化:将原始数据每一列进行零均值化,即将该列上的每一个数值都减去该列的均值。
2. 归一化:将中心化之后的数据的每一列进行方差归一化,即将该列上的每一个数值都除以该列的标准差。
上面的两步预处理是通常做法。中心化的主要目的是让后面的公式描述更简洁,并不影响特征值分解。归一化是为了让不同变量的方差变化尺度控制在相同的范围内,消除不同量纲的影响,使得它们更有可比性。我们将预处理之后的矩阵表示为 ,则 PCA 的主要步骤如下:
- 计算协方差矩阵
- 求解协方差矩阵的特征值 和特征向量
- 按照特征值从大到小的顺序,将特征向量从左至右排列,将前k个特征向量组成的矩阵表示为
- 将 映射到低维的k维空间( ),则映射之后的数据
为了更清楚的理解步骤4里的“映射”操作,我们可以拿单个数据样本 和特征向量 来举例。根据步骤4中的公式,样本 在特征向量 方向上的坐标为 。 回想一下关于点乘的几何定义,我们有:
这里 为点乘的两个向量的夹角,这里 是长度为1的单位向量,所以 ,刚好为样本 在特征向量 方向上的投影(坐标)。如果把所有数据点的映射用矩阵的形式表示出来,那就是步骤4的公式了。
我们将原始数据映射到低维空间之后,也可以根据数据在低维空间里的坐标来重构原始数据。PCA的其中一种推导方式就是基于重构误差得到的。假设数据样本 映射到 k 维空间的坐标为 , 则基于该 k 维坐标重构的数据为:
上面的重构公式比较直观,即:重构的数据坐标为数据在低维空间每个方向上的坐标乘以该方向上的单位向量之后的求和。如果把所有数据样本的重构用矩阵的形式表示出来,则:
后面我们在描述PCA用于异常检测的时候还会用到这里的重构公式。
PCA用于异常检测
PCA在异常检测方面的做法,大体有两种思路:一种是将数据映射到低维特征空间,然后在特征空间不同维度上查看每个数据点跟其它数据的偏差;另外一种是将数据映射到低维特征空间,然后由低维特征空间重新映射回原空间,尝试用低维特征重构原始数据,看重构误差的大小。两种思路看似不太一样,其实本质上是差不多的。
我们先来讲讲第一种思路。PCA在做特征值分解之后得到的特征向量反应了原始数据方差变化程度的不同方向,特征值为数据在对应方向上的方差大小。所以,最大特征值对应的特征向量为数据方差最大的方向,最小特征值对应的特征向量为数据方差最小的方向。原始数据在不同方向上的方差变化反应了其内在特点。如果单个数据样本跟整体数据样本表现出的特点不太一致,比如在某些方向上跟其它数据样本偏离较大,可能就表示该数据样本是一个异常点。
对于某一个特征向量 ,数据样本 在该方向上的偏离程度 可以用如下的公式计算:
这里的 主要起归一化的作用,这样可以使得不同方向上的偏离程度具有可比性。在计算了数据样本在所有方向上的偏离程度之后,为了给出一个综合的异常得分,最自然的做法是将样本在所有方向上的偏离程度加起来,即:
这个公式只是计算异常得分的一种方式。也有一些算法采取了略微不同的做法,比如,有的只考虑数据在前 k 个特征向量方向上的偏差,或者只考虑后 r 个特征向量方向上的偏差,即:
这里的 和 是人为设定的两个阈值,如果得分大于阈值则判断为异常。
一般而言,前几个特征向量往往直接对应原始数据里的某几个特征,在前几个特征向量方向上偏差比较大的数据样本,往往就是在原始数据中那几个特征上的极值点。而后几个特征向量有些不同,它们通常表示某几个原始特征的线性组合,线性组合之后的方差比较小反应了这几个特征之间的某种关系。在后几个特征方向上偏差比较大的数据样本,表示它在原始数据里对应的那几个特征上出现了与预计不太一致的情况。到底是考虑全部特征方向上的偏差,前几个特征向量上的偏差,还是后几个特征向量上的偏差,在具体使用时可以根据具体数据灵活处理。
前面提到,PCA用于异常检测时候,还有一种思路是基于重构误差的。直观上理解,PCA提取了数据的主要特征,如果一个数据样本不容易被重构出来,表示这个数据样本的特征跟整体数据样本的特征不一致,那么它显然就是一个异常的样本。对于数据样本 , 假设其基于 k 维特征向量重构的样本为 , 则该数据样本的异常得分可以用如下的公式计算:
上面的公式考虑了重构使用的特征向量的个数 k 的影响,将 k 的所有可能做了一个加权求和,得出了一个综合的异常得分。显然,基于重构误差来计算异常得分的公式也不是唯一的,这里只是其中的一种做法。
根据前面一节提到的重构公式,我们在基于低维特征进行数据样本的重构时,舍弃了较小的特征值对应的特征向量方向上的信息。换一句话说,重构误差其实主要来自较小的特征值对应的特征向量方向上的信息。基于这个直观的理解,PCA在异常检测上的两种不同思路都会特别关注较小的特征值对应的特征向量。所以,我们说PCA在做异常检测时候的两种思路本质上是相似的。
算法延伸
PCA 是一种线性的数据降维的方法,为了识别一些更为复杂的异常,最自然的做法是应用 kernel PCA。 就异常检测的使用方式而言,kernel PCA 并无太大差异,这里就不做赘述。
在深度学习大行其道的今天,另外一种备受关注的数据降维的方法是深度学习中的 Autoencoder。它跟PCA的差别主要是非线性和线性的差别。相信很多人看到前面基于PCA的重构误差进行异常检测时,也意识到了 Autoencoder 也可以以类似的方式做异常检测。而 Autoencoder 有很多种不同的类型,比如 Denoising Autoencoder,Variational Autoencoder 等等,后面我们可以用单独的篇幅再来具体讲解如何用它们来做异常检测。
参考文献
1. Veeramachaneni, K., Arnaldo, I., Korrapati, V., Bassias, C., Li, K.: AI^2 : training a big data machine to defend. In: 2016 IEEE 2nd International Conference on Big Data Security on Cloud (BigDataSecurity), IEEE International Conference on High Performance and Smart Computing (HPSC), and IEEE International Conference on Intelligent Data and Security (IDS), pp. 49–54 (2016)
2. Shyu M L, Chen S C, Sarinnapakorn K, et al. A novel anomaly detection scheme based on principal component classifier. ICDM, 2003.