异常检测的方法整理

  1. 基本思想都是利用一个算法给出某个点的离群点得分,根据阈值找到离群点
  2. 分类
    1. 基于方法的分类
      1. 基于模型的技术
        1. 比如我们的数据是一个高斯分布,那么一个对象不能很好地拟合这个分布,就会被认为是一个异常点
      2. 基于邻近度的技术
        1. 通常在对象之间定义邻近性度量,并且许多异常检测方法都基于邻近度。
          1. 异常对象是远离大部分其他对象的点。
      3. 基于密度的技术
        1. 对象的密度估计可以相对直接地计算,特别是当对象之间存在邻近度度量时,低密度区域中的对象相对远离近邻。
        2. 比如温度10,20,30,40,突然一个操作选择了100,那么从密度来看可能就会被检测出来
    2. 基于人参与的程度
      1. 监督的异常检测
        1. 需要异常类和正常类的训练集
          1. 可能要采取crowdsource或者自己标注了,人力成本比较高
        2. 但是会更加准确
      2. 非监督的异常检测
        1. 许多实际情况下,没有提供类标号,那么我们要自动分配类标记
          1. 典型的,聚类
      3. 半监督的异常检测
        1. 有时,训练数据包含被标记的正常数据,但是没有关于异常对象的信息。
        2. 目标是使用有标记的正常对象的信息,对于给定的对象集合,发现异常标号或得分。这种情况下,被评分对象集中许多相关的离群点的出现并不影响离群点的评估。然而很多实际情况下,可能很难发现代表正常对象的小集合。
  3. 几种主要类型的算法
    1. 统计方法
      1. 基本统计方法
        1. 这是基于模型的方法,也就是为数据集建立一些分布模型(如正太分布),然后计算某个点在该分布下的概率。如果概率小于阈值,显然这个点有更大概率是离群点
      2. 混合模型方法(比如Gaussian Mixture Model,这个算法很变态)
        1. 就是我们的分布可能不是单一的,可能是空间内的多个高斯分布,我们可以用EM算法来对模型进行最大似然估计,找到最佳分布。
      3. 优缺点
        1. 优点
          1. 有坚实的统计学基础
          2. 对单维数据,非常好用,是可以考虑的,对一些重要的维度,比如温度单独考察
        2. 缺点
          1. 高维数据不太友好,性能比较差
          2. 需要充分的数据和所用的检验类型的知识
    2. 基于近邻度的方法
      1. 尽管存在多种变形,但是基本概念比较简单
        1. 比如我们现在用的算法,不过我觉得对所有cluster,半径r都是一定的,这个不太科学
        2. K近邻算法,比如取前k个邻居的平均距离作为离散点得分,然后找到离散点得分比较低的点
      2. 优缺点
        1. 优点
          1. 基于距离的离群点检测方案比较简单,实现起来简单
        2. 缺点
          1. O(m^2)的复杂度,对大型数据集来说代价比较高
          2. 对参数选择敏感
          3. 不能处理不同密度区域的数据集,因为选择了全局阈值
    3. 基于密度的离群点检测
      1. 一个对象的离群点得分是该对象周围密度的逆
        1. 基于绝对密度
          1. 我们可以定义为k个邻居的平均距离的倒数
          2. 另一种是DBSCAN聚类算法的密度定义:一个对象周围的密度等于该对象指定距离d内对象的个数
        2. 基于相对密度
          1. 基于SNN密度的聚类算法
          2. 用点x的密度与它最近邻y的平均密度之比作为相对密度
            1. LOF技术(Local Outlier Factor)技术
      2. 优缺点
        1. 优点
          1. 基于相对密度的离群点检测给出了对象是离群点程度的定量度量
          2. 即使数据具有不同的密度区域也能很好地工作
        2. 缺点
          1. 一样有O(m^2)的复杂度,对低维数据,可以降低到O(mlogm)
          2. 参数选择也是困难的
            1. 标准LOF算法通过观察不同的k值,去最大离群点得分来处理该问题,但仍然需要选择这些值的上下界。
    4. 基于聚类的技术
      1. 常用的方法是丢弃远离其他簇的小簇
        1. 不再将离群点得分附加到对象上,而是一个簇上
      2. 更加系统的方法是
        1. 首先聚类所有对象,然后评估对象属于簇的程度。
          1. 对于基于原型的聚类(K-means)
            1. 可以用对象到簇中心的距离度量来计算对象属于簇的程度
              1. 基于近邻度
          2. 更一般的
            1. 对于基于目标函数的聚类技术,可以使用该目标函数来评估对象输入任意簇的程度
            2. 特殊情况下,如果删除一个簇可以让该目标函数显著改进,我们可以将对象分类维离群点
              1. 例如对K-means,删除异常点可以显著改进误差平方和SSE
          3. 总而言之,聚类创建数据的模型,而异常扭曲该模型
        2. 具体的说
          1. 对于基于密度的聚类,一个对象不强属于任何簇,如果其密度太低
          2. 对于基于连接度的聚类,一个对象不属于任何簇,如果不是强连接的。
      3. 集中讨论一下基于原型的算法K-means
        1. 离群点得分的两种可行方法
          1. 点到它最近质心的距离
          2. 点到它最近质心的相对距离
            1. 可以是点到质心的距离与簇中所有点到质心的距离的中位数之比
            2. 在用于调整紧致簇和松散簇密度上的较大差别
        2. 离群点对初始聚类的影响
          1. 由于离群点影响了聚类,存在一个问题,结果是否有效?
            1. 可以先聚类,然后删除我们挑出来的离群点,然后再次聚类
              1. 尽管不能保证这种方法产生最优结果,但是该方法容易使用
            2. 更复杂的方法
              1. 取一组不能很好地拟合任何簇的特殊对象,K-means迭代过程中,当簇变化的时候,我们测试这些潜在离群点,看是不是能够移出这个集合。
              2. 这个比较复杂,了解一下就好了
        3. K的选取
          1. K-means不能自动选择簇的个数,这是一个比较大的问题,因为对象是否被认为是离群点可能依赖于k的取值。
          2. 这个问题没有很简单的答案
            1. 一种策略是对不同的簇个数重复分析
            2. 或者找出大量小簇
              1. 如果一个簇在簇又小又多的时候也是离群点,那它基本一定是离群点
              2. 异常点簇会逃避这个检测
      4. 优缺点
        1. 优点
          1. K均值算法的时间是O(m),很快,而且可能高度有效
          2. 簇的定义是离群点的补集,所以可能同时可以发现簇和离群点
        2. 缺点
          1. 产生的离群点集和它们的得分可能非常依赖所用的簇的个数和数据中离群点的存在性
            1. 比如离群点的存在可能导致簇被扭曲
          2. 所以应当小心选择聚类算法










你可能感兴趣的:(大数据)