数学建模--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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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有效的方法之一。 通过做真题,可以帮助孩子找到真实竞赛…

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

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

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

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

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

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

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

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

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

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

Nginx: 使用KeepAlived配置实现虚IP在多服务器节点漂移及Nginx高可用原理

使用KeepAlived配置实现虚IP在多服务器节点漂移 1 )环境准备 2台 linux , 一主一备 节点1:192.168.184.30 CentOS 7 Master节点2:192.168.184.40 CentOS 7 BackupVIP 192.168.184.50 安装 KeepAlived, $ yum install keepalived 注意&#x…

时空图卷积网络:用于交通流量预测的深度学习框架-1

摘要 准确的交通预测对于城市交通控制和引导至关重要。由于交通流的高度非线性和复杂性,传统方法无法满足中长期预测任务的需求,且往往忽略了空间和时间的依赖关系。本文提出一种新的深度学习框架——时空图卷积网络(STGCN)来解决交通领域的时间序列预测…

云同步的使用

云同步技术是一种在多个设备或系统之间保持数据一致性的技术,它通常依赖于云存储服务来实现。在Java中,实现云同步功能通常需要与云服务提供商的API进行交互,如Amazon S3、Google Cloud Storage、Microsoft Azure Blob Storage等。 以下是一个…

golang gin template模板渲染

1、根据值控制html元素显示隐藏 main.go package main import ("html/template""net/http""github.com/gin-gonic/gin" ) func main() {r : gin.Default()r.SetFuncMap(template.FuncMap{"greaterThan": func(a, b int) bool {retur…

PyCharm 自定义字体大小

常用编程软件自定义字体大全首页 文章目录 前言具体操作1. 打开设置对话框2. 设置编辑器字体3. 选择外观字体 前言 PyCharm 自定义字体大小,统一设置为 JetBrains Mono 具体操作 【File】>【Settings...】>【Editor】>【Font】 统一设置为字体样式 JetB…

人工智能训练师工作内容及职业发展路径

人工智能训练师(AI Trainer)是一种专业职位,主要负责训练和优化人工智能系统,尤其是机器学习模型。他们的工作涉及到以下几个方面: 1、数据准备:训练师需要收集、清洗和预处理数据,以确保数据的…

C++ | Leetcode C++题解之第355题设计推特

题目&#xff1a; 题解&#xff1a; class Twitter {struct Node {// 哈希表存储关注人的 Idunordered_set<int> followee;// 用链表存储 tweetIdlist<int> tweet;};// getNewsFeed 检索的推文的上限以及 tweetId 的时间戳int recentMax, time;// tweetId 对应发送…

简易STL实现 | Deque的实现

一种 在内存中存储元素的数据结构&#xff0c;它支持 在两端添加和删除元素&#xff08;使用循环数组实现&#xff09; 1、deque的特性&#xff08;分段deque实现&#xff09; 1、双端操作&#xff1a; deque支持在前端和后端执行快速的插入和删除操作 2、随机访问&#xff…

Servlet 简介+ Cookie和session+过滤器Filter和监听器Listener

目录 1.Servlet 介绍 1.1 什么是Servlet 1.2 Servlet的使用方法 1.3 Servlet接口的继承结构 2.Servlet的生命周期 2.1 servlet生命周期中重要的方法 3.获得前端提交数据 4.中文乱码的解决方案 5.重定向和转发 5.1 重定向 5.2 转发 6. Request对象 7. Response对象…

Linux上启动redis

1.默认启动方式:在系统的任意位置执行 redis-server即可启动 ps:这是前端界面启动&#xff0c;无法直接连接redis&#xff0c;想要连接的话只能另外启动一个窗口&#xff0c;因此下面我们介绍后台启动redis 2.指定配置启动&#xff1a; redis的配置文件位置&#xff1a…