【机器学习】无监督学习算法之:K均值聚类

K均值聚类

  • 1、引言
  • 2、K均值聚类
    • 2.1 定义
    • 2.2 原理
    • 2.3 实现方式
    • 2.4 算法公式
      • 2.4.1 距离计算公式
      • 2.4.1 中心点计算公式
    • 2.5 代码示例
  • 3、总结

1、引言

小屌丝:鱼哥, K均值聚类 我不懂,能不能给我讲一讲?
小鱼:行,可以
小屌丝:额…今天咋直接就答应了?
小鱼:不然呢?
小屌丝:有啥条件,直接说,
小鱼:没有
小屌丝:这咋的了,不提条件,我可不踏实
小鱼:你看看你, 我不提条件,你还不踏实,那你这是非让我提条件呗
小屌丝:我…这…我…
小鱼:既然你都让我提条件了,那我就说吧
小屌丝: …
小鱼:最近好长时间没撸串了哈。
小屌丝:…
在这里插入图片描述

小鱼:你看看,让我提条件, 还这表情。那算了。
小屌丝:别别别, 可以可以。
小鱼: 这是,可以去吃,还是别提条件?
小屌丝:去撸串> <

2、K均值聚类

2.1 定义

K均值聚类是一种无监督学习算法,旨在将数据划分为K个不相交的簇,使得每个数据点都属于离其最近的簇的质心。

质心是每个簇中所有数据点的平均值,代表该簇的中心位置。

2.2 原理

K均值聚类的原理基于迭代优化。

  • 算法首先随机选择K个初始质心,然后将每个数据点分配给最近的质心所在的簇。
  • 接下来,算法重新计算每个簇的质心位置,即该簇内所有数据点的平均值。

这个过程不断重复,直到满足某个停止条件,如质心位置不再发生显著变化或达到最大迭代次数。

2.3 实现方式

K均值聚类的实现主要包括以下步骤:

  • 初始化:随机选择K个数据点作为初始质心。
  • 分配数据点到簇:对于每个数据点,计算其与所有质心的距离,并将其分配给最近的质心所在的簇。
  • 更新质心:对于每个簇,重新计算其质心位置,即该簇内所有数据点的平均值。
  • 重复迭代:重复步骤2和3,直到质心位置不再发生显著变化或达到最大迭代次数。

2.4 算法公式

2.4.1 距离计算公式

对于每个数据点,计算其与每个中心点之间的距离。常用的距离计算公式是欧氏距离公式:
d ( x , y ) = s q r t ( ( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 + … + ( x n − y n ) 2 ) d(x, y) = sqrt((x1-y1)^2 + (x2-y2)^2 + … + (xn-yn)^2) d(x,y)=sqrt((x1y1)2+(x2y2)2++(xnyn)2)
其中, x x x y y y分别表示两个数据点的特征向量, n n n表示特征的维度。

2.4.1 中心点计算公式

中心点更新公式: C k = ( 1 / ∣ S k ∣ ) ∗ Σ x i Ck = (1/|Sk|) * Σxi Ck=(1/∣Sk)Σxi
其中 C k Ck Ck为第 k k k个类别的中心点, S k Sk Sk为第 k k k个类别中的数据点集合。

2.5 代码示例

# -*- coding:utf-8 -*-
# @Time   : 2024-03-13
# @Author : Carl_DJ'''
实现功能:实scikit-learn库实现K均值聚类'''
import numpy as np  # 假设我们有一个二维数据集X  
X = np.array([[1, 2], [1, 4], [1, 0], [10, 2], [10, 4], [10, 0]])  # 设定簇的数量  
K = 2  # 步骤1: 初始化质心  
# 随机选择K个数据点作为初始质心  
np.random.seed(0)  # 为了可重复性设置随机种子  
initial_centroids = X[np.random.choice(range(X.shape[0]), K, replace=False)]  
centroids = initial_centroids  # 迭代过程  
max_iterations = 100  # 最大迭代次数  
tolerance = 1e-4  # 收敛阈值  
has_converged = False  
iteration = 0  while not has_converged and iteration < max_iterations:  # 步骤2: 分配数据点到簇  # 对于每个数据点,计算其与所有质心的距离,并将其分配给最近的质心所在的簇  labels = []  for x in X:  distances = np.linalg.norm(x - centroids, axis=1)  label = np.argmin(distances)  labels.append(label)  labels = np.array(labels)  # 旧的质心位置,用于收敛性检查  old_centroids = centroids.copy()  # 步骤3: 更新质心  # 对于每个簇,重新计算其质心位置,即该簇内所有数据点的平均值  new_centroids = np.array([X[labels == i].mean(axis=0) for i in range(K)])  centroids = new_centroids  # 步骤4: 检查收敛性  # 如果质心不再发生显著变化,则算法收敛  if np.allclose(old_centroids, centroids, atol=tolerance):  has_converged = True  iteration += 1  # 输出结果  
print("Iterations:", iteration)  
print("Labels:", labels)  
print("Centroids:", centroids)

代码解析
实现K均值聚类的完整过程:

  • 初始化质心:通过np.random.choice随机选择K个数据点作为初始质心。

  • 分配数据点到簇:对于数据集中的每个数据点,我们计算它与所有质心的距离,并将其分配给最近的质心所在的簇。这通过遍历数据点,计算每个点到所有质心的欧几里得距离,并找到最近的质心来完成。

  • 更新质心:对于每个簇,我们计算该簇内所有数据点的平均值作为新的质心位置。这通过分组数据点(基于它们的簇标签)并计算每组的平均值来实现。

  • 检查收敛性:我们检查新的质心位置是否与旧的质心位置非常接近(在容忍度范围内)。如果是,则算法已经收敛,可以停止迭代。否则,我们继续迭代过程。

  • 重复迭代:如果算法没有收敛,我们重复步骤2到步骤4,直到达到最大迭代次数或算法收敛为止。

在这里插入图片描述

3、总结

K均值聚类是一种简单而有效的无监督学习算法,能够自动将数据划分为K个不同的簇。

通过迭代优化过程,算法将数据点分配给最近的质心,并重新计算质心位置,直到满足停止条件。

K均值聚类在数据处理图像分割模式识别等领域具有广泛的应用。

然而,它也有一些局限性,如对初始质心的选择敏感、可能陷入局部最优解等。

在实际应用中,需要根据具体任务和数据特点选择合适的算法和参数。

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 企业认证金牌面试官
  • 多个名企认证&特邀讲师等
  • 名企签约职场面试培训、职场规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)测评一、二等奖获得者

关注小鱼,学习机器学习领域的知识。

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

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

相关文章

距离AI PC起飞,还差了点什么?

作者 | 张未 来源 | 洞见新研社 PC行业也没有逃过万物皆可AI的真香定律。 英伟达在前喊出AI PC的口号后&#xff0c;一众PC厂商纷纷加码这一最新概念&#xff0c;有关AI PC的讨论点燃了PC市场。 最直观的变化就是&#xff0c;全球PC市场终于止住了颓势&#xff0c;打破了七连…

雪里温柔,水边明秀,不及Java 抽象类 和 Object类

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

【测试开发学习历程】认识Python + 安装Python

目录 1 认识 Python 1.1 Python 的起源 1.2 Python的组成 1.2.1 解释器 1.1.2 Python 的设计目标 1.1.3 Python 的设计哲学 1.2 为什么选择 Python 测试人员选择Python的理由 1.3 Python 特点 面向对象的思维方式 1.4 Python 的优缺点 1.4.1 优点 1.4.2 缺点 3. 安…

哈希冲突解决的几种方式

目录 哈希冲突 哈希冲突-避免方式1-哈希函数的设计 1. 直接定制法--(常用) 2. 除留余数法--(常用) 3. 平方取中法--(了解) 哈希冲突-避免方式2-负载因子调节 哈希冲突-解决方式1-闭散列 1.线性探测 2.二次探测 哈希冲突-解决方式2-开散列(哈希桶) 哈希冲突 在上文中…

es bulk批量操作简单实例

&#xff08;1&#xff09;定义 bulk允许在单个步骤中进行多次create、index、update或delete请求。 bulk与其他的请求体格式稍有不同&#xff0c;如下所示&#xff1a; { action: { metadata }}\n { request body }\n { action: { metadata }}\n { request body …

智慧医疗包括哪些方面?智慧医疗发展前景如何?

近年来&#xff0c;随着云计算、物联网&#xff08;internet of things&#xff0c;IOT&#xff09;、移动互联网、大数据、人工智能&#xff08;artificial intelligence&#xff0c;AI&#xff09;、5G网络、区块链等新一代信息技术的逐步成熟和广泛应用&#xff0c;信息化已…

linux系统编程 socket part2

报式套接字 1.动态报式套接字2.报式套接字的广播3.报式套接字的多播4.UDP协议分析4.1.丢包原因4.2.停等式流量控制 接linux系统编程 socket part1 1.动态报式套接字 在之前的例子上&#xff0c;发送的结构体中的名字由定长改变长。可以用变长结构体。 变长结构体是由gcc扩展的…

判断python字典中key是否存在的两种方法

今天来说一下如何判断字典中是否存在某个key&#xff0c;一般有两种通用做法&#xff0c;下面为大家来分别讲解一下&#xff1a;第一种方法&#xff1a;使用自带函数实现。 在python的字典的属性方法里面有一个has_key()方法&#xff0c;这个方法使用起来非常简单。 例&#xf…

面试笔记——MySQL(主从同步原理、分库分表)

主从同步原理 主从同步结构&#xff1a;主库负责写数据&#xff0c;从库负责读数据&#xff0c;如图—— MySQL主从复制的核心就是二进制日志&#xff08;BINLOG&#xff09;&#xff0c;它记录了所有的 DDL&#xff08;数据定义语言&#xff09;语句和 DML&#xff08;数据操…

Redis的安装与启动

一、Linux环境安装&启动Redis 1. 安装步骤 第一步&#xff1a;在官网下载好Redis安装包&#xff0c;上传到Linux中并进行解压到相应&#xff08;如/opt/software/&#xff09;目录中&#xff1b;&#xff08;注意&#xff1a;完成了第二步后&#xff0c;即安装了C/C语言…

AI婚纱照走红抖音:实现“自己嫁自己”的奇幻体验!

近日&#xff0c;一款名为“情侣婚纱AI写真”的模板在抖音平台上迅速走红&#xff0c;吸引了大量用户关注。这款模板利用人工智能技术&#xff0c;让用户能够轻松制作出与自己结婚的婚纱照&#xff0c;实现“自己嫁自己”的奇幻体验。 AI-321 | 专注于AI工具分享的网站 AI工具…

【Java程序设计】【C00367】基于(JavaWeb)Springboot的粮仓管理系统(有论文)

TOC 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;博客中有上百套程序可供参考&#xff0c;欢迎共同交流学习。 项目简介 项目获取 &#x1f345;文末点击卡片…

【爬虫开发】爬虫从0到1全知识md笔记第2篇:requests模块,知识点:【附代码文档】

爬虫开发从0到1全知识教程完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;爬虫课程概要&#xff0c;爬虫基础爬虫概述,,http协议复习。requests模块&#xff0c;requests模块1. requests模块介绍,2. response响应对象,3. requests模块发送请求,4. request…

【C++重新认知】:泛型编程(模板编程)

一、什么是泛型编程 当我们设计函数或者类时&#xff0c;有时候需要对应不同数据类型编写相同的代码&#xff0c;这样的话不仅有代码冗余&#xff0c;而且更加的加大程序员开发事件&#xff0c;降低开发效率&#xff0c;因此泛型编程就是解决此类情况----不同的数据类型可以重…

关于在forEach循环中使用异步,造成forEach里面的函数还未执行完毕,外层的同步已经被执行的问题

使用 原生的 for循环替代forEach循环即可解决问题 1.实例代码&#xff1a; select_Father_comment_sql_res.forEach( (item) > {const Select_FId_children_sql util.format("Select *, \IFNULL(User.UserName,) as CommentUserName, \IFNULL(User.UserName,) as AtU…

代码随想录算法训练营Day35|LC860 柠檬水找零LC406 根据身高重建队列LC452 用最少数量的箭引爆气球

一句话总结&#xff1a;身高队列看起来不简单&#xff0c;实际上也很难。 原题链接&#xff1a;860 柠檬水找零 简单贪心思想即可。5元时加入cnt5&#xff0c;10元时cnt10&#xff0c;cnt5--&#xff0c; 20元时则优先找零10元再找零5元&#xff0c;这样最后判断是否在一次找零…

golang+vue微服务电商系统

golangvue微服务电商系统 文章目录 golangvue微服务电商系统一、项目前置准备二、项目简介三、代码GItee地址 golang、vue redis、mysql、gin、nacos、es、kibana、jwt 一、项目前置准备 环境的搭建 官方go开发工程师参考地址&#xff1a;https://blog.csdn.net/qq23001186/cat…

SpringBoot如何优雅的进行参数校验

一、传统参数校验 虽然往事不堪回首&#xff0c;但还是得回忆一下我们传统参数校验的痛点。 下面是我们传统校验用户名和邮箱是否合法的代码 if (username null || username.isEmpty()) {throw new IllegalArgumentException("用户名不能为空"); }if (isValidEmai…

Linux之文件管理与重定向

文件的管理 最开始说到过, 一个进程是可以打开多个文件的并且可以对这些文件做出不同的操作, 也就是说加载到内存中的文件可能存在多个. 操作系统要不要管理这些打开的文件呢? 当我们在程序里面打开多个文件时, 操作系统肯定是得对这些文件进行管理的, 而管理的本质就是对数…

【MySQL】存储过程、存储函数、触发器

目录 存储过程介绍技术背景存储过程的作用与优势存储过程跟自定义函数很像。它们的区别是&#xff1a; 存储过程的缺点存储过程的特性基本存储过程使用1.创建语法语法说明&#xff1a;使用案例1.创建获取新闻类别数量的存储过程2.创建获取指定新闻类别ID下新闻数量的存储过程 2…