机器学习之 K-means算法的代码实现

news2024/12/23 17:17:18

K-means 算法简介

K-means 是一种常用的无监督学习算法,主要用于数据聚类。它的主要思想是将数据集中的数据分成 K 个簇(Cluster),使得簇内的数据点尽可能相似,而簇间的差异尽可能大。K-means 算法的核心步骤包括初始化质心、分配数据点到最近的质心、更新质心,重复这个过程直到收敛。

导入实验数据

在本实验中,我们将使用一个啤酒数据集,数据集包含每种啤酒的卡路里(calories)、钠含量(sodium)、酒精含量(alcohol)和价格(cost)。这些数据将用于 K-means 聚类分析。

实验数据如下:

实验代码详解

导入库和数据

import pandas as pd
from sklearn.cluster import KMeans
from sklearn import metrics

# 读取文件
beer = pd.read_table("data.txt", sep=' ', encoding='utf8', engine='python')

# 传入变量(列名)
X = beer[["calories", "sodium", "alcohol", "cost"]]
print(X)

解释:

  • 我们首先导入所需的库。
  • 使用 pd.read_table 函数读取名为 data.txt 的数据文件,其中 sep=' ' 表示数据分隔符为空格。
  • 然后选择四列数据作为输入特征,并将其存储在变量 X 中。

计算轮廓系数得分 

scores = []
for k in range(2, 10):  # 寻找合适的K值
    labels = KMeans(n_clusters=k).fit(X).labels_
    score = metrics.silhouette_score(X, labels)  # 轮廓系数
    scores.append(score)
print(scores)

解释:

  • 这部分代码的目的是找到最适合的簇数量。
  • 使用 range(2, 10) 来循环尝试从 2 到 9 个簇。
  • 对于每个簇数量,我们使用 KMeans 类进行聚类,并获取聚类标签。
  • 使用 metrics.silhouette_score 计算轮廓系数得分,该得分越高表示簇内的数据点越相似,簇间差异越大。
  • 得分被存储在列表 scores 中。

绘制得分结果

import matplotlib.pyplot as plt

plt.plot(list(range(2, 10)), scores)
plt.xlabel("Number of Clusters Initialized")
plt.ylabel("Silhouette Score")
plt.show()

解释:

  • 使用 matplotlib 绘制簇数量与轮廓系数得分之间的关系。
  • 通过观察得分曲线,我们可以找到最佳的簇数量。

聚类

km = KMeans(n_clusters=2).fit(X)  # K值为2【分为2类】
beer['cluster'] = km.labels_

解释:

  • 根据之前的得分结果,我们选择了 K=2 进行聚类。
  • 使用 KMeans 类进行聚类,并将结果存储在 beer DataFrame 的新列 cluster 中。

对聚类结果进行评分

score = metrics.silhouette_score(X, beer.cluster)
print(score)

解释:

  • 最后,我们再次计算轮廓系数得分,以评估最终聚类结果的质量。
输出结果:

总结

通过上述步骤,我们完成了 K-means 聚类分析的过程。K-means 算法通过迭代的方式不断优化簇内数据的相似性和簇间数据的差异性,从而达到聚类的目的。在本实验中,我们不仅实现了 K-means 算法,还通过轮廓系数得分来评估不同簇数量下的聚类效果,并最终确定了最佳的簇数量。这种方法在很多实际应用中都非常有用,特别是在需要对数据进行分组和分析的场景中。

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

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

相关文章

关于类与构造函数继承的小挑战

题目 /* 使用构造函数将电动汽车(称为 EV)作为 Car 的子 “类 ”来实现。除了品牌和当前速度外,EV 还具有当前电池电量(百分比)(“charge ”属性);实现一个 “chargeBattery ”方法…

Vitis AI 基本认知(Tiny-VGG 项目代码详解)

目录 1. 简介 1.1 Tiny-VGG 1.2 data 目录结构 2. 代码分析 2.1 Import packages 2.2 Dataset 2.3 Train step 2.4 Vali & Test step 2.5 Ceate model 2.6 Compile model 2.6.1 计算 loss 2.6.2 计算平均值 3.6.3 计算准确度 2.7 训练循环 2.7.1 自定义训练…

BLE蓝牙协议详解

BLE蓝牙协议详解 1、BLE协议栈 1、协议栈结构 蓝牙LE协议栈按功能分为三个层:Controller、Host和Application Profiles and Services。 HCI event是按BLE Spec标准设计的,是BLE Controller和Host用来交互的事件;GAP event是BLE host定义的…

环境配置 --- miniconda安装torch报错OSError: [WinError 126] 找不到指定的模块

环境配置 — miniconda安装torch报错OSError: [WinError 126] 找不到指定的模块。 CSDN 原因:fbegmm.dll文件出现问题 解决方案: 使用依赖分析工具https://github.com/lucasg/Dependencies/releases/tag/v1.11.1 检测报错提示的那个dll文件发现哪个文…

Nuclei:开源漏洞扫描器

Nuclei 拥有灵活的模板系统,可以适应各种安全检查。 它可以使用可自定义的模板向多个目标发送请求,确保零误报并实现跨多台主机的快速扫描。 它支持多种协议,包括 TCP、DNS、HTTP、SSL、文件、Whois、Websocket 等。 特征 模板库&#xf…

Java中的定时器(Timer)

目录 一、什么是定时器? 二、标准库中的定时器 三、实现定时器 一、什么是定时器? 定时器就像一个"闹钟",当它到达设定的时间后,就会执行预定的代码。 例如,我们在TCP的超时重传机制中讲过,如果服务器在规定的时间…

XDMA - AXI4 Memory Mapped

目录 1. What is SG DMA2. Descriptor3. Transfer for H2CStep 1. The host prepares stored data and creates descriptors in main memoryStep 2. The host enables DMA interruptsStep 2. The driver initializes DMA with descriptor start addressStep 3. The driver writ…

数据结构(邓俊辉)学习笔记】串 06——KMP算法:构造next[]表

文章目录 1. 递推2. 算法3. 实现 1. 递推 接下来的这节,我们就来讨论 next 查询表的构造算法。我们将会看到非常有意思是, next 表的构造过程与 KMP 主算法的流程在本质上是完全一样的。 在这里,我们不妨采用递推策略。我们只需回答这样一个…

带你深入浅出新面经:十六、十大排序之快速排序

此为面经第十六谈!关注我,每日带你深入浅出一个新面经。 我们要了解面经要如何“说”! 很重要!很重要!很重要! 我们通常采取总-分-总方式来阐述!(有些知识点,你可以去…

python脚本请求数量达到上限,http请求重试问题例子解析

在使用Python的requests库进行HTTP请求时,可能会遇到请求数量达到上限,导致Max retries exceeded with URL的错误。这通常发生在网络连接不稳定、服务器限制请求次数、或请求参数设置错误的情况下。以下是一些解决该问题的策略: 增加重试次数…

【负载均衡式在线OJ】项目设计

文章目录 程序源码用到的技术项目宏观结构代码编写思路 程序源码 https://gitee.com/not-a-stupid-child/online-judge 用到的技术 C STL 标准库。Boost 准标准库(字符串切割)。cpp-httplib 第三方开源网络库。ctemplate 第三方开源前端网页渲染库。jsoncpp 第三方开源序列化…

栈和队列有何区别?

栈和队列是两种常见的数据结构,它们分别用于解决不同类型的问题。在程序设计中,栈和队列都是非常重要的数据结构,因为它们可以帮助我们解决很多实际的问题。 栈: 首先,让我们来讨论栈, 栈是一种后进先出(…

学NLP不看这本书等于白学!一书弄懂NLP自然语言处理(附文档)

随着人工智能技术的飞速发展,自然语言处理成为了计算机科学与人工智能领域中不可或缺的关键技术之一。作为一名长期致力于人工智能和自然语言处理研究的学者,今天给大家推荐的这本《自然语言处理:大模型理论与实践》正是学NLP自然语言非常牛逼…

黑神话悟空用什么编程语言

《黑神话:悟空》作为一款备受瞩目的国产单机动作游戏,其背后的开发涉及了多种编程语言和技术。根据公开信息和游戏开发行业的普遍做法,可以推测该游戏主要使用了以下几种编程语言: C: 核心编程语言:作为《黑…

【C++ Primer Plus习题】5.7

问题: 解答: #include <iostream> #include <string> using namespace std;typedef struct _Car {string brand;int year; }Car;int main() {int count 0;cout << "请问你家有多少辆车呢?" << endl;cin >> count;cin.get();Car* ca…

Java 入门指南:Java IO流 —— 序列化与反序列化

序列化 序列化是指将对象转换为字节流的过程&#xff0c;以便能够将其存储到文件、内存、网络传输等介质中&#xff0c;或者在不同的进程、网络或机器之间进行数据交换。 序列化的逆过程称为反序列化&#xff0c;即将字节流转换为对象。过反序列化&#xff0c;可以从存储介质…

【mysql】mysql之索引学习

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

面试搜狐大型模型算法工程师,感受非凡体验!

搜狐大模型算法工程师面试题 应聘岗位&#xff1a;搜狐大模型算法工程师 面试轮数&#xff1a; 整体面试感觉&#xff1a;偏简单 面试过程回顾 1. 自我介绍 在自我介绍环节&#xff0c;我清晰地阐述了个人基本信息、教育背景、工作经历和技能特长&#xff0c;展示了自信和沟通…

【Office】激活文件无法打开-DragonKMS--解决办法

【解决办法】右键 文件属性>>最下面勾选解除锁定即可打开。 【原因】&#xff1a;网络上下载的文件&#xff08;包括exe、zip等&#xff09;。

vue.js3+element-plus+typescript add,edit,del,search

vite.config.ts server: {cors: true, // 默认启用并允许任何源host: 0.0.0.0, // 这个用于启动port: 5110, // 指定启动端口open: true, //启动后是否自动打开浏览器 proxy: {/api: {target: http://localhost:8081/, //实际请求地址&#xff0c;数据库的rest APIschangeOr…