传统异常检测算法介绍及代码实现

作者:da吃一鲸8862024.02.18 05:19浏览量:5

简介:异常检测是数据处理和分析中常见的问题,本文将介绍几种常见的传统异常检测算法,并给出相应的代码实现。

异常检测是数据处理和分析中的一个重要环节,目的是从大量数据中发现那些与常规数据模式明显不符的观察值。异常值通常是由数据采集过程中的错误、数据质量问题或实际业务逻辑中的异常情况引起的。传统异常检测算法主要包括基于统计的方法、基于距离的方法和基于密度的算法。下面我们将介绍这几种方法,并通过代码示例展示它们的实现过程。

一、基于统计的异常检测算法

基于统计的异常检测算法通过比较数据点与整个数据集的统计特性来识别异常值。常见的统计方法包括使用z-score、IQR(四分位距)等。

  1. Z-Score方法:该方法通过计算每个数据点与数据集均值之间的标准偏差来评估异常程度。一个点的z-score是它的原始分数与平均分的差值除以其标准偏差。如果z-score绝对值超过一定阈值(如3),则认为该点为异常值。
  1. import numpy as np
  2. def z_score_outlier_removal(data):
  3. mean = np.mean(data)
  4. std_dev = np.std(data)
  5. z_scores = (data - mean) / std_dev
  6. outliers = z_scores[np.abs(z_scores) > 3]
  7. return outliers
  1. IQR方法:IQR是第三四分位数与第一四分位数的差值,用于确定异常值。如果一个数据点低于Q1 - 1.5 IQR或高于Q3 + 1.5 IQR,则认为该点为异常值。
  1. import numpy as np
  2. def iqr_outlier_removal(data):
  3. q1 = np.percentile(data, 25)
  4. q3 = np.percentile(data, 75)
  5. iqr = q3 - q1
  6. lower_bound = q1 - 1.5 * iqr
  7. upper_bound = q3 + 1.5 * iqr
  8. outliers = data[data < lower_bound] + data[data > upper_bound]
  9. return outliers

二、基于距离的异常检测算法

基于距离的算法通过比较数据点与其邻居之间的距离来识别异常值。常见的基于距离的方法包括DBO(基于距离的异常值)和LOF(局部异常因子)。

  1. DBO方法:该方法通过计算每个数据点与其邻居之间的平均距离来识别异常值。如果一个点的平均距离超过一定阈值,则认为该点为异常值。下面是一个简单的DBO实现示例:
  1. import numpy as np
  2. from scipy.spatial import distance
  3. def dbo_outlier_removal(data, threshold=2.0):
  4. distances = distance.cdist(data, data, 'euclidean') # 计算欧几里得距离矩阵
  5. avg_distances = np.mean(distances, axis=1) # 计算每个点到其邻居的平均距离
  6. outliers = avg_distances[avg_distances / np.mean(avg_distances) > threshold] # 找出超过阈值的点作为异常值
  7. return outliers
  1. LOF方法:LOF方法通过计算每个点的局部可达密度(Lrd)和局部可达距离(Lrd)来识别异常值。Lrd越小,表示该点周围的密度越低,即更可能是异常值。下面是一个简单的LOF实现示例:

由于LOF方法的实现较为复杂,这里仅给出核心思路:对于每个点,找到其k近邻,并计算这些邻居之间的平均距离和密度。然后根据Lrd和Lrd的值,判断该点是否为异常值。