【机器学习】无监督学习算法之: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.mzph.cn/news/772148.shtml

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

相关文章

latex在写算法`\For` 和 `\EndFor` 以及 `FOR` 和 `\ENDFOR` ,报错Undefined control sequence.

这里写目录标题 1. 错误原因2. 进行改正3. 爱思唯尔期刊与施普林格期刊对于算法的格式不太一样&#xff0c;不能直接套用总结 1. 错误原因 我在算法中使用\For&#xff0c;\EndFor 2. 进行改正 换成FOR&#xff0c;\ENDFOR 3. 爱思唯尔期刊与施普林格期刊对于算法的格式不太…

cdp集群yarn组件ResourceManager无法启动问题记录

前言&#xff1a;cdp集群装了Kerberos认证&#xff0c;在进行权限集成时集群所有组件高可用状态失效&#xff0c;yarn组件ResourceManager停止 查看ResourceManager组件日志&#xff0c;报错如下&#xff1a; Error starting ResourceManager org.apache.hadoop.service.Servi…

CMake学习笔记(一)一个最简单的CMakeLists嵌套示例

目录 1 mkdir project_macro 2 在project_marco中建立CMakeLists.txt 3 建立专门的src文件夹 4 在src中添加main.cpp和CMakeLists.txt 5 回到project_macro目录&#xff0c;建立build文件夹 6 进入build 文件夹&#xff0c;开始cmake 7 在build文件夹里执行make指令 8 …

Softmax到底行还是列

对于二维张量&#xff0c;飞话不多说&#xff0c;直接看代码 input_tensor torch.tensor([[2,3,5],[2,2,2],[3,1,3]], dtypetorch.float32) # input_tensor torch.rand((1000,1000,100)) print(input_tensor) print("*"*40) print("沿着dim1&#xff0c;计算…

URL 中 pathname 的命名规则

URL 中 pathname 的命名规则 pathname 是 URL 中标识特定资源或页面的路径部分。它通常遵循以下命名约定&#xff1a; 使用小写字母和连字符&#xff1a;路径名应使用小写字母和连字符&#xff08;-&#xff09;分隔单词。避免使用大写字母、下划线或其他特殊字符。使用描述性…

直播行业网络安全建设

一、引言 直播行业近年来蓬勃发展&#xff0c;吸引了大量用户和资本的关注。然而&#xff0c;随着行业的壮大&#xff0c;网络安全问题也日益凸显。构建一个安全、稳定的直播行业网络对于保障用户权益、维护行业秩序具有重要意义。本文将详细探讨直播行业安全网络的构建与保障…

蓝桥杯算法基础(28)11道关于字符串的小题

判断字符串有无重复字符 public class Different{public boolean checkDifferent(String iniString){if(StringUtils.isEmpty(iniString)){//判断是否为空return true;}int[] flagnew int[128];//ASCII码128个字符//扫描字符串for(int i0;i<iniString.length();i){int c(int…

通俗易懂:MySQL如何支持JSON数据类型?提供一个使用案例。

MySQL从5.7.8版本开始正式引入了原生的JSON数据类型&#xff0c;用来支持JSON格式数据的存储、查询和操作。MySQL的JSON数据类型提供了以下几个关键特性&#xff1a; 1. 存储MySQL中的JSON列可以存储符合JSON格式规范的数据&#xff0c;存储的内容会被MySQL转换为内部格式&…

MongoDB知识

1、部署MongoDB &#xff08;1&#xff09;new好一个mongo文件之后执行 &#xff08;出现mongodb.key&#xff09;记得放行端口 openssl rand -base64 666 > mongodb.key &#xff08;2&#xff09;放到一个docker-compose.yml之后docker-compose up -d执行 version: 3.…

C语言 结构体和联合体、解释C语言中的结构体及其用途。

一、结构体和联合体 结构体和联合体在C语言中都是重要的数据类型&#xff0c;但它们在使用和特性上有所区别。 结构体是由一批数据组合而成的结构型数据&#xff0c;由一组称为成员&#xff08;或称为域&#xff0c;或称为元素&#xff09;的不同数据组成&#xff0c;其中每个…

JavaSE系统性总结全集(精华版)

目录 1. 面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;详解 1.1 面向过程和面向对象的区别 1.2面向对象的三大特性 1.2.1 封装 1.2.2 继承 1.2.3 多态 1.2.4 方法重写和方法重载的区别&#xff08;面试题&#xff09; 1.2.5 访问权限修饰符分…

《自动机理论、语言和计算导论》阅读笔记:p5-p27

《自动机理论、语言和计算导论》学习第2天&#xff0c;p5-p27总结&#xff0c;总计23页。 一、技术总结 1.集合 (1)commutative law of union. (2)distribute law of union. 2.归纳法(induction) & 演绎法(deduction) (1)归纳法&#xff1a;从许多个别的事实或原理中…

代码随想录算法训练营第十六天| 104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

系列文章目录 目录 系列文章目录104.二叉树的最大深度①递归法直接法(求深度&#xff0c;前序遍历)间接法&#xff08;求高度&#xff0c;后序遍历&#xff09; ②迭代法&#xff08;层序遍历中有&#xff09; 559.n叉树的最大深度①递归法间接法&#xff08;后序遍历求高度&am…

自动化脚本-滑动验证码识别登录

结果演示 滑块验证码登录 测试网站 提供各类型验证码识别验证&#xff0c;主要提供人机识别与验证服务 行为验证4.0-适应型验证码-滑动验证,点选验证,图片验证-极验GeeTest 代码实现 相关前置依赖可参考 自动化脚本-图片验证码识别登陆-CSDN博客 具体实现 # -*- coding: u…

优必选校招软件开发岗笔试Java题解

1、计算某天是星期几 输入一个年月日&#xff0c;计算出这个日期对应的是星期几 注意&#xff1a; 闰年 公元年分除以4不可整除&#xff0c;为平年。 公元年分除以4可整除但除以100不可整除&#xff0c;为闰年。 公元年分除以100可整除但除以400不可整除&#xff0c;为平年。 …

【卡梅德生物】哺乳动物细胞表达系统介绍

哺乳动物细胞表达系统是在哺乳动物细胞中生产重组蛋白的广泛使用的平台。哺乳动物细胞为蛋白表达提供了几个优势&#xff0c;包括进行复杂翻译后修饰的能力、蛋白质的正确折叠、将蛋白质分泌到细胞外环境中的能力等。哺乳动物细胞表达系统广泛用于生物技术和制药工业&#xff0…

canvas画带透明度的直线和涂鸦

提示&#xff1a;canvas画线 文章目录 前言一、带透明度的直线和涂鸦总结 前言 一、带透明度的直线和涂鸦 test.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content…

咕炮课堂Java架构师课程

课程介绍 主要针对1到5年及以上工作经验的开发人员&#xff0c;提供互联网行业热门技术的Java架构师专题培训&#xff0c;由业内技术大牛&#xff0c;行业及实战经验丰富的讲师进行技术分享。内容涵盖redis,mongodb,dubbo,zookeeper,kafka 高并发、高可用、分布式、高性能、并…

【面经八股】大模型方向:面试记录(二)

【面经&八股】大模型方向:面试记录(二) 文章目录 【面经&八股】大模型方向:面试记录(二)0. 背景1. 一面(3.25)1.1 自我介绍1.2 科研-项目经历问答1.3 实习经历问答1.4 八股1.5 编程题1.6 反问2. 二面(3.26)2.1 自我介绍2.2 八股文2.3 编程0.

macOS Sonoma 14.4.1(23E224)发布(附黑/白苹果镜像)

系统介绍 黑果魏叔3 月 26 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 14.4.1 更新&#xff08;内部版本号&#xff1a;23E224&#xff09;&#xff0c;本次更新距离上次发布隔了 18 天。 根据苹果公司的发布说明&#xff0c;macOS Sonoma 14.4.1 更新修复了一个…