5.2.2 K-Mean聚类算法

K-Means算法是典型的基于距离的非层次聚类算法,在最小化误差函数的基础上将数据换分为预定的类数K,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。
算法过程

  1. 从N个样本数据中随机选取K个对象作为初始的聚类中心
  2. 分别计算各个样本到各个聚类中心的距离,将对象分配到最近的聚类中。
  3. 所有对象分配完后,重新计算K个聚类的中心。
  4. 与前一次计算得到的K个聚类中心比较,如果聚类中心发生变化,转过程2,否则转过程5
  5. 当质心不发生变化时,停止并输出聚类结果

连续属性
要先对各个属性值进行 零 - 均值规范,再进行距离计算。在K-Means中聚类算法中,一般需要度量样本之间的距离、样本与簇之间的距离、簇与簇之间的距离

零-均值规范化
也称为标准差标准化,经过处理的数据的均值为0,标准差为1。
转化公式:当前使用最多的数据标准化方法
x^* = \frac{x - \bar x} {\sigma}
\bar x 为原始数据的均值, \sigma为原始数据的标准差

实践中,为得到较好的结果,通常选择不同初始聚类中心,多次运行K-Means算法。
在所有对象分配完成后,重新计算K个聚类的中心时,对于连续数据,聚类中心取该簇的均值,但当样本的某些属性是分类变量时,均值可能无定义,可以使用K-众数方法。

使用误差平法和SSE(sum of squared errors)作为度量聚类质量的目标函数,对于两种不同的聚类结果,选择误差平方和较小的分类结果
连续属性的SSE计算公式: SSE=\sum_{i=1}^k\sum_{x\epsilon E_i} dist(e_i, x)^2

文档数据的SSE计算公式: SSE =\sum_{i=1}^k\sum_{x\epsilon E_i}cos(e_i, x)^2

簇 E_i的聚类中心 e_i 计算公式为: e_i = {\frac 1n_i}\sum_{x\epsilon E_i}x

E_i : 第i个簇
K: 聚类簇的个数
x: 对象样本
e_i: 簇E_i的聚类中心
n_i: 第i个簇中样本的个数

案例

消费行为特征数据 聚类分析

采用K-Means算法,设定聚类个数K为3,最大迭代次数为500次,距离函数区欧式距离

import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 初始化参数
inputfile = './data/consumption_data.xls'  # 销量及其他属性数据
outputfile = './data/data_type_2.xls'        # 保存结果
k = 3
iteration = 500

data = pd.read_excel(inputfile, index_col = 'Id')  # 读取数据
data_zs = 1.0 * (data - data.mean()) / data.std()  # 数据标准化

model = KMeans(n_clusters=k, n_jobs=4, max_iter=iteration)
model.fit(data_zs)

# 打印结果
r1 = pd.Series(model.labels_).value_counts()  # 统计各个类别数目
r2 = pd.DataFrame(model.cluster_centers_)     # 找出聚类中心

r = pd.concat([r1, r2], axis=1)  # 横向连接(0是纵向), 得到聚类中心对应得类别下的数目
r.columns = list(data.columns) + [u'类别数目']  # 重命名表头

# 详细输出原始数据及其类别
r = pd.concat([data, pd.Series(model.labels_, index = data.index )], axis=1)
r.columns = list(data.columns) + [u'聚类类别']  # 重命名表头
r.to_excel(outputfile)  # 保存结果

def density_plot(data):
    plt.figure(figsize=(12, 6))  # 设置画布大小
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号
    p = data.plot(kind='kde', linewidth=2, subplots=True, sharex=False)
    [p[i].set_ylabel(u'密度') for i in range(k)]
    plt.legend()
    return plt

pic_output = './data/pd_'  # 概率密度图文件名前缀
for i in range(k):
    density_plot(data[r[u'聚类类别'] == i]).savefig(u'%s%s.png' %(pic_output, i))


image.png
image.png

总结
分群1特点:R间隔相对较大,主要集中在3080天;消费次数集中在015次;消费金额在:0~2000;
分群2特点:R间隔相对较小,主要集中在030天;消费次数集中在010次;消费金额在:0~1800;
分群3特点:R间隔相对较小,主要集中在030天;消费次数集中在1025次;消费金额在:500~2000;
对比分析
分群3时间间隔短,消费次数多,消费金额大,是高消费、高价值人群。
分群2时间间隔、消费次数、消费金额中等水平,代表着一般价值客户。
分群1时间间隔长、消费次数较少、消费金额不是特别高,价值较低的客户群体。

聚类分析算法评价

  • purity 评价法
  • RI 评价法
  • F 值评价法
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 聚类算法 前面介绍的集中算法都是属于有监督机器学习方法,这章和前面不同,介绍无监督学习算法,也就是聚类算法。在无监...
    飘涯阅读 41,502评论 3 52
  • 本篇结构 简介 聚类算法的分类 K-Means聚类算法 DBSCAN聚类算法 本篇介绍了聚类算法的种类,重点关注K...
    w1992wishes阅读 7,555评论 0 14
  • K-Means原理K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。...
    yalesaleng阅读 5,066评论 0 6
  • 1. 聚类分析的典型应用场景 聚类分析的一个重要用途就是针对目标群体进行多指标的群体划分,类似这种目标群体的分类就...
    熊定坤阅读 30,129评论 0 4
  • 今天是什么日子 起床:7:30 就寝:8:30 天气:阴天 心情:很美丽 纪念日:第一天用简书 任务清单 昨日完成...
    沉稳大气的小金鱼阅读 158评论 0 1