数学建模--K-Means聚类分析

目录

1.聚类分析步骤

1.1简单介绍

1.2两个概念

1.3几种距离

1.4更新质心

1.5终止条件

2.归一化处理

3.肘部法则

4.搭建K-Means分析模型

5.选择最佳K值

6.绘制3D图形


1.聚类分析步骤

1.1简单介绍

K-Means聚类分析是属于聚类分析的一种,这个数据机器学习的算法;

对数据进行自动分组,使得同一组内的数据样本尽可能相似,不同组之间的数据样本尽可能不同,以此来完成用户细分,这就是聚类。

K-Means是非监督学习中一种很经典的聚类算法。

K代表类别数量,Means代表每个类别内的均值,所以K-Means算法又称为K-均值算法。

1.2两个概念

该算法会根据数据样本间的相似性,将数据样本自动分为K个(cluster),相似的数据样本会尽可能被聚到一个簇内。簇,指的就是类别或是组。

每个簇都有一个中心位置/中心点,被称作为质心(centroid)。

  1. 最开始,会先从数据集中随机选取K=2个对象作为初始的质心。
  2. 剩余待分类的样本数据就可以评估自己和哪个质心最相似,然后加入到该质心代表的簇里即可。

1.3几种距离

  • 要判断两个样本之间的相似性,K-Means算法以样本间的距离作为度量标准。
  • 距离越近,表示两个样本越相似;反之,则越不相似。
  • 常见的计算样本间距离的方式有欧式距离曼哈顿距离余弦相似度等。
  • K-Means算法通常采用欧式距离来度量各样本间的距离。

1.4更新质心

  • 由于一开始的质心是随机选择的,导致结果也存在一定的随机性。
  • 因此,当所有样本点分配完成后,需要重新计算2个簇的质心。
  • 计算方式是计算每个簇内所有样本的均值。
  • 如果此时计算出的均值和之前的初始质心不一样,就要使用该均值更新这个簇的质心。这就是K-Means算法又称为K均值算法的原因。

1.5终止条件

更新这个质心之后,我们需要不断地进行这个求解距离和计算均值的过程,不断的进行重复,我们通常会设置一个最小值,当质心的位置变化小于该值时,就停止。 

或者我们自己设置这个迭代的次数,达到这个最大迭代次数就停止;

2.归一化处理

我们这个聚类分析是为了解决这个RFM模型的遗留问题,就是这个RFM进行这个划分的时候是使用的这个数据分箱的操作,回顾一下,就是根据这个等级进行划分,我们给定这个需要进行划分的区间个数,确定这个具体每一个区间的范围,这个时候我们的这个数据分箱就完成了,但是这个数据分箱有局限性,我们使用聚类进行这个过程的优化;

我们下面的这三个特征向量的差距比较大,因此我们进行归一化处理,这个有公式,但是我们理解即可,我们直接使用这个python里面的模块进行计算即可;

1. 导入模块:从sklearn.preprocessing模块中导入用于归一化的StandardScaler类;

2. 实例化:创建一个StandardScaler对象,不需要传入参数;

3. 数据归一化:调用StandardScaler对象中的fit_transform()函数,对x进行归一化。

# 导入pandas模块,简称pd
import pandas as pd'''读取数据集并获取特征变量'''
# 读取文件,并赋值给变量df
df = pd.read_csv("/Users/user_info/new_user_info.csv")# 获取特征变量x
x = df[["time_gap","order_count","total_amount"]]'''数据归一化'''
# TODO 导入sklearn.preprocessing模块中的StandardScaler类
from sklearn.preprocessing import StandardScaler# TODO 创建一个StandardScaler对象,并赋值给变量scaler
scaler = StandardScaler()# TODO 调用scaler中的fit_transform()函数,对x进行归一化,并赋值给变量x_scale
x_scale = scaler.fit_transform(x)# TODO 输出x_scale进行查看
print(x_scale)

3.肘部法则

我们之前是把这个PRM模型分成了8个部分,2*2*2=8,但是这个划分的结果不一定科学,到底划分为几个类别最合适,这个时候我们可以借助这个肘部法则确定我们的k值;

4.搭建K-Means分析模型

下面这个搭建模型的步骤就是:

  1. STEP1. 导入模型
  2. STEP2. 初始化模型,设置参数
  3. STEP3. 训练模型
  4. STEP4. 获取结果
# 导入pandas模块,简称pd
import pandas as pd'''读取数据集并获取特征变量'''
# 读取文件,并赋值给变量df
df = pd.read_csv("/Users/user_info/new_user_info.csv")# 获取特征变量x
x = df[["time_gap","order_count","total_amount"]]'''数据归一化'''
# 导入StandardScaler类
from sklearn.preprocessing import StandardScaler# 创建一个StandardScaler对象
scaler = StandardScaler()# 对x进行归一化
x_scale = scaler.fit_transform(x)# 将x_scale从二维数组转换为DataFrame
x_scale = pd.DataFrame(x_scale, columns=x.columns, index=x.index)'''搭建K-Means模型'''
# 导入sklearn.cluster模块中的KMeans模型
from sklearn.cluster import KMeans# 使用KMeans()初始化模型
# 设置参数n_clusters=3,,表示的就是聚类的数量就是3
# random_state=1保证程序每一次运行的效果都是一样的
# 将结果赋值给model
model = KMeans(n_clusters=3, random_state=1)# 使用fit()函数训练模型
model.fit(x_scale)# 获取聚类后的质心
print(f"质心:{model.cluster_centers_}")
# 获取每个样本所属的簇
print(f"标签:{model.labels_}")
# 获取SSE,误差平方和
print(f"SSE:{model.inertia_}")

5.选择最佳K值

STEP1.导入KMeans模型;

STEP2.创建一个空列表sseList,用于存储每次的SSE;

STEP3.取不同的K值,本例中我们取1至9,多次进行K-Means的聚类;

STEP4.获取当前的SSE,并使用append()函数将其添加到sseList中;

STEP5.在for循环外,输出sseList;

STEP6.绘制折线图展现结果,设置K值为x轴,sseList为y轴,marker为"o"。

# 导入pandas模块,简称pd
import pandas as pd'''读取数据集并获取特征变量'''
# 读取文件,并赋值给变量df
df = pd.read_csv("/Users/user_info/new_user_info.csv")# 获取特征变量x
x = df[["time_gap","order_count","total_amount"]]'''数据归一化'''
# 导入sklearn.preprocessing模块中的StandardScaler类
from sklearn.preprocessing import StandardScaler# 创建一个StandardScaler对象
scaler = StandardScaler()# 对x进行归一化
x_scale = scaler.fit_transform(x)'''获取最佳K值'''
# TODO 导入sklearn.cluster模块中的KMeans模型
from sklearn.cluster import KMeans# TODO 创建一个空列表,用于存储每次的簇内误差平方和(SSE)
sseList = []# TODO 使用for循环,取K值为1至9
for K in range(1,10):# TODO 使用KMeans()初始化模型# 设置参数n_clusters=k, random_state=1# 将结果赋值给modelmodel = KMeans(n_clusters=K, random_state=1)# TODO 使用fit()函数训练模型model.fit(x_scale)# TODO 通过.inertia_属性获取SSE,并添加到sseList中sseList.append(model.inertia_)# TODO 输出sseList
print(sseList)# TODO 导入matplotlib.pyplot,并使用"plt"作为该模块的简写
import matplotlib.pyplot as plt# TODO 使用plt.plot()函数
# 以K的取值为x轴的值,sseList为y轴的值
# 设置marker="o",绘制折线图
plt.plot(range(1,10),sseList,marker="o")# TODO 展示图像
plt.show()

通过可视化结果结合这个肘部法则,我们可以看到这个最佳的k=3,接下来我们使用这个k=3进行分析; 

6.绘制3D图形

# 导入pandas模块,简称pd
import pandas as pd'''读取数据集并获取特征变量'''
# 读取文件,并赋值给变量df
df = pd.read_csv("/Users/user_info/new_user_info.csv")# 获取特征变量x
x = df[["time_gap","order_count","total_amount"]]'''数据归一化'''
# 导入sklearn.preprocessing模块中的StandardScaler类
from sklearn.preprocessing import StandardScaler# 创建一个StandardScaler对象
scaler = StandardScaler()# 对x进行归一化
x_scale = scaler.fit_transform(x)'''进行KMeans算法的聚类运算'''
# 导入sklearn.cluster模块中的KMeans模型
from sklearn.cluster import KMeans# 使用KMeans()初始化模型
# 设置参数n_clusters=3, random_state=1
# 将结果赋值给model
model = KMeans(n_clusters=3, random_state=1)# 使用fit()函数训练模型
model.fit(x_scale)# 获取每个样本所属的簇
labels = model.labels_'''可视化结果'''
# 导入matplotlib.pyplot,并使用"plt"作为该模块的简写
import matplotlib.pyplot as plt# 从mpl_toolkits.mplot3d中导入Axes3D类
from mpl_toolkits.mplot3d import Axes3D# 通过 rcParams 参数将字体设置为 Arial Unicode MS 
plt.rcParams["font.sans-serif"] = "Arial Unicode MS"# 使用plt.figure()函数创建画布
# 添加参数figsize设置画布大小为(12,8)
fig = plt.figure(figsize=(12,8))# 创建3D坐标轴对象
ax = fig.add_subplot(projection="3d")# 设置散点颜色
color = ["dodgerblue", "seagreen", "lightcoral"]# 遍历三个簇
for i in range(0,3):# 获取分类为i的点d = x[labels == i]# 绘制分类为i的簇所对应的R、F和M这三个指标数据ax.scatter(d["time_gap"], d["order_count"], d["total_amount"], color=color[i], label=f"用户群体{i}")# 设置x轴标题为"R"
ax.set_xlabel("R")
# 设置y轴标题为"F"
ax.set_ylabel("F")
# 设置z轴标题为"M"
ax.set_zlabel("M")# 使用plt.legend()函数展示图例
plt.legend()
# 展示图像
plt.show()

根据这个绘制的结果结合我们的题目进行说明即可:

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

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

相关文章

如何用GPT进行编程辅助?

随着人工智能技术的迅速发展,GPT(生成型预训练模型)已成为开发者的得力助手之一。无论是编写代码、调试、生成文档,还是解决编程问题,GPT都能提供显著帮助。这篇教程将详细介绍如何使用GPT进行编程辅助,并提…

批量进行Mysql数据处理的一项工作记录以及保存一个nginx变量大全

一、批量进行Mysql数据处理的一项工作记录 在使用SQL执行一起数据批量处理的时候遇到执行数速度非常慢。表temp_users是一个包含百万级的用户ID表,表user_list是一个亿级的表,因为跨库,这里使用的是federated引擎创建的结构表。根据要实现的目…

每日一练【最大连续1的个数 III】

一、题目描述 给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。 二、题目解析 本题同样是利用滑动窗口的解法。 首先进入窗口,如果是1,就直接让right,但是如果是…

python网络爬虫(三)——爬虫攻防

爬虫是模拟人的浏览访问行为,进行数据的批量抓取,当抓取的数据量逐渐增大时,会给被访问的服务器造成很大的压力,甚至有可能崩溃。换句话说就是,服务器是不喜欢有人抓取自己的数据的,那么,网站方…

SAP LE学习笔记07 - MM与WM跨模块收货到仓库的流程中 如何实现 先上架再入库

上一章讲了LE中收货的一些特殊情况: 1,MM模块收货时,特别移动指标来标识的物料直接产生TO 2,MM中直接收货到仓库的固定Storage Bin(棚番)上 SAP LE学习笔记06 - MM与WM跨模块收货到仓库的流程中 带特别移动指标的物料也可以直接…

常用Numpy操作(笔记整理)

目录 一、常用(自查) 1. 创建数组(array) 2. 数组形状(shape) 3. 数组维度(ndim) 4. 数组⼤⼩(size) 5. 数组数据类型(dtype) …

etcd备份恢复操作

etcd集群每个节点上的数据都是相同的,在任意一个正常的节点上备份都能得到8s集群完整的数据 Kubernetes 集群备份主要是备份 ETCD 集群,而恢复时,主要考虑恢复整个顺序: 1,停止所有 Master 上 kube-apiserver 服务 2&…

nuxt3模拟手机验证码

文章目录 前言前端后端前面代码会出现的问题约束button的小插件连接mongodb来写登陆项目开源链接前言 真实应该要连接短信验证码服务,但是众所周知所有的服务和IT都是靠服务来挣钱的,所以我们目前只能模拟手机验证码登陆 考虑到账号的唯一值就想到了手机和验证码(基本上的网站…

Netflix Feign:微服务HTTP调用如何简化?

Netflix Feign:微服务HTTP调用如何简化? 1、什么是Netflix Feign?2、Feign的优点3、示例4、总结 💖The Begin💖点点关注,收藏不迷路💖 1、什么是Netflix Feign? Feign是一个声明式的…

备考AMC10美国数学竞赛2024:吃透1250道真题和知识点(持续)

有什么含金量比较高的初中生数学竞赛吗?美国数学竞赛AMC10是个不错的选择。那么,如何备考AMC10美国数学竞赛呢?做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。 通过做真题,可以帮助孩子找到真实竞赛…

新安装的mariadb 对应的my.cnf 对应的配置

最近在安装openstack,在启动mariadb的时候出现了问题,一直无法启动 看了一个博客说各种原因,尝试了也没有用 看来只有重新安装了, 原来的都删除了,把my.cnf 删除了 后来重新安装的话,执行: …

【智能排班系统】Hibernate Validator 参数校验

🎯导读:本文档介绍了参数校验的重要性及其在软件开发中的作用,强调了数据完整性、安全性、用户体验、系统稳定性及开发效率等方面的关键价值。文档详细阐述了Hibernate Validator这一流行的Java验证框架的使用方法,展示了如何利用…

异业联盟的巅峰之作!某店生活 两年百亿销售额!

大家好 我是一家软件开发公司的产品经理 吴军 最近有个爆火的商业模式 带动了三方消费 平台能赚到钱 消费者能省钱 商家也能获取到客源甚至还能赚钱 他究竟是怎么样做到三方都赚到钱的? 在当前经济形势下,许多消费者变得谨慎,减少了不必…

【K8s】专题十二(4):Kubernetes 存储之 StorageClass

本文内容均来自个人笔记并重新梳理,如有错误欢迎指正! 如果对您有帮助,烦请点赞、关注、转发、订阅专栏! 专栏订阅入口 Linux 专栏 | Docker 专栏 | Kubernetes 专栏 往期精彩文章 【Docker】(全网首发)Kyl…

Git之2.5版本重要特性及用法实例(五十七)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者. 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列…

Debezium日常分享系列之:Debezium 3.0.0.Beta发布

Debezium日常分享系列之:Debezium 3.0.0.Beta发布 一、重大变更Debezium Server Kafka SinkDebezium Server RabbitMQ Sink 二、新功能和改进每个表的详细指标PostgreSQL复制插槽创建超时对于PostgreSQL的PgVector数据类型的支持Oracle Ehcache 事务缓冲实现解码Pos…

滑动窗口元素的平均值 ← STL : deque

【题目描述】 给定一个序列,使用 deque 维护一个大小为 k 的窗口,计算每个窗口中所有元素的平均值。【算法分析】 ● STL deque:https://cplusplus.com/reference/deque/● 在 C 标准模板库(STL)中,deque&a…

VSCode+debugpy远程调试

某一天突然发现VSCode没法远程调试了,原因竟是新版本的VSCode Python调试不再支持ptvsd插件了,所以只能改换门庭接入debugpy。 首先launch.json并无差异,还是和之前用ptvsd时候一样。 {"version": "0.2.0","config…

【架构设计】安全架构设计

安全架构概述 在当今以计算机、网络和软件为载体的数字化服务几乎成为人类社会赖以生存的手段,与之而来的计算机犯罪呈现指数上升趋势,因此,信息的可用性、完整性、机密性、可控性和不可抵赖性等安全保障有位重要,为满足这些诉求&…

【测试】——开发模型与测试模型

📖 前言:在软件开发过程中,理解和应用合适的开发模型与测试模型至关重要。本文将详细介绍几种常见的开发模型,如瀑布模型、螺旋模型、增量模型和敏捷过程,以及测试模型如V模型和W模型。 目录 🕒 1. 开发模型…