前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[Python聚类] 离散点检测 (K-Means聚类方法)

[Python聚类] 离散点检测 (K-Means聚类方法)

作者头像
用户7886150
修改2020-12-28 11:19:12
2K0
修改2020-12-28 11:19:12
举报
文章被收录于专栏:bit哲学院

参考链接: 在Python中使用K-Means聚类分析测试数据

聚类分析用于发现局部强相关的对象组,而异常检测用来发现不与其他对象强相关的对象。  因此,聚类分析可以用于离散度检测。 

诊断步骤 

进行聚类。选择聚类算法(如K-Means算法),将样本集聚K簇,并找到各簇的质心。计算各对象到它的最近质心的距离。计算各对象到它的最近质心的相对距离。(相对距离是点到质心的距离与簇中所有点到质心的距离的中位数之比)与给定的阈值作比较。 

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

数据示例 

代码实现 

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

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

import numpy as np

import pandas as pd

#参数初始化

inputfile = '../data/consumption_data.xls' #销量及其他属性数据

k = 3 #聚类的类别

threshold = 2 #离散点阈值

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

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

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

from sklearn.cluster import 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 i in range(k): #逐一处理

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

  #简化为r[a][b==i] - c[i]

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

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

norm = pd.concat(norm) #合并

import matplotlib.pyplot as 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')

plt.xlabel(u'编号')

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

plt.show() 

np.linalg.norm 中,norm 表示范数,是对向量(或者矩阵)的度量,是一个标量(scalar),默认是二范式。  参考文章:https://blog.csdn.net/lanchunhui/article/details/51004387 

离散点检测结果图

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档