聚类指的是把集合,分组成多个类,每个类中的对象都是彼此相似的。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. 【js】 vue 2.5.1 源码学习(六) initProxy initLifeCycle 渲染函数的作用域代理

    大体思路 (五) 1. initProxy 渲染函数的作用域代理 ==> es6 如果支持proxy (hasProxy) 就用proxy 不支持就用 defineProperty() prox ...

  2. Argus--[优先队列]

    Description A data stream is a real-time, continuous, ordered sequence of items. Some examples inclu ...

  3. Java中getBytes()方法--使用详解

    getBytes()方法详解 在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组.这表示在不同的操作系统下,返回的东西不一样! 1. str.getByte ...

  4. PHP mysqli扩展整理,包括面向过程和面向对象的比较\事务控制\批量执行\预处理

    相关文章:PHP的mysql扩展整理,操作数据库的实现过程分析  PHP PDO扩展整理,包括环境配置\基本增删改查\事务\预处理 介绍 mysqli是PHP程序与mysql数据库进行数据交互的桥梁, ...

  5. Webstorm 配置 Less编译

    配置less编译

  6. H3C配置设备的FTP服务

  7. dotnet 通过 WMI 获取系统启动的服务

    本文告诉大家如何通过 WMI 获取系统启动的服务 通过 Win32_Service 可以获取系统启动的服务 获取的时候只需要拿Caption和State就可以 var mc = "Win32 ...

  8. boostrap-非常好用但是容易让人忽略的地方【4】:Font Awesome

    font-awesome基本用法 官方代码传送门 font-awesome在bootstrap中的特殊用法(这个才是重点) 要点归纳1(官方) 官方代码传送门 要点归纳2(我的) <a href ...

  9. python3中map函数

    map函数是Python里面比较重要的函数 map函数后面必须接的是序列(元组/列表/字符串) 在python2中执行一些语句 >>> map(str,[1,2,3,4]) ['1' ...

  10. unsupported jsonb version number 123

    PostgreSQL  jsonb 入库时遇到   unsupported jsonb version number 123 变通方法 insert into  htclanedata (laneda ...