聚类算法概述
- 目录
- 聚类算法定义
- 聚类算法模型
- 聚类算法与分类算法对比
- K-means算法
- 概述
- 基本步骤
- K-means入门实例
- 客户价值分析
- 案例指标确定
- 程序实现
目录
聚类算法定义
聚类分析,即聚类,包括自动发现数据中的自然分组,是一项无监督的机器学习任务。
与监督学习(类似预测建模)不同,聚类算法只解释输入数据,并在特征空间中找到自然组或群集。
聚类分析的所有目标的核心是被群集的各个对象之间的相似程度(或不同程度)的概念。聚类方法尝试根据提供给对象的相似性定义对对象进行分组。
聚类分析是一个迭代过程,在该过程中,对所识别的群集的主观评估被反馈回算法配置的改变中,直到达到期望的或适当的结果。
聚类算法模型
主要包括:K-means
、DBSCAN
、Density Peaks聚类
(局部密度聚类)、层次聚类
、谱聚类
及其在此基础上的一些变形。
若按照聚类的方式可划分成三类:
第一类是类似于K-means、DBSCAN、Density Peaks聚类的依据密度的聚类方式;
第二种是类似于层次聚类的依据树状结构的聚类方式;
第三种是类似于谱聚类的依据图谱结构的聚类方式。
这里只以K-means算法为例,简单介绍聚类的使用。
聚类算法与分类算法对比
聚类 | 分类 | |
---|---|---|
目的 | 将数据分成多个组 | 从已经分好的数据中去学习,将新数据放到已经分号的组中去 |
所属类型 | 无监督,无需标签进行训练 | 有监督,需要标签进行训练 |
典型算法 | K-means,DBSCAN,层次聚类,谱聚类 | 决策树,朴素贝叶斯,逻辑回归 |
K-means算法
概述
K-Mean算法,即K均值算法,是一种常见的聚类算法。算法会将数据集分为 K 个簇,每个簇使用簇内所有样本均值来表示,将该均值称为“质心”。
算法简单,容易实现。算法聚类时,容易产生空簇;算法可能收敛到局部最小值;容易受初始质心的影响。(没有指定聚类中心,每次聚类的结果可能不同)
距离计算方式是欧式距离。(依据不同的距离计算方法,可在衍生出其他K-means算法)
基本步骤
- 从样本中选择 K 个点作为初始质心(完全随机)
- 计算每个样本到各个质心的距离,将样本划分到距离最近的质心所对应的簇中
- 计算每个簇内所有样本的均值,并使用该均值更新簇的质心
- 重复步骤 2与 3,直到达到以下条件之一:
(1)质心的位置变化小于指定的阈值(默认为 0.0001,可手动设置)
(2)达到最大迭代次数
K-means入门实例
客户价值分析
评价模型:RFC模型
评价指标:最近消费时间间隔(Recency)、消费频率(Frequency)和消费金额(Monetary)来进行客户细分,识别出价值高的客户,简称RFC模型。
在RFC模型中,消费金额表示在一段时间内,客户购买产品的总金额。本例用航空公司客户分析中,用在一段时间内的累计飞行里程M和客户在一定时间内乘坐舱位的折扣系数C代表消费金额。再在模型中增加客户关系长度L,构成LRFMC模型。
案例指标确定
时间间隔(LR)
- L=LOAD_TIME - FFP_DATE(观测窗口的结束时间 - 入会时间)
- R=LAST_TO_END(最后一次乘坐飞机距观测窗口结束的时长)
消费频率(F)
- F=FLIGHT_COUNT(观测窗口内的飞行次数)
消费金额(MC)
- M=SEG_KM_SUM(观测窗口内的总飞行里程)
- C=AVG_DISCOUNT(平均折扣率)
程序实现
头文件与参数设置
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
data = pd.read_csv(r"./航空公司客户数据/air_data.csv")
# print(data.info())
数据预处理
# 过滤不合理数据
# 过滤票价为空的记录
temp_data = data[data["SUM_YR_1"].notnull() & data["SUM_YR_2"].notnull()]
# 保留,票价非0或者总飞行里程数为0且平均则扣为0(积分兑换?)的记录
temp_data = temp_data[(temp_data["SUM_YR_1"] != 0) | (temp_data["SUM_YR_2"] != 0)
| ((temp_data["SEG_KM_SUM"] == 0) & (temp_data["avg_discount"] == 0))]
# 选取指标相关指标
temp_data = temp_data[['LOAD_TIME', 'FFP_DATE', 'LAST_TO_END', 'FLIGHT_COUNT', 'SEG_KM_SUM','avg_discount']]
# 观察在有效数据中是否存在空值
print(temp_data.isnull().sum())
# 时间格式转换
temp_data["L"] = (pd.to_datetime(temp_data["LOAD_TIME"]) - pd.to_datetime(temp_data["FFP_DATE"])).dt.days
# 修改列标签
temp_data.columns=["截止日期", "入会日期", "R", "F", "M", "C", "L"]
# 去除多余数据
temp_data = temp_data[["R", "F", "M", "C", "L"]]
# 标准差标准化,处理后的数据均值为0,标准差为1
temp_data = (temp_data - temp_data.mean(axis=0))/(temp_data.std(axis=0))
# 修改列标签
temp_data.columns=['Z'+i for i in temp_data.columns]
print(temp_data)
数据预处理