聚类分析
-
数据聚类及离群点检测:什么是聚类分析:聚类的功能 聚类的分类:基于划分的方法(k-means) 基于层次的方法(agens,dina) 基于密度的方法(DBscan) 基于网格的方法
- 聚类:就是将数据分个簇,使得在同一个簇内对象之间具有较高的相似度,而不同簇之间的对象差别较大
- 无监督学习
- 聚类分析的目的是:寻找数据中潜在的自然分组结构
- 聚类的分类:
- 基于划分方法
- 给定一个有n个对象的数据集,划分聚类技术将构造数据k个划分,每一个划分就代表一个簇,k ≤ \leq ≤n.
- 基本思路:对于给定的K,算法首先给出一个初始的划分方法,以后通过反复迭代的方法改变划分,使得没一次改进之后的划分方案都较前一次更好
- 经典的算法有:K-Means(K-均值)、K-Medoids(K-中心点)
- 基于层次的方法
- 层次聚类方法对给定的数据集进行层次的分解,直到某种条件满足为止
- 凝聚的层次聚类:是一种自底向上的策略,首先将每个对象作为一个簇,然后合并这些原子簇为越来越大的簇,知道某个终结条件被满足,AGNES算法
- 分裂的层次聚类:采用自顶向下的策略,它首先将所有对象置于一个簇中然后逐渐细分为越来越小的簇,直到达到了某个终止条件,DIANA算法
- 基于密度的方法
- 密度聚类的指导思想:只要一个区域中的点的密度大于某个阈值,就把它加到与之相近的聚类中去
- 算法的优点:能克服基于距离的算法只能发现”类圆形“的聚类的缺点,可发现任意形状的聚类,且对噪声数据不敏感,DBScan算法
- 基于网络的方法
- 将对象空间量化为有限数目的单元,形成一个网络结构,所有聚类都在这个网格结构中上进行
- 基于划分方法
-
k-means算法 a.初始中心点 簇分配 更改中心值
-
任意选取k个点作为类中心点(簇的平均值)【一般是数据集中随机抽取】
-
将每个点分配到最近的类中心点,这样就形成了K个类,然后重新计算每个类的中心点【即更新簇的平均值】
- 可用欧氏距离计算,用每个维度的平均值重新计算每个类的中心点
-
重复第二步,直至类不发生变化,【或者可设置最大迭代次数,这样及时类中心点发生变化,但是达到最大迭代次数就会结束】
-
-
KMeans算法优点:简单,快速 缺点:对K值敏感,对初始中心敏感 无法发生非高斯簇,对离群点敏感。
- 优点:
- 经典算法,简单、快速
- 对处理大数据集,该算法是相对可伸缩和高效率的
- 缺点:
- k值敏感,要事先主观给出
- 初值敏感
- 不适合非球形状或者大小差别很大的簇
- 对于孤立点和噪声敏感
- 优点:
-
DBScan算法:基本思想:密度相连
-
DBScan流程:(了解)
- 从数据库中抽取一个未处理的过的点
- 如果抽出的点是核心点,找出从该点密度可达的对象形成一个簇
- 如果抽出的点是边缘点,重复第1、2步
- 当所有点都被处理结束
-
DBScan优点:可以发现任意形状的簇,可以检测噪声无需设置k的个数 ,缺点:很难设置参数。
- 缺点:
- 对参数EPS和Minspt非常敏感,但是这两个参数选取主要依靠主管判断
- 如果数据库比较大的时候要进行大量的I/O开销
- 缺点:
-
离群点检测:什么是离群点。
-
离群点是一个数据对象,它显著不同于其它数据对象,好像它是被不同机制产生的一样
-
异常数据具有特殊的意义和很高的实用价值,异常数据通常作为噪音而忽略,但异常数据会带给我们新的视角
- 在欺诈检测中,异常数据可能意味着欺诈行为的发生
- 在入侵检测中,异常数据可能以为入侵行为的发生
-
-
离群点的分类:全局离群点,局部离群点,集体离群点。
- 全局离群点:跟别的点一点关系都没有
- 局部离群点:对全局来说不是离群点,但是对某个簇说是离群点
- 集体离群点:某一个集体和其他不同
-
检测方法:基于统计的方法 基于距离的方法 基于偏差的方法 基于密度的方法(LOF算法)。
-
基于统计学的孤立点检测
-
基于距离的孤立点的检测
-
基于偏离的孤立点检测
-
基于密度判断
-
一文读懂异常检测 LOF 算法(Python代码) - 腾讯云开发者社区-腾讯云 (tencent.com)
局部异常因子
根据局部可达密度的定义,如果一个数据点跟其他点比较疏远的话,那么显然它的局部可达密度就小。但LOF算法衡量一个数据点的异常程度,并不是看它的绝对局部密度,而是看它跟周围邻近的数据点的相对密度。
这样做的好处是可以允许数据分布不均匀、密度不同的情况。局部异常因子即是用局部相对密度来定义的。数据点 的局部相对密度(局部异常因子)为点 邻域内点的平均局部可达密度跟数据点 的局部可达密度的比值,即:
L O F k ( P ) = ∑ O ∋ N k ( P ) l r d ( O ) l r d ( P ) ∣ N k ( P ) ∣ = ∑ O ∋ N k ( P ) l r d ( O ) ∣ N k ( P ) ∣ / l r d ( P ) LOF_k(P)=∑_{O∋N_k(P)}\frac{\frac{lrd(O)}{lrd(P)}}{|Nk(P)|}=∑_{O∋Nk(P)}lrd(O)|N_k(P)|/lrd(P) LOFk(P)=∑O∋Nk(P)∣Nk(P)∣lrd(P)lrd(O)=∑O∋Nk(P)lrd(O)∣Nk(P)∣/lrd(P)
LOF算法流程
了解了 LOF 的定义以后,整个算法也就显而易见了:
- 对于每个数据点,计算它与其它所有点的距离,并按从近到远排序;
- 对于每个数据点,找到它的 k-nearest-neighbor,计算 LOF 得分;
- 如果LOF值越大,说明越异常,反之如果越小,说明越趋于正常。
-