0%

机器学习日记(13) 异常检测系统

  异常检测算法是从大量正常数据中找出那些不太一样的数据点,常用于设备故障检测、网络攻击检测、金融欺诈检测等等。异常检测的核心思路是:先学习正常数据的分布规律,再判断一个新样本是否偏离这个规律太远。

  这类方法会估计一个样本出现的概率,如果 $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 形成的簇不是靠“中心点”,而是靠“密度连通”。