异常检测算法是从大量正常数据中找出那些不太一样的数据点,常用于设备故障检测、网络攻击检测、金融欺诈检测等等。异常检测的核心思路是:先学习正常数据的分布规律,再判断一个新样本是否偏离这个规律太远。
这类方法会估计一个样本出现的概率,如果 $p(x)$ 很小,则说明这个样本在数据集中很少出现,极有可能是异常。所以判断规则可以写成
$$
p(x) < \varepsilon
$$
其中 $\varepsilon$ 是人为设置的阈值。
高斯分布异常检测
假设某个特征服从高斯分布:
$$
x \sim N(\mu, \sigma^2)
$$
其中 $\mu$ 表示均值,$\sigma^2$ 表示方差。高斯分布的概率密度函数为:
$$
p(x)=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu)^2}{2\sigma^2}}
$$
如果 $x$ 离均值 $\mu$ 很远,那么 $p(x)$ 就会很小,说明这个样本出现的可能性很低,因此可能是异常点。
在实际问题中,一个样本通常不只有一个特征。假设每个特征之间相互独立,那么整个样本的概率就可以写成:
$$
p(x)=\prod_{j=1}^{n}p(x_j)
$$
如果某个样本整体概率很低,就说明这个样本在多个特征组合下都不太正常。
对于每一个特征,我们需要计算它的均值和方差。其计算方法如下
$$
\mu_j = \frac{1}{m}\sum_{i=1}^{m}x_j^{(i)}
$$
$$
\sigma_j^2 = \frac{1}{m}\sum_{i=1}^{m}\left(x_j^{(i)}-\mu_j\right)^2
$$
其中:
- $m$:训练样本数量
- $x_j^{(i)}$:第 $i$ 个样本的第 $j$ 个特征
- $\mu_j$:第 $j$ 个特征的均值
- $\sigma_j^2$:第 $j$ 个特征的方差
计算出每个特征的均值和方差后,就可以得到每个特征的概率分布。
DBSCAN
DBSCAN 是一种基于密度的聚类算法。可以理解为:如果一片区域里的样本点足够密集,就把它们归为一类;如果某个点周围太稀疏,就把它当成噪声点或异常点。和 K-Means 不同的是,DBSCAN 不需要提前指定聚类数量,而且可以发现不规则形状的簇。
假设有一堆数据点,DBSCAN 会查看每个点周围一定范围内有多少个邻近点,这个范围使用邻域半径 $\varepsilon$ 表示。邻近点数量的最低要求使用参数:$MinPts$ 表示。
$\varepsilon$表示一个点周围多大范围内算作它的邻居。
比如:
$$
\varepsilon = 0.5
$$
就表示距离这个点不超过 $0.5$ 的点,都算作它的邻居。
$MinPts$表示在 $\varepsilon$ 范围内,至少要有多少个点,才能认为这个区域是密集的。
比如:
$$
MinPts = 5
$$
表示一个点周围半径为 $\varepsilon$ 的范围内,至少有 $5$ 个点,这个点才可能成为核心点。
DBSCAN 会把样本点分为三类:
1、核心点:如果某个点在半径 $\varepsilon$ 内,邻居数量不少于 $MinPts$,那么这个点就是核心点。
2、边界点:如果某个点本身邻居数量不够,不能成为核心点,但是它落在某个核心点的 $\varepsilon$ 邻域内,那么它就是边界点。
3、噪声点:如果某个点既不是核心点,也不是边界点,那么它就是噪声点。
DBSCAN 的过程可以理解为“从核心点向外扩展”。步骤如下:
1. 随机选择一个还没有访问过的点。
2. 找出它半径 $\varepsilon$ 内的所有邻居。
3. 如果邻居数量小于 $MinPts$,暂时把它标记为噪声点。
4. 如果邻居数量不少于 $MinPts$,说明它是核心点,于是创建一个新簇。
5. 从这个核心点开始,把它邻域内的点加入这个簇。
6. 如果邻域中的某些点也是核心点,就继续从这些点向外扩展。
7. 直到不能继续扩展为止。
8. 再选择下一个未访问点,重复上面的过程。
所以 DBSCAN 形成的簇不是靠“中心点”,而是靠“密度连通”。