「数据挖掘入门序列」数据挖掘模型分类与预测 - 聚类

与分类不同,聚类是在没有给定分类的情况下,根据数据相似度进行分组的一种方法。聚类模型可以建立在无类标记的数据上,是一种非监督学习算法。聚类根据数据自身的距离或相似度划分为若干组,划分的原则是组内距离最小化,而组间距离最大化。如下图所示:

image

常见的聚类算法如下:K-Means、K-中心点、系统聚类

K-Means聚类算法

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

K-Means聚类算法过程

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

聚类的结果可能依赖于初始聚类中心的随机选择,可能使得结果严重偏离全局最优分类。实际中,为了得到较好的结果,通常选择不同的初始聚类中心,多次运行 K-Means算法。

对于连续数据,聚类中心可以取该簇的均值

对于分类变量,可以使用K-众数

连续属性相似性的度量

在K-Means聚类算法中,一般需要度量样本之间的距离、样本与簇之间的距离以及簇与簇之间的距离。度量样本之间的相似性最常用的是欧几里得距离曼哈顿距离闵可夫斯基距离。

设样本与簇之间的距离可以用样本到簇中心的距离:image

簇与簇之间的距离可以用簇中心的距离:image

用p个属性来表示n个样本的数据矩阵如下:

image

欧几里得距离:

image

曼哈顿距离:

image

闵可夫斯基距离:

image

其中q为正整数,q = 1时为曼哈顿距离,q = 2时为欧几里得距离。

示例

以下有客户消费行为的数据。根据这些客户的消费行为数据分类层不同的客户群,并评价这些客户群的价值。

image

其中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')

image

posted @ 2020-01-31 16:16  斜杠代码日记  阅读(844)  评论(0编辑  收藏  举报