聚类检测异常点

该文介绍了一种利用聚类分析检测异常点的方法。通过计算数据点相对于簇中心的相对距离(以中位数为基准而非平均值,以降低异常值影响),将相对距离大于2的点标记为异常值,从而实现异常检测。这种方法有助于识别并剔除异常数据。

主要思想:

用聚类方式划分数据为不同的簇,计算簇内每个点对于簇中心的相对距离(相对距离 = 点到簇中心的距离/这个簇所有点到簇中心距离的中位数),可视化后,检测出相对距离较大的点。

注意是每个点到簇中心的距离的中位数,不是平均值,因为异常值对中位数的影响很小,几乎可以忽略,但是对均值的影响很大。

 

from sklearn import preprocessing
from sklearn.cluster import KMeans
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.style.use('ggplot')


data = pd.read_excel(r'C:\Users\Administrator\Desktop\consumption_data.xls',index_col = 'Id')

data_scale = preprocessing.scale(data)#处理后需要转为dataframe,或者直接手动求均值、方差转换

model = KMeans(n_clusters = 3,max_iter = 500)#分为3类
model.fit(data_scale)

data_scale = pd.DataFrame(data_scale,index = data.index)
data_scale['labels'] = model.labels_

norm = []
for i in range(3):
    norm_tmp = data_scale[['R','F',"M"]][data_scale['labels']==i]-model.cluster_centers_[i]
    norm_tmp = norm_tmp.apply(np.linalg.norm,axis = 1)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值