KPI异常检测【三】- 机器学习算法

2023-05-16

目录

1、相关概念

1.1 异常类型

1.2 检测方法

2、点异常检测算法

2.1 基于统计

2.2 基于相似度  2.2.1 基于距离   2.2.2 基于密度   2.2.3 基于聚类   2.2.4 基于树

2.3 基于谱(spectral)

3、上下文异常检测算法

3.1 直接与间接

3.2 上下文异常(时序、图)

3.3 单变量与多变量

4、时序特征构造


1、相关概念

1.1 异常类型

异常点是指数据中和其它点不一样的点,异常检测就是要找到这些点。通常有以下这些不同类型的异常:

  1. 点异常(Point Anomalies):单个点和其它数据显著的不同。
  2. 上下文异常 (Contextual Anomalies):数据在所在的上下文环境中是个异常。
  3. 集合异常(Collective Anomalies):指一组数据点和其它的数据有显著的不同,这一组数据的集合构成异常。

1.2 检测方法

(1)标记(labels):

  无监督:无标注,假设数据中正常数据比异常数据多很多。常用方法分为基于统计分布、基于距离、基于密度、基于距离、基于聚类和基于树的五类方法。
  半监督:被标注的全是正常数据。常用方法包括one-class SVM、AutoEncoder、GMM等。
  有监督:数据标注是个问题,并且处理时需要注意类别不均衡现象,不适用于检测新类别。常用方法包括LR、SVM、RF、NN等。

 样本类型困难
有监督平衡样本极度不平衡时,训练难;人工标记难
半监督极度平衡可能无异常样本
无监督无标签有强假设关系,检测存在偏差

(2)直接检测(点异常)与间接检测(非点异常)

2、点异常检测算法

2.1 基于统计

需要假设数据服从某种分布,然后利用数据去进行参数估计。

方法主要三种,简单的比如有3σ准则、箱型图、Grubbs检验等。复杂点的比如有时间序列建模(移动平均、指数平滑、ARMA、ARIMA)。还有混合方法,假设正常数据和异常数据来自不同的高斯分布,然后用Grubbs检验;或者仅对正常数据进行混合高斯建模或者泊松建模等等。

(1)N-sigma
n-sigma准则基于目标分布是正态或近似正态分布。一般地,选取n=3。根据正态分布的概率密度公式可以算出,样本取值几乎全部(99.7%)集中在 区间内,其中,

超出这个范围的可能性仅占不到0.3%,可以认为是小概率事件。因此,检测的方法也比较简单,如下:

  • 检测突增异常:异常区间为  ;
  • 检测突降异常:异常区间为  ;
  • 检测双向(突增或突降)异常:  或, 如下图所示;

(2)boxplot(单变量)

为了降低异常点的影响,boxplot准则被提出。boxplot(箱线图)是一种用作显示一组数据分散情况的统计图,经常用于异常检测。BoxPlot的核心在于计算一组数据的中位数、两个四分位数、上限和下限,基于这些统计值画出箱线图。

记 Q1、Q3分别表示一组数据的下四分位数和上四分位数,则

\begin{matrix} Q1=np.percentile(data, 25) \\ Q3=np.percentile(data, 75)\\ IQR=Q3-Q1 \\ up_bound=Q3+1.5IQR\\ low_bound=Q1-1.5IQR \end{matrix}

根据上面的统计值就可以画出下面的图,超过上限的点或这个低于下限的点都可以认为是异常点。

(3)卡方检验

经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量:

(4)Grubbs检验(多变量)参见:Grubbs Test

(5)其他方法参见:几种常见的离群点检验方法

优点:方法简单,适合低维数据、鲁棒性较好,速度快
缺点:对假设依赖比较严重,效果不好

2.2 基于相似度

2.2.1 基于距离

这种方法认为异常点距离正常点比较远,因此可以对于每一个数据点,计算它的K-近邻距离(或平均距离),并将距离与阈值进行比较。若大于阈值,则认为是异常点。或者是将全部样本的K-近邻距离排序,取前n个最大的作为异常点。计算距离时一般使用欧式距离,也可以使用角度距离。

KNN:基于假设正常点的周围存在很多个近邻点,而异常点距离周围点的距离都很远。

优点:无分布假设
缺点:不适合高维数据
   只能找出异常点,无法找出异常簇
   每一次计算近邻距离都需要遍历整个数据集,不适合大数据及在线应用
   参数K和阈值需要人工调参
   当正常点较少、异常点较多时,该方法不好使
   当使用欧式距离时,即默认是假设数据是球状分布,因此在边界处不容易识别异常
   仅可以找出全局异常点,无法找到局部异常点

2.2.2 基于密度

 基于距离的方法中,阈值是一个固定值,属于全局性方法。但是有的数据集数据分布不均匀,有的地方比较稠密,有的地方比较稀疏,这就可能导致阈值难以确定(稠密的地方和稀疏的地方最好不用同一阈值)。我们需要根据样本点的局部密度信息去判断异常情况。基于密度的方法主要有LOF、COF、ODIN、MDEF、INFLO、LoOP、LOCI、aLOCI等。

LOFlocal outlier factor):局部离群因子,基于假设正常点周围的密度类似于其近邻的周围的密度,而异常点周围的密度与其近邻周围的密度明显不同。

LOF是一个比值,分子是K个近邻的平均局部可达密度,分母是该数据点的局部可达密度。可达密度是一个比值,分子是K-近邻的个数,分母是K-近邻可达距离之和。上式表示点p的邻域点Nk(p)的局部可达密度与点p的局部可达密度之比的平均数。

  • local outlier factor越接近1,说明p的其邻域点密度差不多,p可能和邻域同属一簇;
  • local outlier factor越小于1,说明p的密度高于其邻域点密度,p为密集点;
  • local outlier factor越大于1,说明p的密度小于其邻域点密度,p越可能是异常点。

LOF离群因子检测算法及python3实现

因为LOF对密度的是通过点的第k邻域来计算,而不是全局计算,因此得名为“局部”异常因子,这样,对于图1的两种数据集C1和C2,LOF完全可以正确处理,而不会因为数据密度分散情况不同而错误的将正常点判定为异常点。

实现参见:https://www.cnblogs.com/bonelee/p/9848019.html

优点:可以找出分布不均匀的数据中局部异常的数据
      可以给出数据的异常得分,得分越高越可能异常,不是二分类
缺点: 计算量大
           不适合高维数据
           由于需要遍历数据计算距离,因此计算复杂度也很高,不适合在线应用
           只能找到异常点,无法找出异常簇
           需要人工调参

2.2.3 基于聚类

假设一:不属于任何聚类的点是异常点,主要方法包括DBSCAN、SNN clustering、FindOut algorithm、WaveCluster Algorithm。
缺点:不能发现异常簇

假设二:距离最近的聚类结果较远的点是异常点,主要方法包括K-Means、Self-Organizing Maps(SOM)、GMM。
首先进行聚类,然后计算样例与其所属聚类中心的距离,计算其所属聚类的类内平均距离,用两者的比值衡量异常程度。
缺点:不能发现异常簇

假设三:稀疏聚类和较小的聚类里的点都是异常点,主要方法包括CBLOF、LDCOF、CMGOS等。
首先进行聚类,然后启发式地将聚类簇分成大簇和小簇。如果某一样例属于大簇,则利用该样例和其所属大簇计算异常得分,如果某一样例属于小簇,则利用该样例和距离其最近的大簇计算异常得分。三种算法的区别在于计算异常得分的方式不同,具体细节还未看。
优点:考虑到了数据全局分布和局部分布的差异,可以发现异常簇

具体实现参见:https://www.cnblogs.com/bonelee/p/7776565.html

优点:聚类参数难界定,结果受初始参数影响大
           测试阶段会很快,以内只需要和有限个簇比较
           有些聚类算法(k-means)可以在线应用(准实时)
缺点:异常检测效果很大程度上依赖于聚类效果,但是聚类算法主要目的是聚类,并不是为了异常检测
           大数据聚类计算开销比较大,可能是个瓶颈

2.2.4 基于树

此类方法的思想是基于划分子空间寻找异常点,异常点所在树深度小于正常点。,不同的方法区别主要在三个地方:特征的选取、分割点的选取和分类空间打标签的方案。此类方法不受球形邻近的限制,可以划分任意形状的异常点。此类方法主要包括iForest、SCiForest、RRCF。

iForest:只适合检测全局异常点(Robust random cut forest based anomaly detection on streams[C]// International),不适合检测局部异常点,因此有人做了改进, 论文为--Improving iForest with Relative Mass.

正常点所在树的深度更深。

SCiForest:传统iForest方法在选择特征是随机选取的,SCiForest在选择特征时利用了方差;传统iForest选择分割点后形成的分割超平面是平行于坐标轴的,SCiForest可以生成任意角度的分割超平面。

RRCF:可以动态增删树种的节点,适用于流数据异常检测。--Conference on International Conference on Machine Learning-volume. JMLR.org, 2016.

上图,x是否导致模型变化的程度

优点:分布式计算,非距离计算速度快
           每棵树都是独立构建,适合分布式计算
           可以分割任意形状的数据集,不受限于球形近邻
           测试时速度很快,适合在线处理
缺点:解决全局异常
           只适用于异常点较少的情况
           高维数据特征随机影响结果,因为高维数据会有很多无关特征

2.3 基于谱(spectral)

残差检测:重构误差(PCA、Autoencoder、VAE),谱残差(SR)-频域变换

3、上下文异常检测算法

3.1 直接与间接

直接检测:针对点异常,算法直接定位“离群”点
间接检测:先转化成点异常问题(如上下文或集合异常),再基于已有的点异常检测算法进行求解

3.2 上下文异常(时序、图)

1) 图或子图特征(顶点、边、出度、入度等)做变换,转化成点异常问题

Graph based anomaly detection and description: a survey[J]. Data Mining & Knowledge Discovery, 2015

2)时序数据异常检测

自相关和非自相关:时序独立VS 时序相关(点异常和上下文异常)

  • 时序预测:ARIMA, MA,指数光滑,回归模型(时序连续点)、HMM (时序离散事件)
  • 重构:PCA、Autoencoder 残差检测
  • 集合异常:时序(转化成点异常问题)

3.3 单变量与多变量

单变量(上下文异常):a)时序预测+点异常检测,b)划窗变换+点异常检测

多变量:

  • 深度学习:LSTM预测算法
  • 多变量时序预测1:https://github.com/Seanny123/da-rnn
  • 多变量时序预测2:https://github.com/chickenbestlover/RNN-Time-series-Anomaly-Detection

4、时序特征构造

Load forecasting using support vector Machines: a study on EUNITE competition 2001[J]. IEEE Transactions on Power Systems, 2004

1.历史数据的周期滑窗特征;
2.除了滑窗特征,还可以加入一些周期内数据的均值和方差等统计特征作为回归模型的特征输入

 

 

3.其他特征

时序预测算法优点缺点
一阶指数光滑(SES,EWMA)方法简单,计算速度快。趋势,季节性等复杂波形拟合效果差
三阶指数光滑(Holtwinter)周期波形拟合比较准确。计算复杂度高,性能较差,算法待优化的参数多
深度学习模型(LSTM)波形拟合度准确。计算复杂度高,针对大量的待检测KPI指标较难应

参考:

  1. https://zhuanlan.zhihu.com/p/67396219
  2. https://www.cnblogs.com/rnanprince/articles/10790313.html
  3. https://blog.csdn.net/qq_19446965/article/details/89395190
  4. https://blog.csdn.net/qq_19446965/article/details/106460747
  5. https://blog.csdn.net/qq_19446965/article/details/89392892
  6. https://www.cnblogs.com/coshaho/p/9807923.html
  7. https://www.cnblogs.com/bonelee/p/9848019.html
  8. https://www.cnblogs.com/bonelee/p/7776565.html
  9. https://www.jianshu.com/p/c5e4e7dce972
  10. Robust random cut forest based anomaly detection on streams[C]// International
  11. Conference on International Conference on Machine Learning-volume. JMLR.org, 2016.
  12. Time-Series Anomaly Detection Service at Microsoft[J]. 2019.
  13. Graph based anomaly detection and description: a survey[J]. Data Mining & Knowledge Discovery, 2015
  14. https://github.com/Seanny123/da-rnn
  15. https://github.com/chickenbestlover/RNN-Time-series-Anomaly-Detection
  16. http://www.jeepxie.net/article/691238.html

  17. http://www.infocomm-journal.com/txxb/CN/10.11959/j.issn.1000-436x.2019159

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

KPI异常检测【三】- 机器学习算法 的相关文章

  • 最优化方法总结:公式解、数值优化、求解思想

    机器学习的目标是给出一个模型 xff08 一般是映射函数 xff09 xff0c 然后定义对这个模型好坏的评价函数 xff08 目标函数 xff09 xff0c 求解目标函数的极大值或者极小值 xff0c 以确定模型的参数 xff0c 从而
  • AGV小车基础知识介绍

    AGV基础知识 一 AGV的基本概念二 AGV的基本结构硬件组成软件组成1 硬件结构2 单机结构3 主要类型4 主要引导方式介绍5 驱动方式介绍6 AGV的移载方式 三 AGV的控制系统1 AGV控制系统2 AGV安全系统3 激光导航控制系
  • ardupilot & PX4 RTK配置指南

    ardupilot amp PX4 RTK配置指南 随着无人机对于高精度位置需求越来越强烈 xff0c 同时也伴随着北斗三代导航系统正式服务全球 xff0c 国产的实时载波相位差分 xff08 RTK xff09 导航产品也正在以更优惠 更
  • 无人机ADS-B模块 (兼容Px4、ardupilot、极致飞控)拒绝黑飞,耗子尾汁!

    近年来 xff0c 无人机等低空飞行器成为很多玩家的新 玩具 xff0c 但是绝大多数飞行器都属于 黑飞 xff0c 就是没有民航管理部门的适航许可 也没有相关部门颁发的驾驶执照的 2018年2月7日 xff0c 河北省唐山市古冶区公安分局
  • RK3308 蓝牙接口测试

    BT相关接口 deviceio test bluetooth bt server open 蓝牙测试初始化 xff0c 执行蓝牙测试前 xff0c 先调用该接口 BLE的接收和数据请求回调函数的注册 注 xff1a BLE读数据是通过注册回
  • 无人机高精度导航系统GT08N——支持RTK、PPK 、双天线测向

    最近几年无人机市场可以说的上是非常火爆的 xff0c 无人机公司也是数不胜数 无人机的应用场合也是非常之多的 xff0c 农业 物流 安防 巡航 测绘 航拍等等都得到了非常好的应用 同时无人机市场也催生了许多的配套设备的发展 RTK xff
  • FreeRTOS操作系统如何设置的PendSV和SysTick优先级

    首先应该明确PendSV和SysTick的优先级应该设置为最低 xff0c 具体原因参见这一篇博客 PendSV功能 xff0c 为什么需要PendSV 设置优先级在函数port c中的xPortStartScheduler 函数中实现的
  • 自平衡小车控制(stc12+mpu6050程序)

    自平衡小车控制 xff08 stc12 43 mpu6050程序 xff09 两轮自平衡车最终版控制程序 xff08 6轴MPU6050 43 互补滤波 43 PWM电机 xff09 单片机STC12C5A60S2 晶振 xff1a 20M
  • 深度学习常见名词概念:Sota、Benchmark、Baseline、端到端模型、迁移学习等的定义

    深度学习 xff1a Sota的定义 Sota非端到端模型端到端模型Benchmark Baseline并发 并行 串行迁移学习微调进程 线程监督学习非监督学习半监督学习泛化 xff08 Generalization xff09 正则化 x
  • VINS 系统总结

  • VIO算法总结(一)

    所谓VIO xff08 visual inertial odometry xff09 就是视觉传感器 xff08 camera xff09 43 IMU xff08 inertial measurement unit xff09 一起来做自
  • 西门子1200、1500 PLC中如何将寄存器(M,D,DB)值存入到结构体变量中

    如果将MD100 QD100的值存入到结构体中 xff0c 直接存储过去是存不了的 解决方法是 xff1a 1 建立一个COPY块 xff0c 为FB FC型均可 将寄存器的值或结构体的值序列化 建立出来的库 xff0c 具体作用是结构体
  • windows下clion配置cmake

    1 Cmake安装 cmake官方链接 进入cmake官网下载cmake xff0c 然后一路next xff0c 傻瓜式安装 2 MinGW安装 MinGW官网安装 xff0c 或者去其他论坛找资源 然后打开桌面的快捷方式 xff0c 没
  • ubuntu18.04 安装 roboware-studio

    RoboWare Studio是一个ROS集成开发环境 与ROS匹配性比起其他IDE更好 xff0c 可以用它开发 ROS更加简单 并且在官网ros wiki中有详细的使用教程 本文主要是在Ubuntu18 04中安装RoboWare St
  • 烧录工具Android Tool的使用

    RK3308 该工具是RK的开发工具 xff0c 用于烧录用的 xff0c 不同型号的芯片对应的Android Tool中的下载镜像界面也不一样 xff0c 你像RK3308编出来的烧录文件有如下 xff1a 对应的Android Tool
  • Jetson nano i2c教程(MPU6050 + PCA9685)

    首先介绍nano板子上的i2c相关的硬件信息 xff1a 安装所需要的i2c库 sudo apt get install l y i2c tools 完成nano中io与i2c设备的硬件接线 本次案例使用的是PCA9685和MPU6050
  • ROS中发布里程计消息(Odometry)

    目录 1 首先理解里程计是什么 xff1f 2 里程计发布流程3 发布里程计TF变换2 1c 43 43 发布TF变换2 2 python发布TF变换 根据阿克曼转向结构的车辆实现里程计消息的发布 xff0c 本文参考博客如下 xff0c
  • ROS std_msgs/Header 数据含义

    std msgs Header msg消息里数据主要有一下几部分 xff1a uint32 seq time stamp string frame id 分别对这些数据做一个介绍 xff0c 如有错误 xff0c 欢迎批评指正 xff01
  • Carsim中添加路径

    目录 1 新建3D Road 数据库2 设置具体参数3 添加自定义道路信息 利用carsim和simulink联合仿真时 xff0c 需要给定参考轨迹 xff0c 具体设置如下 xff1a 1 新建3D Road 数据库 在Miscella
  • Carsim 2019 Run Now 按钮灰色

    安装carsim后 xff0c Run control with Simulink 模块中的Run Now 和Send to simulink 按钮灰色如下图所示 xff1a 解决办法 xff1a 在License Setting中 xff

随机推荐

  • Ubuntu 添加串口权限

    ubuntu串口添加权限方法 Ubuntu 添加串口权限前言一 添加用户组 xff0c 可长期使用二 给当前终端权限 xff08 单次有效 xff09 1 指定串口2 通用 三 修改文件 Ubuntu 添加串口权限 提示 xff1a 文章写
  • Ubuntu 虚拟机右上角网络连接符号消失

    这里写自定义目录标题 Ubuntu 虚拟机右上角网络连接符号消失解决方案 xff1a Ubuntu 虚拟机右上角网络连接符号消失 Ubuntu 虚拟机右上角网络连接符号消失 xff0c 如下图所示 解决方案 xff1a span class
  • C/C++中局部变量static用法实例

    1 普通局部变量存储于进程栈空间 xff0c 使用完毕会立即释放 xff0c 静态局部变量使用static修饰符定义 xff0c 即使在声明时未赋初值 xff0c 编译器也会把它初始化为0 xff0c 并且静态局部变量存储于进程的全局数据区
  • 嵌入式C语言经典面试题(一)

    1 用预处理指令 define 声明一个常数 xff0c 用以表明1年中有多少秒 xff08 忽略闰年问题 xff09 define SECONDS PER YEAR 60 60 24 365 UL 我在这想看到几件事情 xff1a 1 d
  • 更新Ubuntu内核到最新版本

    想起自己多年前玩Linux的时候知道了两个命令 xff1a sudo apt get update sudo apt get upgrade 以为是能够更新所有软件的 xff0c 后来发现 系统还是不能够更新的 那么 xff0c 系统应该如
  • RK3308 按键Key与LED灯

    硬件原理图 LED指示灯 麦克风阵列子板上使用12颗RGB灯作为效果指示灯 用户可以通过I2C总线配置LED灯驱动IC来是实现不同场景下的灯效 按键Key 麦克风阵列子板上集成五个控制按键 xff0c 分别为 xff1a 控制音量增减的VO
  • if选择结构

    if单选择结构 if双选择结构 if多选择结构 span class token keyword if span span class token punctuation span score span class token operat
  • Windows10下Eclipse+Python环境配置与新项目创建

    最近心血来潮 xff0c 突然想学一下python xff0c 按理说应该不用Eclipse xff0c 但是一想以后还可能会用Java xff0c 那还是装这个 xff0c 然后配置一下环境吧 xff0c 其中也有很多坑 xff0c 希望
  • 理解地址空间和逻辑地址生成

    1 1 地址空间 物理地址 xff1a 硬件 例如内存条 所支持地址空间 xff0c 地址空间的管理由硬件完成 逻辑地址 虚拟地址 xff1a 运行地址所看到的地址空间 xff0c 地址空间是一维的 xff0c 应用程序更加容易访问和管理
  • QT DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x800c000d ()

    使用QT播放音频的时候出现如下错误 DirectShowPlayerService doSetUrlSource Unresolved error code 0x800c000d 原因是url错误
  • 3种蓝牙架构实现方案(蓝牙协议栈方案)

    导言 不同的蓝牙架构可以用在不同的场景中 从而协议帧的架构方案也会不同 转载自 xff1a https www cnblogs com schips p 12293141 html 三种蓝牙架构实现方案 xff08 蓝牙协议栈方案 xff0
  • 驱动遍历句柄表

    xfeff xfeff 驱动遍历句柄表附加第二个方法的反汇编代码 其中还有对其拦截的方式的一些需要HOOK处比如伪造句柄表 因为大量使用硬编码所以此份代码通用性不强一切均在虚拟机XP3下操作 include 34 ntddk h 34 ty
  • Javascript案例:猜数字游戏

    要求 程序随机生成一个1 10之间的数字 xff0c 并让用户输入一个数字 如果大于该数字 xff0c 就提示 xff0c 数字大了 xff0c 继续猜如果小于该数字 xff0c 就提示 xff0c 数字小了 xff0c 继续猜如果等于该数
  • 操作系统之进程 (五) --- 进程、进程实体、PCB...

    文章目录 进程什么叫进程什么叫进程实体进程与进程实体的关系PCB的存储信息与分类 进程的组织方式链接方式索引方式 进程的特征总结感谢 进程 什么叫进程 进程和程序差不多 xff0c 他们有所联系也有所区别 我们以我们熟悉的程序入手 xff0
  • 如何让树莓派默认启动进入图形界面

    设置Raspbian图形启动 当你第一次安装Raspbian系统时 xff0c 确实有一些选项需要你来配置 xff0c 由于匆忙 xff0c 我没有注意到这些 xff0c 只是快速完成屏幕上的选项 如果你遇到了和我一样的情况 xff0c 最
  • ROS与stm32通信

    0 概述 ros和stm32等嵌入式单片机的最大区别在于ros主要用于处理slam 机器视觉 人工智能这种对于算力要求高 xff0c 算法复杂的问题 xff1b 而stm32和arduino等主要用来处理一些边缘事件 xff0c 比如亮个L
  • 硬件仪器的使用

    示波器的使用 用于红外捕捉 xff0c 一开始可以把探头扣在探头补偿的位置 xff0c 显示出一个正常的方波信号5V 1KHz 按下CH1的菜单 xff0c 能够弹出右边的选项 xff0c 注意设置为直流和10X电压 按下触发处的Menu菜
  • pytorch显存越来越多的一个潜在原因-- 这个函数还没有在torch.cuda.Tensor中定义

    最近在用pytorch跑实验 xff0c 有如下操作需要用到 xff08 pytorch版本为0 3 1 xff09 class SpatialFilter nn Module def init self mode 61 True sf r
  • KPI异常检测【一】- 时间序列分解算法

    目录 1 相关概念 2 常见的时间序列 3 时间序列分解 3 1 方法介绍 3 2 经典方法 3 3 Holt Winter 指数平滑 3 4 STL分解 4 异常准则 5 异常检测算法 1 相关概念 1 1 异常 时序异常检测通常形式化为
  • KPI异常检测【三】- 机器学习算法

    目录 1 相关概念 1 1 异常类型 1 2 检测方法 2 点异常检测算法 2 1 基于统计 2 2 基于相似度 2 2 1 基于距离 2 2 2 基于密度 2 2 3 基于聚类 2 2 4 基于树 2 3 基于谱 spectral 3 上