参考链接: 在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 删除。