机器学习:K-means算法及代码实现

news2024/9/20 20:23:23

1、K-means算法原理

        K-means算法是一种常用的聚类算法,其目的是将数据集划分为K个簇(clusters),使得每个簇内部的数据点尽可能相似,而簇与簇之间的数据点尽可能不同。以下是K-means算法的基本原理和步骤:

  1. 初始化:随机选择K个数据点作为初始的簇中心(centroids)。

  2. 分配:将每个数据点分配到最近的簇中心,形成K个簇。这里的“最近”通常是指欧氏距离最小。

  3. 更新:重新计算每个簇的中心,通常是簇内所有点的均值。

  4. 迭代:重复步骤2和3,直到簇中心不再发生显著变化,或者达到预设的迭代次数。

  5. 终止:当簇中心的变化小于某个阈值,或者达到最大迭代次数时,算法终止。

2、K-means算法的关键点包括:

  • K值的选择:K值的选择对算法的结果有很大影响,通常需要根据具体问题和数据集来确定。可以使用肘部法则(Elbow Method)来帮助选择K值。

  • 初始化的敏感性:K-means算法对初始簇中心的选择比较敏感,不同的初始化可能导致不同的聚类结果。为了减少这种影响,可以采用K-means++算法来选择更好的初始簇中心。

  • 局部最优解:K-means算法容易陷入局部最优解,即找到一个局部的簇中心配置,但可能不是全局最优的。可以通过多次运行算法,每次使用不同的初始簇中心,然后选择最佳结果来缓解这个问题。

  • 数据的尺度:K-means算法对数据的尺度敏感,因此在应用K-means之前,通常需要对数据进行标准化处理。

3、代码

数据预处理

# 读取数据文件,这里假设数据文件是制表符分隔的文本文件
beer = pd.read_table("data.txt", sep=' ', encoding='utf8', engine='python')

# 选择数据集中的四列作为特征
x = beer[['calories', 'sodium', 'alcohol', 'cost']]

运用循环尝试不同的聚类数目

# 初始化一个空列表来存储轮廓系数
scores = []

# 遍历2到9的整数,尝试不同的聚类数目
for k in range(2, 10):
    # 用KMeans算法进行聚类,n_clusters指定聚类数目,n_init指定初始化质心的次数
    labels = KMeans(n_clusters=k, n_init='auto').fit(x).labels_
    
    # 计算轮廓系数,用于评估聚类效果
    score = metrics.silhouette_score(x, labels)
    
    # 将计算得到的轮廓系数添加到scores列表中
    scores.append(score)

使用KMeans算法进行2类聚类

# 使用KMeans算法进行2类聚类
label = KMeans(n_clusters=2, n_init='auto').fit(x).labels_

# 计算并打印2类聚类的轮廓系数
score = metrics.silhouette_score(x, label)

4、结果

5、完整代码

# 导入必要的库
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']]

# 初始化一个空列表来存储轮廓系数
scores = []

# 遍历2到9的整数,尝试不同的聚类数目
for k in range(2, 10):
    # 用KMeans算法进行聚类,n_clusters指定聚类数目,n_init指定初始化质心的次数
    labels = KMeans(n_clusters=k, n_init='auto').fit(x).labels_
    
    # 计算轮廓系数,用于评估聚类效果
    score = metrics.silhouette_score(x, labels)
    
    # 将计算得到的轮廓系数添加到scores列表中
    scores.append(score)

# 打印不同聚类数目对应的轮廓系数
print(scores)

# 使用KMeans算法进行2类聚类
label = KMeans(n_clusters=2, n_init='auto').fit(x).labels_

# 计算并打印2类聚类的轮廓系数
score = metrics.silhouette_score(x, label)
print(score)

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

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

相关文章

【C++】C++中的字符串

提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 #include <iostream>using namespace std; void total(string str); int main() {string str;cout << "请输入一个字符串:" ;//cin >>str;getline(…

SAP怎么查找系统全部的增强点呢?

1.在已有的BADI查找程序里面有点手无足措的样子&#xff0c;不知道该如何去找增强&#xff01; 2.这个时候刚刚接触系统还不熟悉&#xff0c;系统里面存在了什么增强&#xff0c;这个时候咋办捏&#xff1f;SE38 -SNIF 此时全部的增强点都在这里面啦&#xff01;&#xff01;&…

使用LinkedHashMap实现固定大小的LRU缓存

使用LinkedHashMap实现固定大小的LRU缓存 1. 什么是LRU&#xff1f; LRU是"Least Recently Used"的缩写&#xff0c;意为"最近最少使用"。LRU缓存是一种常用的缓存淘汰算法&#xff0c;它的核心思想是&#xff1a;当缓存满时&#xff0c;优先淘汰最近最少…

二、设置地图配置表

一、导入一个背景图 由于背景图比较大&#xff0c;需要缩小至0.73 二、写配置文件&#xff08;SO&#xff09; 使用List需要一个命名空间 写一个类&#xff0c;声明房间的出现数量和种类&#xff1b;将它实例化出来 三、枚举变量的多选 在枚举变量中标记命名空间&#xff…

C++:list篇

前言: 观看C的list前需要对链表有一些了解&#xff0c;如C语言的链表结构。本片仅介绍list容器中常用的接口函数概念以及使用。 list的概念&#xff1a; 简而言之&#xff0c;C的list是一个双向带哨兵位的链表容器模板 list的构造&#xff1a; 1.list():默认构造 2.li…

2024最新版Python+Pycharm安装教程,安装、环境配置、汉化全搞定,保姆级教学!

一、Python下载 为了节约时间&#xff0c;我将PythonPycharm安装包、集火码全部打包上传至CSDN官方&#xff0c;可放心下载&#xff0c;完全免费&#xff01;&#xff08;安装包均为最新版本&#xff09; 二、Python安装 1.双击运行本地文件夹下的python安装包&#xff08;以…

c++关于字符串的联系

提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 #include <iostream> #include<string> using namespace std;int main() {string s1;int letter0,digit0,space0,other0;cout<<"请输入一个字符串:"…

Visual Studio 2022 自定义字体大小

常用编程软件自定义字体大全首页 文章目录 前言具体操作1. 打开字体和颜色对话框2. 设置【文本编辑器】字体大小3. 设置【编辑器智能提示框】字体大小4. 设置【编辑器方法提示框】字体大小5. 设置【输出框】、【错误列表框】字体大小6. 设置【终端】字体大小7. 设置【程序包管理…

线程基础和线程间通信

作业一:创建3个线程&#xff0c;一个子线程拷贝文件的前一半&#xff0c;一个子线程拷贝后一半文件&#xff0c;主线程回收子线程资源。 #include <myhead.h> //定义结构体变量 typedef struct {const char *src_file;const char *dest_file;int start;int end; } Copy;…

IAR软件配置笔记

Project->Optiions->配置Device Debug中配置 C/C Compiler中配置 优化等级 C语法标准选择 回到主界面&#xff0c;Tools->Options 字体调整 Editor更改缩进数 Project->Make编译 调试模式和编辑模式的View菜单栏不一样http://t.csdnimg.cn/JsWjy

百度网盘下载的文件怎么打印?

一、自有打印机情况下的打印方法 如果您家中或办公室配备有打印机&#xff0c;那么打印百度网盘上的文件就变得非常简单了。首先&#xff0c;请确保您的打印机已连接并设置妥当。以下是基本的操作流程&#xff1a; 下载文件&#xff1a;从百度网盘中下载所需的文件至您的计算…

关于重复消费的一些解决方案

重复消费问题一直是一个热点问题&#xff0c;不管是面试还是实际工作过程中都会遇到&#xff0c;今天我就盘一下这个问题。 1. 重复消费是怎么出现的 重复消费的问题出现的情况有很多&#xff0c;我列举一下常见的吧&#xff1a; 用户重复提交表单。 用户使用软件恶意刷单。…

【Qt】基于VTK9.1+VS2019+Qt5.15.2的点云可视化程序开发

目录 0. 写在前面 1. 开发环境 2. VS 2019 PCL 1.12.1 配置 3. Qt 5.15.2安装 & Qt-VS插件安装 & VTK 9.1.0编译安装 4. 点云显示demo 4.1 UI 4.2 头文件 4.3 主程序 4.4 显示效果 5. 写在最后 0. 写在前面 由于工作需要和个人爱好&#xff0c;我最近在学习…

lenovo M7328W 复印二页不同的内容到同一张白纸上,要求要全都是正向,就是一个方向显示。当然也可以不一样,那就随便放不要求正反,只要求位置一致。

1、先上个图&#xff0c;打开软件&#xff1a; 按一下电源键&#xff0c;将休眠中的打印机&#xff0c;变成待机状态&#xff0c;这样才可以复印。 2、打开复印的盖板&#xff0c;将要复印的一面帖在最右侧&#xff0c;右侧要留一些空白距离&#xff0c;然后点击复印按钮&#…

数据存储单位——真题详解

在计算机中&#xff0c;以下哪个选项描述的数据存储容量最小?( ) A. 字节(byte) B. 比特(bit) C. 字(word) D. 千字节(kilobyte) 【答案】 B 【解析】 本题考查计算机数据存储容量单位的比较&#xff0c;这个题目看起来很简单&#xff0c;但有的老师甚至都会做错&am…

华为海思招聘-芯片与器件设计工程师-数字芯片方向- 机试题——(共九套)(每套四十题)

华为海思招聘-芯片与器件设计工程师-数字芯片方向- 机试题-题目分享——共九套&#xff08;每套四十题&#xff09; 岗位——芯片与器件设计工程师 岗位意向——数字芯片 真题题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&am…

天下通商城:数字时代的智能消费助手

随着数字经济的飞速发展&#xff0c;消费方式也在不断革新。天下通网络科技&#xff08;海南&#xff09;有限公司顺应这一趋势&#xff0c;推出了天下通商城&#xff0c;这一平台不仅简化了购物流程&#xff0c;还为用户提供了丰富的智能消费工具&#xff0c;成为现代消费者的…

解决国产手机wda不能联网问题

前言 国产手机在通过tidevice无线调试启动wda&#xff08;webdriveragent&#xff09;后&#xff0c;会有报错&#xff1a; request error:(‘Connectionaborted.’, SocketError(‘socket timeout’))AirtestIDE或者appnium inspector 无法连接手机显示模拟器界面&#xff0c…

音频导出后为什么效果变差了 FL Studio音频导出设置推荐

FL Studio是一款功能强大的编曲软件&#xff0c;除了可以编曲之外&#xff0c;FL Studio还支持各种音频格式导出。有的小伙伴在使用FL Studio导出音频后&#xff0c;会发现的导出的音频效果不理想&#xff0c;这很大的原因可能是导出设置不对造成的。下面给大家详细讲解&#x…

20240827让飞凌的OK3588-C核心板在Linux R4下通过rockit工具的VI功能获取SONY索尼8530机芯的YUV图

20240827让飞凌的OK3588-C核心板在Linux R4下通过rockit工具的VI功能获取SONY索尼8530机芯的YUV图 2024/8/27 19:40 缘起&#xff0c;我司使用飞凌的OK3588-C的核心板&#xff0c;系统是Linux R4版本。 机芯选用SONY索尼的HDMI OUT接口的8530&#xff0c;输出格式有BGR3/NV16。…