K-Means聚类实现离群点挖掘-python

一、离群点的类别

(1)从数据范围来看,分为全局离群点和局部离群点,整体来看,某些对象没有离群特征,但是从局部来看,却显示了一定的离群性。

(2)从数据类型来看,分为数值型离群点和分类型离群点,这是以数据集的属性类型进行划分的。

(3)从属性的个数来看,分为一维离群点和多维离群点,一个对象可能有一个或多个属性。

二、离群点的检测

基于统计:
大部分的基于统计的离群点检测方法是构建一个概率分布模型,并计算对象符合该模型的概率,把具有低概率的对象视为离群点。基于统计模型的离群点检测方法的前提是必须知道数据集服从什么分布;对于高维数据,检验效果可能很差。

基于邻近度:
通常可以在数据对象之间定义邻近性度量,把原理大部分点的对象视为离群点。二位或三维的数据可以做散点图观察;大数据集不适用;对参数选择敏感;具有全局阈值,不能处理具有不同密度区域的数据集

基于密度:
考虑数据集可能存在不同密度区域这一事实,从基于密度的观点分析,离群点是在低密度区域中的对象。一个对象的离群点得分是该对象周围密度的逆。给出了对象是离群点的定量度量,并且即使数据具有不同的区域也能够很好的处理;大数据集不适用;参数选择是困难的。

基于聚类:
一种利用聚类检测离群点的方法是丢弃远离其他簇的小簇;另一种更系统的方法,首先聚类所有对象,然后评估对象属于簇的程度。基于聚类技术来发现离群点可能是高度有效的;聚类算法产生的簇的质量对该算法产生的离群点的质量影响非常大。

参考:https://www.jianshu.com/p/b0dee537e156

三、K-Means实现离群点挖掘

数据集
商场消费记录 consumption_data.csv
K-Means聚类实现离群点挖掘-python_第1张图片
代码:

import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
#参数初始化
input = 'data/consumption_data.csv' #销量及其他属性数据
k = 3 #聚类的类别
threshold = 2 #离散点阈值
iteration = 500 #聚类最大循环次数
data = pd.read_excel(input, index_col = 'Id') #读取数据
# print(data)
data_zs = 1.0*(data - data.mean())/data.std() #数据标准化(标准分数)

model = KMeans(n_clusters=k)
model.fit(data_zs)
res = pd.concat([data_zs,pd.Series(model.labels_, index = data.index)],axis=1)#将分类结果加入到标准化数据中
res.columns = list(data.columns) + ['Cluster_id']
point = []
for i in range(k):
    tmp = res[['R', 'F', 'M']][res['Cluster_id'] == i]-model.cluster_centers_[i] #将当前聚类的数据减去聚类中心点坐标
    tmp = tmp.apply(np.linalg.norm,axis=1) #求取绝对距离
    point.append(tmp/tmp.median())  # 求对于中位数的相对距离
point = pd.concat(point) #将所有聚簇合并

#以下为绘制点图
point[point<=threshold].plot(style='go')#正常点
discrete_point = point[point>threshold]#离群点
discrete_point.plot(style='ro')
print(discrete_point)
for i in range(len(discrete_point)):#对离群点标注坐标
    id = discrete_point.index[i]
    value = discrete_point.iloc[i]
    plt.annotate('(%s,%.2f)'%(id,value),xy=(id,value))
plt.xlabel('ID number')
plt.ylabel('distance')
plt.show()

结果:
K-Means聚类实现离群点挖掘-python_第2张图片

你可能感兴趣的:(机器学习,聚类,kmeans)