python_聚类算法概述

聚类算法概述

  • 目录
    • 聚类算法定义
    • 聚类算法模型
    • 聚类算法与分类算法对比
    • K-means算法
      • 概述
    • 基本步骤
    • K-means入门实例
      • 客户价值分析
        • 案例指标确定
        • 程序实现

目录

聚类算法定义

聚类分析,即聚类,包括自动发现数据中的自然分组,是一项无监督的机器学习任务。
与监督学习(类似预测建模)不同,聚类算法只解释输入数据,并在特征空间中找到自然组或群集。
聚类分析的所有目标的核心是被群集的各个对象之间的相似程度(或不同程度)的概念。聚类方法尝试根据提供给对象的相似性定义对对象进行分组。
聚类分析是一个迭代过程,在该过程中,对所识别的群集的主观评估被反馈回算法配置的改变中,直到达到期望的或适当的结果。

聚类算法模型

主要包括:K-meansDBSCANDensity Peaks聚类(局部密度聚类)、层次聚类谱聚类及其在此基础上的一些变形。
若按照聚类的方式可划分成三类:
第一类是类似于K-means、DBSCAN、Density Peaks聚类的依据密度的聚类方式;
第二种是类似于层次聚类的依据树状结构的聚类方式;
第三种是类似于谱聚类的依据图谱结构的聚类方式。
这里只以K-means算法为例,简单介绍聚类的使用。

聚类算法与分类算法对比

聚类分类
目的将数据分成多个组已经分好的数据中去学习,将新数据放到已经分号的组中去
所属类型无监督,无需标签进行训练有监督,需要标签进行训练
典型算法K-means,DBSCAN,层次聚类,谱聚类决策树,朴素贝叶斯,逻辑回归

K-means算法

概述

K-Mean算法,即K均值算法,是一种常见的聚类算法。算法会将数据集分为 K 个簇,每个簇使用簇内所有样本均值来表示,将该均值称为“质心”。
算法简单,容易实现。算法聚类时,容易产生空簇;算法可能收敛到局部最小值;容易受初始质心的影响。(没有指定聚类中心,每次聚类的结果可能不同)
距离计算方式是欧式距离。(依据不同的距离计算方法,可在衍生出其他K-means算法)

基本步骤

  1. 从样本中选择 K 个点作为初始质心(完全随机)
  2. 计算每个样本到各个质心的距离,将样本划分到距离最近的质心所对应的簇中
  3. 计算每个簇内所有样本的均值,并使用该均值更新簇的质心
  4. 重复步骤 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)

数据预处理

  • 16
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值