与分类不同,聚类是在没有给定分类的情况下,根据数据相似度进行分组的一种方法。聚类模型可以建立在无类标记的数据上,是一种非监督学习算法。聚类根据数据自身的距离或相似度划分为若干组,划分的原则是组内距离最小化,而组间距离最大化。如下图所示:
常见的聚类算法如下:K-Means、K-中心点、系统聚类
K-Means聚类算法
K-Means算法是典型的基于距离的非层次聚类算法,在最下化误差函数的基础上将数据划分为预定的类数K,采用距离作为相似性的评价指标,即:认为两个对象的距离越近,其相似度就越大。
K-Means聚类算法过程
- 从N个样本数据中随机选取K个对象作为初始的聚类中心
- 分别计算每个样本到各个聚类中心的距离,将对象分配到距离最近的聚类中
- 所有对象分配完成后,重新计算K个聚类的中心
- 与前一次计算得到的K个聚类中心比较,如果聚类中心发生变化,转到过程2),否则转到过程5)
- 但中心不发生变化时,停止并输出聚类结果
聚类的结果可能依赖于初始聚类中心的随机选择,可能使得结果严重偏离全局最优分类。实际中,为了得到较好的结果,通常选择不同的初始聚类中心,多次运行 K-Means算法。
对于连续数据,聚类中心可以取该簇的均值
对于分类变量,可以使用K-众数
连续属性相似性的度量
在K-Means聚类算法中,一般需要度量样本之间的距离、样本与簇之间的距离以及簇与簇之间的距离。度量样本之间的相似性最常用的是欧几里得距离、曼哈顿距离和闵可夫斯基距离。
用p个属性来表示n个样本的数据矩阵如下:
欧几里得距离:
曼哈顿距离:
闵可夫斯基距离:
其中q为正整数,q = 1时为曼哈顿距离,q = 2时为欧几里得距离。
示例
以下有客户消费行为的数据。根据这些客户的消费行为数据分类层不同的客户群,并评价这些客户群的价值。
其中R为最近一次消费时间间隔、F为消费频率、M为消费总金额。
测试数据已经上传到百度网盘:https://pan.baidu.com/s/1v8y-FNQ8wN_kDBdHcYkjyA
本案例采用K-Means聚类算法,设定聚类个数为3,最大迭代次数为500次,距离函数取欧氏距离。
#-*- coding: utf-8 -*- import pandas as pd # 设置聚类的类别数量 k = 3 # 聚类最大循环次数 iteration = 500 # 1. 使用pandas读取数据文件 data = pd.read_excel('consumption_data.xls', index_col='Id') # 2. 数据标准化 data_zs = 1.0 * (data - data.mean()) / data.std() # 3. 导入K-Means模型 from sklearn.cluster import KMeans # 构建模型 # 设置k个分类、并发数为4 model = KMeans(n_clusters = k, n_jobs = 4, max_iter = iteration) # 开始聚类 model.fit(data_zs) # 4. 打印结果 # 4.1 统计各个类别的数目 r1 = pd.Series(model.labels_).value_counts() # 4.2 找出聚类中心 r2 = pd.DataFrame(model.cluster_centers_) # 4.3 得到聚类中心对应的类别下的数目 r = pd.concat([r2, r1], axis = 1) r.columns = list(data.columns) + [u'类别数目'] print r # 详细输出原始数据及其类别 r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1) r.columns = list(data.columns) + [u'聚类类别'] r.to_excel('data_type.xls')