机器学习之k-means聚类二、啤酒聚类实现

news2025/1/30 16:35:42

文章目录

  • 一、环境开发说明
  • 二、基于前篇理论实现
    • 1. 数据说明
    • 2. 具体实现流程
      • a. 对数据进行标准化处理
      • b. 使用手肘法进行K值得选择
      • c. 算法实现,
      • d.将聚类结果进行可视化
      • e. 计算轮廓系数
      • f. 轮廓系数可视化
  • 三、 文中的完整代码
  • 四、不调包实现
  • 五、参考文献

一、环境开发说明

window环境
python 3.6.5
具体依赖包在项目文件中

二、基于前篇理论实现

聚类理论说明

代码敲起来,才能明白其中妙处

1. 数据说明

数据比较简单,没有过多的数据量,不过具备参考价值

在这里插入图片描述

2. 具体实现流程

我这里使用的是sklearn实现的流程,后面在手敲k-means聚类算法
这里的实现步骤,完全按照聚类算法原理中的算法实现步骤。

a. 对数据进行标准化处理

对数据的标准化处理比较简单,直接使用api来进行处理,只做演示,实际项目中会比这复杂的多:
在这里插入图片描述

b. 使用手肘法进行K值得选择

具体实现流程如下:计算原理看这里

def SSE():
    #TODO 计算SSE进行k值得选择
    clusters = 15
    K = range(1,clusters+1)
    TSSE = []
    std = StandardScaler()

    for k in K:

        SSE = []  #用于存储各个簇内差平方法和

        # 提取特征值 提取除了名字以外所有列信息
        X = data.loc[:, ['calories', 'sodium', 'alcohol', 'cost']]
        # print(X)
        #todo 增加数据标准化
        x = std.fit_transform(X)
        #使用聚类  默认使用的是 init='k-means++' 进行初始化
        #todo 首先,创建了一个KMeans对象kmean,并设置聚类中心的数量为3个。
        kmean = KMeans(n_clusters=k, init='k-means++')
        kmean.fit(x)

        #todo 返回簇类标签
        labels = kmean.labels_
        print("labels:",labels)
        #todo 返回簇类中心
        centers = kmean.cluster_centers_
        print("centers:", centers)
        #todo 计算各个簇的差平方和,存入列表中
        for label in set(labels):
            res = np.sum((x[labels == label,]-centers[label,:])**2)
            SSE.append(res)
        TSSE.append(sum(SSE))

    print(TSSE)
    print(len(TSSE))

    #todo 中文和负号的正常显示
    plt.figure(figsize=(8, 6))
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    # 设置绘图风格
    plt.style.use('ggplot')
    # 绘制K的个数与GSSE的关系
    plt.plot(K, TSSE, 'b*-')
    plt.xlabel('簇的个数')
    plt.ylabel('簇内离差平方和之和')
    # 显示图形
    plt.show()

来看下展示的结果

在这里插入图片描述看到这里我们可以看到,并没有特别明显的拐点,但在簇为2的地方,相对来说还是比较明显的。

c. 算法实现,

def kemans():

    # print(data)

    # 提取特征值 提取除了名字以外所有列信息
    X = data.loc[:, ['calories', 'sodium', 'alcohol', 'cost']]
    # print(X)

    #使用聚类  默认使用的是 init='k-means++' 进行初始化
    #todo 首先,创建了一个KMeans对象kmean,并设置聚类中心的数量为3个。
    kmean = KMeans(n_clusters=2, init='k-means++')


    #todo 增加数据标准化
    std = StandardScaler()
    x = std.fit_transform(X)


    #todo 然后,使用数据X对KMeans模型进行拟合(fit)操作,得到已经训练好的模型km。
    km = kmean.fit(x)


    #todo 将每个样本点所属的簇(cluster)标签(即聚类结果)添加到原始数据集data中,
    # 并存储在一个名为"cluster"的新列中。这一步操作涉及到km.labels_属性,可以得到每个数据点分配给哪个簇。
    data['cluster'] = km.labels_
    # print(data)
    '''
	可以看到data中已经出现了簇的分类

    km.labels_:是 KMeans 算法对每个样本点进行聚类后得到的簇标签。在 KMeans 模型中,每个簇都有一个编号(从0开始)
       name  calories  sodium  alcohol  cost  cluster
    0    燕京       144      15      4.5  0.43        1
    1    青岛       151      16      5.5  0.65        2
    2    崂山       157      17      4.5  0.56        2
    3    南阳       170      18      4.5  0.98        2
    4    郑州       152      19      4.6  0.54        2
    5    花旗       145      15      4.8  0.23        1
    6    乐视       125      16      4.6  0.65        0
    '''

    #todo 最后:使用groupby方法按照"cluster"列进行分组,并计算每个簇的均值,从而得到聚类中心。
    # 这些聚类中心被存储在centers变量中。

    # centers = data.groupby('cluster').mean().rest_index()
    centers = data.groupby('cluster').mean()
    # print(centers)
    '''
    来看下结果的打印情况
               calories     sodium   alcohol      cost
    cluster                                           
    0         88.250000  17.500000  4.625000  0.507500
    1        160.250000  19.375000  5.062500  0.583750
    2        135.666667  15.666667  4.283333  0.391667
    一般来说,X应该是一个二维数组,其中每行表示一个数据样本,每列表示一个特征。
    K-means算法会针对这些特征对所有数据点进行聚类,最终返回每个数据点所属的簇(cluster)标签,
    并生成相应的聚类中心。
    '''
    return centers

d.将聚类结果进行可视化

在这里插入图片描述可以看到聚类的效果一般,我们可以使用轮廓系数进行评估一下

e. 计算轮廓系数

使用api进行直接计算

 #todo 然后,使用数据X对KMeans模型进行拟合(fit)操作,得到已经训练好的模型km。
    km = kmean.fit(x)

    #todo 将每个样本点所属的簇(cluster)标签(即聚类结果)添加到原始数据集data中,
    # 并存储在一个名为"cluster"的新列中。这一步操作涉及到km.labels_属性,可以得到每个数据点分配给哪个簇。
    data['cluster'] = km.labels_
    # print(data)
    '''
    km.labels_:是 KMeans 算法对每个样本点进行聚类后得到的簇标签。在 KMeans 模型中,每个簇都有一个编号(从0开始)
       name  calories  sodium  alcohol  cost  cluster
    0    燕京       144      15      4.5  0.43        1
    1    青岛       151      16      5.5  0.65        2
    2    崂山       157      17      4.5  0.56        2
    3    南阳       170      18      4.5  0.98        2
    4    郑州       152      19      4.6  0.54        2
    5    花旗       145      15      4.8  0.23        1
    6    乐视       125      16      4.6  0.65        0
    '''

    #todo 进行轮廓系数进行评估

    sil = silhouette_score(x,data.cluster)

来看下计算结果

在这里插入图片描述可以看到0.23这个数字还是很小的因此,这个聚类效果不是很理想。

f. 轮廓系数可视化

我们看下,在不同簇的情况下,轮廓系数的变化:

结果如下:

	_score = []
	for i in range(2,16):
	    labels = KMeans(n_clusters=i, init='k-means++').fit(x).labels_
	
	    scores = silhouette_score(x,labels)
	
	    _score.append(scores)
	
	
	plt.plot(list(range(2,16)),_score)
	
	plt.xlabel("簇类中心数目")
	plt.ylabel("轮廓系数")
	plt.show()

结果展示
在这里插入图片描述
可以看到,随着簇的数量增加,轮廓系数处于下降趋势

三、 文中的完整代码

调包实现完整代码

四、不调包实现

不调包实现源码

五、参考文献

[1]https://www.jianshu.com/p/b268d7f3fbb9
[2]https://zhuanlan.zhihu.com/p/432230028

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

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

相关文章

MySQL-图形化界面工具 (下

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️树高千尺,落叶归根人生不易&…

ip route 和 route 命令

ip route 属于 iproute2 工具包;route 属于 net-tools 工具包;目前 ip route 使用较为广泛; 两个工具包的介绍请见 “iproute2 和 net-tools 介绍” 文章。 ip route命令介绍 ip route命令用于管理静态路由表。 linux 系统中,可…

【GigaGAN论文精读】Scaling up GANs for Text-to-Image Synthesis

【GigaGAN论文精读】Scaling up GANs for Text-to-Image Synthesis 0、前言Abstract1. Introduction(图放在文末)2. Related Works2.1Text-to-image synthesis.2.2GAN-based image synthesis.2.3Super-resolution for large-scale text-to-image models.…

【Java|基础篇】面向对象三大特性之封装

文章目录 1.前言2.什么是封装3.如何更好的封装4.封装的好处5.总结 1.前言 面向对象有三个特性:封装,继承和多态,本文主要讲解封装. 封装是面向对象编程的基本原则之一,它可以提高程序的安全性、稳定性、可维护性和可扩展性,减少了代码的冗余&#xff0c…

【框架源码】Spring源码核心注解Conditional和应用

1.什么是Conditional注解 Conditional来源于spring-context包下的一个注解。通过Conditional配置一些条件判断,当所有条件都满足时,被该Conditional注解标注的目标才会被Spring处理。 例如根据当前环境、系统属性、配置文件等条件来决定是否注册某个Bea…

股票量价关系基础知识3

成交量变化的表现形式 成交量变化的表现形式主要有以下几种 一、缩量 一般界定当日成交量低于前一交易日成交量10%以上为缩量。 缩量往往发生在上升途中的回调末期、上涨末期以及股价下跌的中后期。一般下跌趋势中的缩量阶段,往往意味着股价仍未见底,不能…

服务攻防-中间件安全CVE复现IISApacheTomcatNginx漏洞复现

目录 一、导图 二、ISS漏洞 中间件介绍> 1、短文件 2、文件解析 3、HTTP.SYS 4、cve-2017-7269 三、Nignx漏洞 中间件介绍> 1、后缀解析漏洞 2、cve-2013-4547 3、cve-2021-23017 无 EXP 4、cve-2017-7529 意义不大 四、Apache漏洞 中间件介绍> 1、漏…

AcWing算法提高课-1.3.5买书

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 本题链接&#xff08;AcWing&#xff09; 点这里 题目描述 小明手里有n元钱全部用来买书&#xff0c;书的价格为10元&#xff0c;20元&#xff0c;50元&#xff0c;100元。 问小明有多少种买…

【Python--读写模式全解】

读写模式 读写模式语法读取写入追加 小结 读写模式 open() 函数常用形式是接收两个参数&#xff1a;文件名(file)和模式(mode)。 # 读写文件最好用 with...open...操作&#xff0c;这样最安全 # 而且还不需要关闭文件 with open(path,r)as f:f.read() # 一次读取整个文件&…

如何调用API数据接口来获取想要的数据

API&#xff08;Application Programming Interface&#xff09;是连接不同软件和服务的桥梁&#xff0c;允许不同的应用程序之间共享和交换数据。API接口被广泛应用于各种场景&#xff0c;如&#xff1a; 1.移动应用程序&#xff1a;许多移动应用程序使用API接口与服务器通信…

量子计算——新兴领域的前沿技术

随着人类社会文明的不断进步&#xff0c;计算技术也在不断发展。传统计算机在过去的几十年中快速发展&#xff0c;计算速度、存储能力等方面发生了天翻地覆的变化。但随着大数据、人工智能、区块链等新兴领域的迅速崛起&#xff0c;传统计算机的发展似乎面临了瓶颈。在这样的背…

花3个月面过京东测试岗,拿个25K不过分吧?

背景介绍 计算机专业&#xff0c;代码能力一般&#xff0c;之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发&#xff0c;第二份实习由于大三暑假回国的时间比较短&#xff08;小于两个月&#xff09;&#xff0c;于是找的实习是在…

java简单接触

文章目录 常用的DOS命名计算机语言的发展史javajava的历史java的版本java的特性和优势JDK、JRE、JVMjava程序的运行机制 常用的DOS命名 # 盘符切换 C:\Users\Administrator>D: D:\> # 查看当前目录下的所有文件 dir # 切换目录 cd change screen # 返回上一级目录 cd ..…

FE_本地存储LocalStorage和SessionStorage

localStorage和sessionStorage一样都是用来存储客户端临时信息的对象。他们均只能存储字符串类型的对象。localStorage生命周期是永久&#xff0c;这意味着除非用户主动在浏览器上清除localStorage信息&#xff0c;否则这些信息将永远存在。sessionStorage的失效时间为当前会话…

Wine运行器3.2.2——修复一些问题

不写太多啥了&#xff0c;详细介绍看这里就行&#xff1a;https://bbs.deepin.org/post/248098 更新内容 ※1. 修改源地址&#xff08;迁出 Gitlink&#xff09;&#xff1b; ※2. 修复非 X86 架构运行器主页面虚拟机工具禁用的问题&#xff1b; 3、部分组件支持选择最优源。 …

C语言——数据类型

1. 变量 1.1变量的概念 变量就是在程序中可以发生变化的量&#xff0c;变量有类型。 变量的类型决定了变量存储占用的空间&#xff0c;以及如何解释存储的位模式。(1字节8位) 1.2定义格式 存储类型 数据类型 变量名&#xff1b;例如&#xff1a;(auto) int a; 变量名是标识…

Unity2d光源的使用

将项目升级为2dURP 安卓UPR插件 新建URP配置文件 (只有完成第一步操作之后才会有创建的选项) 右键>Create>Rendering>URP Asset (with 2D Renderer) 修改Project Settings(项目设置里面的相关设置) Edit>Project Settings>Graphics>设置Scriptable R…

组件弹框传值

1.引入组件 // 编辑干部弹窗 import edit from "../../components/rm/edit.vue"; 2.注册组件 components: {edit,}, 3.使用组件 <edit ref"edit" :visible.sync"editVisible" :rmid"UpFileData.id" :width"editWidth"…

股票量价关系基础知识4

价量配合与价量背离 在股票市场中&#xff0c;价的变化会引起量的变化&#xff0c;量的变化又会引起价的波动。从整体来看&#xff0c;价量关系主要存在两种情况&#xff1a;价量配合和价量背离。 一、价量配合 &#xff08;一&#xff09;基本概念 价量配合&#xff0c;是指股…

leecode255——二叉树的所有路径代码及示例

&#x1f50e;递归法&#xff1a; 既然是递归法&#xff0c;递归三部曲&#xff1a; &#xff08;1&#xff09;确定终止条件: 对二叉树的路径&#xff0c;遍历到叶子节点结束。本题要找到叶子节点才开始处理后续流程&#xff0c;那什么时候算是找到了叶子节点&#xff0c;即…