美文网首页
python基于聚类的离群点检测方法

python基于聚类的离群点检测方法

作者: afansdie | 来源:发表于2019-08-12 21:52 被阅读0次

首先让我们了解一下理论知识:

聚类分析常常用于发现局部强相关的对象组,而异常检测是发现局部不与其他对象强相关的对象,因此,聚类分析经常用于离群点检测,而常用的检测方法主要有:

丢弃远离其他簇的小簇:

这个方法可以和其他聚类方法一起使用,但是需要最小簇大小和小簇与其他簇之间距离的阈值。而且这种方案对簇个数的选择高度敏感,使用这个方案很难将离群点得分附加到对象上。也就是说丢弃小于某个最小阈值的所有簇。

基于原型的聚类:

首先聚类所有对象,然后评估对象属于簇的程度(离群点得分)。在这种方法中,可以用对象到它簇中心的距离来度量属于簇的程度。特别地,如果删除一个对象导致该目标的显著改进,则可将该对象视为离群点。对于基于原型的聚类,主要有两种方法评估对象属于簇的程度:一是度量对象到簇原型的距离,并用它作为该对象的离群点得分;二是考虑到簇具有不同的密度,可以度量簇到原型的相对距离,相对距离是点到质心的距离与簇中所有点到质心的距离的中位数之比。

诊断步骤如下:

1) 进行聚类。选择聚类算法,将样本集聚为K簇,并寻找到各簇的质心。

2)计算各对象到它的最近质心的距离。

3)计算各对象到它的最近质心的相对距离。

4)与给定的阈值作比较。

如果某对象距离大于该阈值,就认为该对象是离群点。

基于聚类的离群点检测的改进如下:

1)离群点对初始聚类的影响:通过聚类检测离群点时,离群点会影响聚类结果。为了处理该问题,可以使用方法:对象聚类,删除离群定,对象再次聚类。

2)取一组不能很好地拟合任何簇的特殊对象,这组对象代表潜在的离群点。随着聚类过程的进展,簇在变化。不再强属于任何簇的对象将被添加到潜在的离群点集合;测试当前在该集合中的对象,如果它现在强属于一个簇,就可以将它从潜在的离群点集合中移除。聚类过程结束时还留在该集合中的点被分类为离群点。

对象是否被认为是离群点可能依赖于簇的个数。该问题也没有简单的答案。一种策略是对于不同的簇的个数重复该分析。另一种方法是找出大量小簇,其想法如下:

1)较小的簇倾向于更加凝聚;

2)如果存在大量小簇时,一个对象是离群点,则它多半是一个真正的离群点。

不利的一面是一组离群点可能形成小簇从而逃避检测。

代码:

#-*- coding: utf-8 -*-

#使用K-Means算法聚类消费行为特征数据

import numpyas np

import pandasas pd

#参数初始化

inputfile ='路径' #销量及其他属性数据

k =4 #聚类的类别

threshold =3 #离散点阈值

iteration =500 #聚类最大循环次数

data = pd.read_excel(inputfile, index_col ='Id')#读取数据

data_zs =1.0*(data - data.mean())/data.std()#数据标准化

from sklearn.clusterimport KMeans

model = KMeans(n_clusters = k, n_jobs =4, max_iter = iteration)#分为k类,并发数4

model.fit(data_zs)#开始聚类

#标准化数据及其类别

r = pd.concat([data_zs, pd.Series(model.labels_, index = data.index)], axis =1)#每个样本对应的类别

r.columns =list(data.columns) + [u'聚类类别']#重命名表头

norm = []

for iin range(k):#逐一处理

  norm_tmp = r[['R', 'F', 'M']][r[u'聚类类别'] == i]-model.cluster_centers_[i]

norm_tmp = norm_tmp.apply(np.linalg.norm, axis =1)#求出绝对距离

  norm.append(norm_tmp/norm_tmp.median())#求相对距离并添加

norm = pd.concat(norm)#合并

import matplotlib.pyplotas plt

plt.rcParams['font.sans-serif'] = ['SimHei']#用来正常显示中文标签

plt.rcParams['axes.unicode_minus'] =False #用来正常显示负号

norm[norm <= threshold].plot(style ='go')#正常点

discrete_points = norm[norm > threshold]#离群点

discrete_points.plot(style ='ro')

for iin range(len(discrete_points)):#离群点做标记

  id = discrete_points.index[i]

n = discrete_points.iloc[i]

plt.annotate('(%s, %0.2f)'%(id, n), xy = (id, n), xytext = (id, n))

plt.xlabel(u'编号')

plt.ylabel(u'相对距离')

plt.show()

相关文章

  • python基于聚类的离群点检测方法

    首先让我们了解一下理论知识: 聚类分析常常用于发现局部强相关的对象组,而异常检测是发现局部不与其他对象强相关的对象...

  • 100天搞定机器学习|day54 聚类系列:层次聚类原理及案例

    几张GIF理解K-均值聚类原理k均值聚类数学推导与python实现前文说了k均值聚类,他是基于中心的聚类方法,通过...

  • 机器学习--K-means算法优化

    主要的聚类算法可以划分为如下几类:划分方法、层次方法、基于密度的方法、基于网格的方法以及基于模型的方法。目前,聚类...

  • 【R语言 第2篇】K-means聚类分析流程

    聚类算法是没用因变量的。聚类算法有层次聚类、基于划分的聚类、两步聚类法、基于密度的聚类。 聚类方法的逻辑 客户细分...

  • 异常检测之LOF算法

    简介 LOF算法(Local Outlier Factor,局部离群因子检测方法),是一种无监督的离群检测方法,是...

  • 基于密度的聚类方法

    基于密度的聚类方法的主要目标是寻找被低密度区域分离的高密度区域。 与基于距离的聚类算法不同的是,基于距离的聚类算法...

  • SQLMAP自动注入(一):sqlmap的简单使用和配合burp

    python编写,开源 检测方式 基于布尔的盲注检测 基于时间的盲注检测 基于错误的检测 基于union的检测 基...

  • 2019-04-28

    K-means聚类算法 K-means短板 K值敏感 初始值敏感 离群点敏感

  • 基于网格的聚类方法

    基于网格的聚类方法将空间量化为有限数目的单元,可以形成一个网格结构,所有聚类都在网格上进行。 基本思想就是将每个属...

  • 基于层次的聚类方法

    基于层次的聚类方法是指对给定的数据进行层次分解,直到满足某种条件为止。该算法根据层次分解的顺序分为自底向上法和自顶...

网友评论

      本文标题:python基于聚类的离群点检测方法

      本文链接:https://www.haomeiwen.com/subject/xdbpjctx.html