1. import numpy as np
  2. import pandas as pd
  3. from sklearn.cluster import KMeans
  4. import matplotlib.pyplot as mp
  5.  
  6. def get_data_zs(inputfile):
  7. data = pd.read_excel(inputfile, index_col='Id', encoding='gb18030')
  8. data_zs = 1.0 * (data - data.mean()) / data.std()
  9. return data, data_zs
  10.  
  11. def model_data_zs(data, k, b):
  12. model = KMeans(n_clusters=k, n_jobs=4, max_iter=b)
  13. model.fit(data_zs)
  14.  
  15. # 标准化数据及其类别
  16. r = pd.concat(
  17. [data_zs, pd.Series(model.labels_, index=data.index)], axis=1)
  18. # print(r.head())
  19. # 每个样本对应的类别
  20. r.columns = list(data.columns) + [u'聚类类别'] # 重命名表头
  21. return model, r, k
  22.  
  23. def make_norm(model, k):
  24. norm = []
  25. for i in range(k):
  26. norm_tmp = r[['R', 'F', 'M']][
  27. r[u'聚类类别'] == i] - model.cluster_centers_[i]
  28. norm_tmp = norm_tmp.apply(np.linalg.norm, axis=1) # 求出绝对距离
  29. norm.append(norm_tmp / norm_tmp.median()) # 求相对距离并添加
  30. norm = pd.concat(norm)
  31. return norm
  32.  
  33. def draw_discrete_point(threshold):
  34. mp.rcParams['font.sans-serif'] = ['SimHei']
  35. mp.rcParams['axes.unicode_minus'] = False
  36. norm[norm <= threshold].plot(style='go') # 正常点
  37.  
  38. discrete_points = norm[norm > threshold] # 离散点阈值
  39. discrete_points.plot(style='rs')
  40. # print(discrete_points)
  41.  
  42. for i in range(len(discrete_points)): # 离群点做标记
  43. id = discrete_points.index[i]
  44. n = discrete_points.iloc[i]
  45. mp.annotate('(%s,%0.2f)' % (id, n), xy=(id, n), xytext=(id, n))
  46. mp.xlabel(r'编号')
  47. mp.ylabel(r'相对距离')
  48. mp.show()
  49.  
  50. if __name__ == '__main__':
  51. inputfile = 'data/consumption_data.xls'
  52. threshold = 2 # 离散点阈值
  53. k = 3 # 聚类类别
  54. b = 500 # 聚类最大循环次数
  55. data, data_zs = get_data_zs(inputfile)
  56. model, r, k = model_data_zs(data, k, b)
  57. norm = make_norm(model, k)
  58. draw_discrete_point(threshold)
  59. print('All Done')

显示结果:

python 离群点检测的更多相关文章

  1. 30行Python代码实现人脸检测

    参考OpenCV自带的例子,30行Python代码实现人脸检测,不得不说,Python这个语言的优势太明显了,几乎把所有复杂的细节都屏蔽了,虽然效率较差,不过在调用OpenCV的模块时,因为模块都是C ...

  2. 离群点检测与序列数据异常检测以及异常检测大杀器-iForest

    1. 异常检测简介 异常检测,它的任务是发现与大部分其他对象不同的对象,我们称为异常对象.异常检测算法已经广泛应用于电信.互联网和信用卡的诈骗检测.贷款审批.电子商务.网络入侵和天气预报等领域.这些异 ...

  3. 深度学习 + OpenCV,Python实现实时视频目标检测

    使用 OpenCV 和 Python 对实时视频流进行深度学习目标检测是非常简单的,我们只需要组合一些合适的代码,接入实时视频,随后加入原有的目标检测功能. 在本文中我们将学习如何扩展原有的目标检测项 ...

  4. 【python+opencv】直线检测+圆检测

     Python+OpenCV图像处理—— 直线检测 直线检测理论知识: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进 ...

  5. C#下实现的K-Means优化[1]-「离群点检测」

    资源下载 #本文PDF版下载 C#下实现的K-Means优化[1]-「离群点检测」 前言 在上一篇博文中,我和大家分享了「C # 下实现的多维基础K-MEANS聚类」的[C#下实现的基础K-MEANS ...

  6. Envoy:离群点检测 outlier detection

    outlier detection 在异常检测领域中,常常需要决定新观察的点是否属于与现有观察点相同的分布(则它称为inlier),或者被认为是不同的(称为outlier).离群是异常的数据,但是不一 ...

  7. 解读ICDE'22论文:基于鲁棒和可解释自编码器的无监督时间序列离群点检测算法

    摘要:本文提出了两个用于无监督的具备可解释性和鲁棒性时间序列离群点检测的自动编码器框架. 本文分享自华为云社区<解读ICDE'22论文:基于鲁棒和可解释自编码器的无监督时间序列离群点检测算法&g ...

  8. 异常点/离群点检测算法——LOF

    http://blog.csdn.net/wangyibo0201/article/details/51705966 在数据挖掘方面,经常需要在做特征工程和模型训练之前对数据进行清洗,剔除无效数据和异 ...

  9. Python QQ群

    微信公众号:Python中文社区 Python初级技术交流QQ群:152745094Python高级技术交流QQ群:273186166Python网络爬虫组QQ群:206241755PythonWeb ...

随机推荐

  1. 树莓派 连接 JY901(MPU9250) python 代码

    先说BUG,最近要做项目需要树莓派和陀螺仪,资金充足的话肯定是买一个硬件卡尔曼滤波的传感器类似JY901模块,资金不足的就买MPU6050. 网上关于MPU6050在树莓派上的代码还能用,关于JY90 ...

  2. centos 7安装python 3

    linux-Centos7安装python3并与python2共存   1.查看是否已经安装Python CentOS 7.2 默认安装了python2.7.5 因为一些命令要用它比如yum 它使用的 ...

  3. vue-计算属性和侦听器

    1.计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example"> { ...

  4. mysql中用limit 进行分页有两种方式

    代码示例:语句1: select * from student limit 9,4 语句2: slect * from student limit 4 offset 9 // 语句1和2均返回表stu ...

  5. mpvue学习笔记(二)

    六.mpvue入门 http://mpvue.com/ 1.安装 $ vue init mpvue/mpvue-quickstart my-project$ cd my-project$ npm in ...

  6. JS-圣杯模式

    var inherit = (function(){ var F = function(){}; return function(Target,Origin){ F.prototype = Origi ...

  7. Excel关联xml文件

    1.新建没传值的xml文件,变量名称自己定义好 2.打开excel,如果之前没有设置过,点击选项 如果当前Excel菜单栏中没有开发工具项,在自定义功能区先勾选上开发选项 3.点右下角的xml映射 弹 ...

  8. VMware虚拟机开机自启动

    VMware虚拟机开机自启动 linux 2018年05月09日 08时30分18秒 VMware的命令行语句可以切换到VMware安装目录,使用vmrun.exe --help(windows下)查 ...

  9. Java多线程之线程状态总结

    概述 线程大家肯定不陌生,对于线程中的运行状态,自己经常搞混淆,这边按照下图记录下: 线程一般来说有如下几种状态: 新建,可运行,超时阻塞,等待阻塞,同步阻塞,死亡 yeild:当线程执行了yield ...

  10. CISCO 关闭4786端口解决方法

    先确认交换机是否支持smart install服务 检查命令如下: switch#show vstack config | inc Role Role:Client (SmartInstall ena ...