聚类指的是把集合,分组成多个类,每个类中的对象都是彼此相似的。K-means是聚类中最常用的方法之一,它是基于点与点距离的相似度来计算最佳类别归属。

在使用该方法前,要注意(1)对数据异常值的处理;(2)对数据标准化处理(x-min(x))/(max(x)-min(x));(3)每一个类别的数量要大体均等;(4)不同类别间的特质值应该差异较大

 

一、K-means聚类步骤:

(1)选择k个初始聚类中心

(2)计算每个对象与这k个中心各自的距离,按照最小距离原则分配到最邻近聚类

(3)使用每个聚类中的样本均值作为新的聚类中心

(4)重复步骤(2)和(3)直到聚类中心不再变化

(5)结束,得到k个聚类

二、评价聚类的指标:

(1)inertias:是K-Means模型对象的属性,它作为没有真实分类结果标签下的非监督式评估指标。表示样本到最近的聚类中心的距离总和。值越小越好,越小表示样本在类间的分布越集中。

(2)兰德指数:兰德指数(Rand index)需要给定实际类别信息C,假设K是聚类结果,a表示在C与K中都是同类别的元素对数,b表示在C与K中都是不同类别的元素对数,则兰德指数为:

RI取值范围为[0,1],值越大意味着聚类结果与真实情况越吻合。

对于随机结果,RI并不能保证分数接近零。为了实现“在聚类结果随机产生的情况下,指标应该接近零”,调整兰德系数(Adjusted rand index)被提出,它具有更高的区分度:

ARI取值范围为[−1,1],值越大意味着聚类结果与真实情况越吻合。从广义的角度来讲,ARI衡量的是两个数据分布的吻合程度。

(3)互信息(Mutual Information,MI):指的是相同数据的两个标签之间的相似度,即也是在衡量两个数据分布的相似程度。利用互信息来衡量聚类效果需要知道实际类别信息。

假设U与V是对N个样本标签的分配情况,则两种分布的熵分别为:

,其中

U与V之间的互信息(MI)定义为:

,其中

标准化后的互信息(Normalized Mutual Information):

调整互信息(Adjusted Mutual Information):

MI与NMI取值范围[0,1],AMI取值范围[-1,1],都是值越大说明聚类效果越好。

(4)同质化得分(Homogeneity):如果所有的聚类都只包含属于单个类的成员的数据点,则聚类结果满足同质性。取值范围[0,1],值越大意味着聚类结果与真实情况越符合。

(5)完整性得分(Complenteness):如果作为给定类的成员的所有数据点是相同集群的元素,则聚类结果满足完整性。取值范围[0,1],值越大意味着聚类结果与真实情况越符合。

(6)v_meansure_score:同质化和完整性之间的谐波平均值,v=2*(同质化*完整性)/(同质化+完整性),取值范围[0,1],值越大意味着聚类结果与真实情况越符合。

(7)轮廓系数(Silhouette):适用于实际类别信息未知的情况,用来计算所有样本的平均轮廓系数。对于单个样本,设a是该样本与它同类别中其他样本的平均距离,b是与它距离最近不同类别中样本的平均距离,轮廓系数为:

对于一个样本集合,它的轮廓系数是所有样本轮廓系数的平均值,轮廓系数取值范围是[−1,1],0附近的值表示重叠的聚类,负值通常表示样本被分配到错误的集群,分数越高,说明同类别样本间距离近,不同类别样本间距离远。

(8)calinski-harabaz Index:适用于实际类别信息未知的情况,为群内离散与簇间离散的比值,值越大聚类效果越好。

三、KMeans 主要参数

(1)n_clusters:k值

(2)init:初始值选择方式,可选值:'k-means++'(用均值)、'random'(随机)、an ndarray(指定一个数组),默认为'k-means++'。

(3)n_init:用不同的初始化质心运行算法的次数。由于K-Means是结果受初始值影响的局部最优的迭代算法,因此需要多跑几次以选择一个较好的聚类效果,默认是10,一般不需要改,即程序能够基于不同的随机初始中心点独立运行算法10次,并从中寻找SSE(簇内误差平方和)最小的作为最终模型。如果k值较大,则可以适当增大这个值。

(4)max_iter: 最大的迭代次数,一般如果是凸数据集的话可以不管这个值,如果数据集不是凸的,可能很难收敛,此时可以指定最大的迭代次数让算法可以及时退出循环。

(5)algorithm:算法,可选值:“auto”, “full” or “elkan”。"full"指K-Means算法, “elkan”指elkan K-Means算法。默认的"auto"则会根据数据值是否是稀疏的,来决定如何选择"full"和“elkan”。一般数据是稠密的,那么就是 “elkan”,否则就是"full"。一般来说建议直接用默认的"auto"。

四、k值的选择方法

基于簇内误差平方和,使用肘方法确定簇的最佳数量,肘方法的基本理念就是找出聚类偏差骤增是的k值,通过画出不同k值对应的聚类偏差图,可以清楚看出。

#导入库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

#导入数据
df=pd.read_csv(r'E:\data analysis\test\cluster.txt',header=None,sep='\s+')
print(df.head())
x=df.iloc[:,:-1]
y=df.iloc[:,-1]

#肘方法看k值
d=[]
for i in range(1,11): #k取值1~11,做kmeans聚类,看不同k值对应的簇内误差平方和
km=KMeans(n_clusters=i,init='k-means++',n_init=10,max_iter=300,random_state=0)
km.fit(x)
d.append(km.inertia_) #inertia簇内误差平方和 plt.plot(range(1,11),d,marker='o')
plt.xlabel('number of clusters')
plt.ylabel('distortions')
plt.show()

从图中可看出,k取3合适。

五、python做K-Means

继续使用上例中导入的数据。

#训练聚类模型
from sklearn import metrics
model_kmeans=KMeans(n_clusters=3,random_state=0) #建立模型对象
model_kmeans.fit(x) #训练聚类模型
y_pre=model_kmeans.predict(x) #预测聚类模型

#评价指标
inertias=model_kmeans.inertia_ #样本距离最近的聚类中心的距离总和
adjusted_rand_s=metrics.adjusted_rand_score(y_true,y_pre) #调整后的兰德指数
mutual_info_s=metrics.mutual_info_score(y_true,y_pre) #互信息
adjusted_mutual_info_s=metrics.adjusted_mutual_info_score (y_true,y_pre) #调整后的互信息
homogeneity_s=metrics.homogeneity_score(y_true,y_pre) #同质化得分
completeness_s=metrics.completeness_score(y_true,y_pre) #完整性得分
v_measure_s=metrics.v_measure_score(y_true,y_pre) #V-measure得分
silhouette_s=metrics.silhouette_score(x,y_pre,metric='euclidean') #轮廓系数
calinski_harabaz_s=metrics.calinski_harabaz_score(x,y_pre) #calinski&harabaz得分
print('inertia\tARI\tMI\tAMI\thomo\tcomp\tv_m\tsilh\tc&h')
print('%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%d'%
(inertias,adjusted_rand_s,mutual_info_s,adjusted_mutual_info_s,homogeneity_s,
completeness_s,v_measure_s,silhouette_s,calinski_harabaz_s)) inertia    ARI    MI    AMI    homo    comp    v_m    silh    c&h
300    0.96    1.03    0.94    0.94    0.94    0.94    0.63    2860
#聚类可视化
centers=model_kmeans.cluster_centers_ #类别中心
print(centers)
colors=['r','c','b']
plt.figure()
for j in range(3):
index_set=np.where(y_pre==j)
cluster=x.iloc[index_set]
plt.scatter(cluster.iloc[:,0],cluster.iloc[:,1],c=colors[j],marker='.')
plt.plot(centers[j][0],centers[j][1],'o',markerfacecolor=colors[j],markeredgecolor='k',markersize=8) #画类别中心
plt.show() [[-0.97756516 -1.01954358]
 [ 0.9583867   0.99631896]
 [ 0.98703574 -0.97108137]]

参考:

《python数据分析与数据化运营》——宋天龙

https://blog.csdn.net/sinat_26917383/article/details/70577710

https://www.jianshu.com/p/b5996bf06bd6

https://blog.csdn.net/sinat_26917383/article/details/51611519

http://www.cnblogs.com/pinard/p/6169370.html

用K-Means聚类分析做客户分群的更多相关文章

  1. 客户主题分析(tableau)—客户分群

    主要分析方面:客户合理分群 客户分群实现:使用聚类构建指标,需理解聚类的分析逻辑,需使用软件:tableau 聚类方法:选择3指标分别为购买总金额,客户购买次数.类平均购买价格(四类的平均购买价格,四 ...

  2. ModelArts微认证零售客户分群知识点总结

    \ 作者:华为云MVP郑永祥

  3. python实现六大分群质量评估指标(兰德系数、互信息、轮廓系数)

    python实现六大分群质量评估指标(兰德系数.互信息.轮廓系数) 1 R语言中的分群质量--轮廓系数 因为先前惯用R语言,那么来看看R语言中的分群质量评估,节选自笔记︱多种常见聚类模型以及分群质量评 ...

  4. Admixture的监督分群(Supervised analysis)

    目录 说明 实战 说明 Admixture通过EM算法一般用于指定亚群分类:或者在不知材料群体结构背景下,通过迭代交叉验证获得error值,取最小error对应的K值为推荐亚群数目.如果我们预先已知群 ...

  5. 谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做?

    谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做? 分析: "假设两个整数数组为A和B,各有N个元素,任意两个数的和组成的数组C有N^2个元素. ...

  6. 面试连环炮系列(二):你们的项目Redis做了集群部署吗

    你们的项目Redis做了集群部署吗? 我们有大量数据需要缓存,而单实例的容量毕竟是有限的,于是做了Redis集群部署. 采取的方案是什么,Codis还是Redis Cluster,为什么要选择这个方案 ...

  7. Tableau 分群

    对数据的特征进行分析,分群. 数据选用的是Iris data 下载地址:http://archive.ics.uci.edu/ml/machine-learning-databases/iris/ 1 ...

  8. SPSS聚类分析:K均值聚类分析

    SPSS聚类分析:K均值聚类分析 一.概念:(分析-分类-K均值聚类) 1.此过程使用可以处理大量个案的算法,根据选定的特征尝试对相对均一的个案组进行标识.不过,该算法要求您指定聚类的个数.如果知道, ...

  9. k-means实战-RFM客户价值分群

    数据挖掘的十大算法 基本概念 导入数据集到mysql数据库中 总共有940个独立消费数据 K-Means 算法 K-Means 算法是一个聚类算法.你可以这么理解,最终我想把物体划分成 K 类.假设每 ...

随机推荐

  1. 2019-10-10-优雅调试-REST-API-的工具

    title author date CreateTime categories 优雅调试 REST API 的工具 lindexi 2019-10-10 20:9:33 +0800 2019-10-1 ...

  2. linux 后备缓存

    一个设备驱动常常以反复分配许多相同大小的对象而结束. 如果内核已经维护了一套相同 大小对象的内存池, 为什么不增加一些特殊的内存池给这些高容量的对象? 实际上, 内核 确实实现了一个设施来创建这类内存 ...

  3. HDU - 5015 233 Matrix (矩阵快速幂)

    In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233 ...

  4. VisualStudio 断点调试详解

    本文详细告诉大家 VisualStudio 断点调试的功能和使用方法,本文使用的是最新 VisualStudio2019 的功能,也许在你看到这篇博客的时候这个版本已经过时 本文将会按照从简单到复杂, ...

  5. Channel 9视频整理【4】

    Eric ShangKuan 目前服務於台灣微軟,擔任技術傳教士 (Technical Evangelist) 一職,網路上常用的 ID 為 ericsk,對於各項開發技術如:Web.Mobile.A ...

  6. IAP升级

    一.IAP原理 1.在正常情况下,程序运行路流程: 和STM32类似,STM8内部闪存(FLASH)地址起始于 0x8000(STM32是0x08000000),一般情况下,程序文件就从此地 址开始写 ...

  7. freemarker<二>

    一.FreeMarker模板文件组成 ①.文本,直接输出的部分 ②.注释,即<#--...-->格式不会输出 ③.FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区 ...

  8. unmask

            当我们登录系统之后创建一个文件总是有一个默认权限的,那么这个权限是怎么来的呢?这就是umask干的事情.umask 设置了用户创建文件的默认权限,它与chmod的效果刚好相反,umas ...

  9. To learns

    1. avro https://www.jianshu.com/p/ecbb607809c4

  10. 记录nfs的防火墙以及权限问题

    在前面的一篇文章(https://www.cnblogs.com/zyxnhr/p/10660431.html)中,已经介绍了nfs的安装挂载使用,但是存在两个问题 一. 防火墙 在nfs和nfs的守 ...