【机器学习】聚类算法|KMeans实现流程|SSE误差平法和|SC轮廓系数法|顾客数据聚类分析案例

文章目录

  • 聚类算法
    • 聚类算法简介
      • 聚类算法分类
    • 聚类算法API
      • 案例 使用KMeans模型数据探索聚类
    • KMeans实现流程***
    • 模型评估方法
      • 误差平方和 SSE(The sum of squares due to error)
        • “肘”方法 (Elbow method) - K值确定
      • SC轮廓系数法(Silhouette Coefficient)
      • 聚类效果评估 – CH轮廓系数法(Calinski-Harabasz Index)
      • 模型评估代码演示
        • SSE 误差平方和
        • SC系数
        • CH系数
    • 案例:顾客数据聚类分析

聚类算法

聚类算法简介

  • 什么是聚类算法?
    • 根据样本之间的相似性,将样本划分到不同的类别中;不同的相似度计算方法,会得到不同的聚类结果,
    • 常用的相似度计算方法有欧式距离法。
    • 聚类算法的目的是在没有先验知识的情况下,自动发现数据集中的内在结构和模式。
    • 无监督学习算法
  • 使用不同的聚类准则,产生的聚类结果不同

在这里插入图片描述

  • 聚类算法在现实中的应用
    • 用户画像,广告推荐,Data Segmentation,搜索引擎的流量推荐,恶意流量识别(搜广推)
    • 基于位置信息的商业推送,新闻聚类,筛选排序
    • 图像分割,降维,识别,离群点检测,信用卡异常消费,发掘相同功能的基因片段
      • 图像分类|目标检测|图像分割

聚类算法分类

  • 1.根据聚类颗粒度分类

在这里插入图片描述

  • 2.根据实现方法分类
    • K-means:按照质心分类,主要介绍K-means,通用、普遍
    • 层次聚类:对数据进行逐层划分,直到达到聚类的类别个数]]
    • DBSCAN聚类(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法
    • 谱聚类是一种基于图论的聚类算法

聚类算法API

sklearn.cluster.KMeans(n_clusters=8)
  • 参数: n_clusters : 开始的聚类中心数量
    • 整型,缺省值=8,生成的聚类数,及产生的质心数
  • 方法
    • estimator.fit(x)
    • estimator.predict(x)
    • estimator.fit_predict(x)
    • 计算聚类中心并预测每个样本属于哪个类别,相当于先调用fit(x),然后再调用predict(x)
    • calinski_harabasz_score(x,y_pred) 用来评估聚类效果,数值越大越好

案例 使用KMeans模型数据探索聚类

  • 随机创建不同二维数据集作为训练集,并结合k-means算法将其聚类,尝试分别聚类不同数量的簇,并观察聚类效果:

在这里插入图片描述

  • 实现流程

    • 1.导入依赖包
      • sklearn.cluster.KMeans
      • sklearn.datasets.make_blobs
    • 2.构建数据集
    • 3.模型训练并预测(实例化Kmeans)
    • 4.展示聚类效果
    • 5.评估聚类效果好坏
  • 代码实现

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import calinski_harabasz_score
import matplotlib.pyplot as plt# 构建数据集1000个样本,每个样本2个特征4个质心簇数据标准差0.4 0.2 0.2 0.2
x, y = make_blobs(n_samples=1000, n_features=2, centers=4, cluster_std=[0.4, 0.2, 0.2, 0.2], random_state=9)
plt.figure()
plt.scatter(x[:, 0], x[:, 1], marker='o')
plt.show()# 使用k_means聚类
estimator = KMeans(n_clusters=3, random_state=21, n_init='auto')
estimator.fit(x)
y_predict = estimator.predict(x)
# 展示聚类结果
plt.figure()
plt.scatter(x[:, 0], x[:, 1], marker='o', c=y_predict)
plt.show()# 模型评估 使用CH方法评估
print(calinski_harabasz_score(x, y_predict))
  • 运行结果

    • 预测前

      在这里插入图片描述

    • 预测后

在这里插入图片描述

在这里插入图片描述

KMeans实现流程***

  • 1、事先确定常数K ,常数K意味着最终的聚类类别数
  • 2、随机选择 K 个样本点作为初始聚类中心
  • 3、计算每个样本到 K 个中心的距离,选择最近的聚类中心点作为标记类别
  • 4、根据每个类别中的样本点,重新计算出新的聚类中心点(平均值),如果计算得出的新中心点
    ​ 与原中心点一样则停止聚类,否则重新进行第 2 步过程,直到聚类中心不再变化

模型评估方法

误差平方和 SSE(The sum of squares due to error)

在这里插入图片描述

  • Ci 表示簇
  • k 表示聚类中心的个数
  • p 表示某个簇内的样本
  • m 表示质心点

在这里插入图片描述

结论:SSE 越小,表示数据点越接近它们的 中心,聚类效果越好

“肘”方法 (Elbow method) - K值确定
  • “肘” 方法通过 SSE 确定 n_clusters 的值
    • 对于n个点的数据集,迭代计算 k (from 1 to n),每次聚类完成后计算 SSE
    • SSE 是会逐渐变小的,因为每个点都是它所在的簇中心本身。
    • SSE 变化过程中会出现一个拐点,下降率突然变缓时即认为是最佳 n_clusters 值。
    • 在决定什么时候停止训练时,肘形判据同样有效,数据通常有更多的噪音,在增加分类无法带来更多回报时,我们停止增加类别。

在这里插入图片描述

SC轮廓系数法(Silhouette Coefficient)

  • 轮廓系数法考虑簇内的内聚程度(Cohesion),簇外的分离程度(Separation)。其计算过程如下
    • 对计算每一个样本 i 到同簇内其他样本的平均距离𝑎i,该值越小,说明簇内的相似程度越大
    • 计算每一个样本 i 到最近簇 j 内的所有样本的平均距离 bij,该值越大,说明该样本越不属于其他簇 j
    • 根据下面公式计算该样本的轮廓系数:S = b −a/max⁡(a, b)
    • 计算所有样本的平均轮廓系数
    • 轮廓系数的范围为:[-1, 1]

在这里插入图片描述

  • 结论: SC值越大,聚类效果越好

聚类效果评估 – CH轮廓系数法(Calinski-Harabasz Index)

  • CH系数考虑簇内的内聚成程度,簇外的离散程度,质心的个数

    • 类别内部数据的距离平方和越小越好,类别之间的距离平方和越大越好.聚类的种类数越少越好

    在这里插入图片描述

  • SSW 的含义:相当于SSE,蔟内距离

    • C_pi表示质心
    • x_i表示某个样本
    • SSW 值是计算每个样本点到质心的距离,并累加起来
    • SSW 表示表示簇内的内聚程度,越小越好
  • SSB 的含义:簇间距离

    • C_j表示质心,X ̅ 表示质心与质心之间的中心点,n_j表示样本的个数
    • SSB 表示簇与簇之间的分离程度,SSB 越大越好
    • m 表示样本数量
    • k 表示质心个数
  • 结论: CH值越大,聚类效果越好

模型评估代码演示

SSE 误差平方和
from sklearn.cluster import KMeans  # K-Means
import matplotlib.pyplot as plt  # 画图
from sklearn.datasets import make_blobs  # 生成数据
from sklearn.metrics import calinski_harabasz_score  # 轮廓系数def dm01():x, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],cluster_std=[0.4, 0.2, 0.2, 0.2], random_state=22)sse_list = []for clu_num in range(1, 100):my_kmeans = KMeans(n_clusters=clu_num, max_iter=100, random_state=0)my_kmeans.fit(x)sse_list.append(my_kmeans.inertia_)  # 获取sse的值添加到列表中# 展示效果plt.figure(figsize=(18, 8), dpi=100)plt.xticks(range(0, 100, 3), labels=range(0, 100, 3))plt.grid()plt.title("sse")plt.plot(range(1, 100), sse_list, 'or-')plt.show()if __name__ == '__main__':dm01()

运行结果: 根据肘方法得出 4的时候效果最好

在这里插入图片描述

SC系数
from sklearn.cluster import KMeans  # K-Means
import matplotlib.pyplot as plt  # 画图
from sklearn.datasets import make_blobs  # 生成数据
from sklearn.metrics import calinski_harabasz_score, silhouette_score  # 轮廓系数
def dm02():# 2.构建数据,产生数据random_state=22固定好x, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],cluster_std=[0.4, 0.2, 0.2, 0.2], random_state=22)# 3.模型训练及SC系数tmp_list = []for clu_num in range(2, 100):my_kmeans = KMeans(n_clusters=clu_num, max_iter=100, random_state=0)my_kmeans.fit(x)ret = my_kmeans.predict(x)tmp_list.append(silhouette_score(x, ret))  # SC系数# 4.效果展示plt.figure(figsize=(18, 8), dpi=100)plt.xticks(range(0, 100, 3), labels=range(0, 100, 3))plt.grid()plt.title('sse')plt.plot(range(2, 100), tmp_list, 'ob-')plt.show()if __name__ == '__main__':dm02()

运行结果: 在取4时SC值最大

在这里插入图片描述

CH系数
from sklearn.cluster import KMeans  # K-Means
import matplotlib.pyplot as plt  # 画图
from sklearn.datasets import make_blobs  # 生成数据
from sklearn.metrics import calinski_harabasz_score, silhouette_score  # 轮廓系数def dm03():# 2.构建数据,产生数据random_state=22固定好x, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],cluster_std=[0.4, 0.2, 0.2, 0.2], random_state=22)# 3.模型训练及CHtmp_list = []for clu_num in range(2, 100):my_kmeans = KMeans(n_clusters=clu_num, max_iter=100, random_state=0)my_kmeans.fit(x)ret = my_kmeans.predict(x)tmp_list.append(calinski_harabasz_score(x, ret))  # CH# 4.展示效果plt.figure(figsize=(18, 8), dpi=100)plt.xticks(range(0, 100, 3), labels=range(0, 100, 3))plt.grid()plt.title('ch')plt.plot(range(2, 100), tmp_list, 'og-')plt.show()if __name__ == '__main__':dm03()

运行结果: 在4时CH结果最大

在这里插入图片描述

案例:顾客数据聚类分析

  • 已知:客户性别、年龄、年收入、消费指数
  • 需求:对客户进行分析,找到业务突破口,寻找黄金客户

在这里插入图片描述

  • 客户分群效果展示:

在这里插入图片描述

从图中可以看出聚成5类,右上角属于挣的多,消费的也多黄金客户群

  • 代码实现
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.metrics import silhouette_scoredef demo01():# 读取数据data = pd.read_csv('../data/customers.csv')# 特征选择x = data.iloc[:, [3, 4]]# 模型训练mysse = []mysscore = []for i in range(2, 11):myKmeans = KMeans(n_clusters=i)myKmeans.fit(x)mysse.append(myKmeans.inertia_)  # 簇内误差平方和ret = myKmeans.predict(x)mysscore.append(silhouette_score(x, ret))  # SC系数 聚类需要1个以上的类别# 数据可视化效果展示plt.plot(range(2, 11), mysse)plt.title('the elbow method')plt.xlabel('number of clusters')plt.ylabel('mysse')plt.grid()plt.show()plt.title('sh')plt.plot(range(2, 11), mysscore)plt.grid(True)plt.show()def demo02():# 2.读取数据及数据预处理dataset = pd.read_csv('../data/customers.csv')X = dataset.iloc[:, [3, 4]]# 3.模型训练及预测mykeans = KMeans(n_clusters=5)mykeans.fit(X)y_kmeans = mykeans.predict(X)# 4.聚类效果展示# 把类别是0的, 第0列数据,第1列数据, 作为x/y, 传给plt.scatter函数plt.scatter(X.values[y_kmeans == 0, 0], X.values[y_kmeans == 0, 1], s=100, c='red', label='Standard')# 把类别是1的, 第0列数据,第1列数据, 作为x/y, 传给plt.scatter函数plt.scatter(X.values[y_kmeans == 1, 0], X.values[y_kmeans == 1, 1], s=100, c='blue', label='Traditional')# 把类别是2的, 第0列数据,第1列数据, 作为x/y, 传给plt.scatter函数plt.scatter(X.values[y_kmeans == 2, 0], X.values[y_kmeans == 2, 1], s=100, c='green', label='Normal')plt.scatter(X.values[y_kmeans == 3, 0], X.values[y_kmeans == 3, 1], s=100, c='cyan', label='Youth')plt.scatter(X.values[y_kmeans == 4, 0], X.values[y_kmeans == 4, 1], s=100, c='magenta', label='TA')plt.scatter(mykeans.cluster_centers_[:, 0], mykeans.cluster_centers_[:, 1], s=300, c='black', label='Centroids')plt.title('Clusters of customers')plt.xlabel('Annual Income (k$)')plt.ylabel('Spending Score (1-100)')plt.legend()plt.show()if __name__ == '__main__':demo01()demo02()
  • 效果展示

在这里插入图片描述

在这里插入图片描述

通过肘方法、SH系数都可以看出,聚成5类效果最好

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/451391.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务--OpenFeign【重点】

如果哪天 我们硬编码写的接口变了,只要写过该接口的 都要改,太麻烦了, 所以 就用 OpenFeign 来解决这个麻烦 了解: SimpleClientHttpRequestFactory和 HttpComponentsClientHttpRequestFactory 都是Spring框架中用于创建ClientH…

sentinel原理源码分析系列(六)-统计指标

调用链和统计节点构建完成,进入统计指标插槽,统计指标在最后执行的,等后面的插槽执行完,资源调用完成了,根据资源调用情况累计。指标统计是最重要的插槽,所有的功能都依靠指标数据,指标的正确与…

尤雨溪都点赞的表单校验解决方案,到底多么强

尤雨溪都点赞的表单校验解决方案,到底多么强 如果你是 Vue 开发者,那么 Vorms 绝对是你不能错过的表单验证利器。本文将带你快速了解 Vorms 的基本功能、特点和如何简单使用它提升你的开发体验。 软件简介 Vorms 是一个基于 Vue 3 组合式 API 的表单验证…

STL——string类

前言 从本篇博客开始,就正式来介绍STL的正式内容,STL在C中的学习中非常重要,具有举足轻重的地位,这块儿内容会给我们提供很多现成的接口,可以大大简化我们的代码,我们之前用C语言写的代码将会被极大地简化…

【数据分享】全国能源-电力平衡表(2000-2020年)

数据介绍 一级标题指标名称单位能源电力可供量亿千瓦小时能源电力生产量亿千瓦小时能源水电生产电力量亿千瓦小时能源火电生产电力量亿千瓦小时能源核电生产电力量亿千瓦小时能源风电生产电力量亿千瓦小时能源电力进口量亿千瓦小时能源电力出口量亿千瓦小时能源电力能源消费总量…

007、链表的回文结构

0、题目描述 链表回文结构 1、法1 一个复杂的问题可以拆解成几个简单的问题,找中间节点和逆置链表(翻转链表)之前都做过。 class PalindromeList { public://1、找中间节点ListNode* FindMid(ListNode* A){if (A nullptr || A->next …

设计模式03-装饰模式(Java)

4.4 装饰模式 1.模式定义 不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。 2.模式结构 抽象构件角色 :定义一个抽象接口以规范准备接收附加责任的对象。客户端可以方便调用装饰类和被装饰类…

基于STM32的电动汽车遥控器设计

引言 本项目设计了一个基于STM32的电动汽车遥控器,能够通过无线通信(如蓝牙或射频模块)控制电动汽车的前进、后退、左右转向等动作。该遥控器采用按键或摇杆操作,并通过无线模块将控制指令发送给汽车控制端,实现远程操…

吴恩达深度学习笔记(8)

计算机视觉 包括:图像分类也叫做图像识别、目标检测等 一个小的图像可能1M,但是他的像素是一个超级大向量,如果直接深度学习那么运算量会很大,因此需要运用卷积运算。 卷积运算是卷积神经网络的基础单元之一。下面用边缘检测理…

FastGPT本地开发 之 通过Navicat管理MongoDB、PostgreSQL数据库

1. 背景 前期已经完成FastGPT的本地化部署工作,通过Docker启动FastGPT的相关容器即可运行。(共6个容器) 2.本地化开发 2.1 前置依赖 2.2 源码拉取 git clone gitgithub.com:labring/FastGPT.git2.3 数据库管理 本地化运行的FastGPT使用…

leetcode73矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2: 输入&…

【含开题报告+文档+PPT+源码】基于SpringBoot和Vue的编程学习系统

开题报告 随着信息技术的迅猛发展和数字化转型的深入推进,编程技能已经成为现代社会中不可或缺的一项基本能力。无论是软件开发、数据分析还是人工智能等领域,编程都扮演着至关重要的角色。因此,培养和提高编程技能对于个人职业发展和社会创…

eNSP静态路由

1、实现全网通,考虑环形拓扑的优势。 R12: [Huawei]interface GigabitEthernet 0/0/0 [Huawei-GigabitEthernet0/0/0]ip address 192.168.1.1 24[Huawei]interface GigabitEthernet 0/0/1 [Huawei-GigabitEthernet0/0/1]ip address 192.168.2.1 24[Huawei]interfa…

软件设计模式------工厂方法模式

工厂方法模式(Factory Method Pattern),又称工厂模式,也叫虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Pactory Pattern),属于类创建型模式。 我们知道…

Spring数据源对象管理:基于XML配置文件的第三方bean管理

前言 第三方资源配置管理 ioc容器和依赖管理,我们大多数管理的是自己创建的bean,如果是第三方提供的bean是如何管理,我们以数据源对象的ioc管理为例子进行说明。 步骤 第一步: 需要导入相应的依赖包(导入坐标&#xf…

解构OpenAI swarm:利用Cursor进行框架分析与示例运行

解构OpenAI SWARM:利用Cursor进行框架分析与示例运行 1. 引言 在AI技术日新月异的今天,OpenAI再次为我们带来了惊喜。SWARM框架作为其最新研究成果,正在开创多智能体协作的新纪元。本文将带您深入探索这一框架,通过Cursor工具进行代码分析,并手把手教您安装运行SWARM。无论您…

Data+AI下的数据湖和湖仓一体发展史

DataAI下的数据湖和湖仓一体发展史 前言数据湖的“前世今生”AI时代的救星:湖仓一体湖仓一体实践演进未来趋势:智能化、实时化结语 前言 数据湖?湖仓一体?这是什么高科技新名词? 别急,我们慢慢聊。想象一…

机器学习:opencv--风格迁移

目录 前言 一、代码及步骤解释 1.图片与处理 2.加载模型 3.输出图像 前言 风格迁移(Style Transfer)是一种计算机视觉技术,旨在将一种图像的艺术风格应用到另一种图像上,同时保持其内容。 一、代码及步骤解释 1.图片与处理 …

从Apple Intelligence到远程机器人手术:更快、更安全的网络成企业业务关键

过去,企业的业务模式和网络架构相对简单,数据传输量不大,远程访问需求也不多。企业对网络的要求主要集中在确保基本的连通性和可用性。如今,企业通过将产品与各项高新技术深度融合,赋予传统产品活力和竞争力。以苹果公…