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 值评价法
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

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