当前位置: 首页 > news >正文

K-means算法通俗原理及Python与R语言的分别实现

K均值聚类方法是一种划分聚类方法,它是将数据分成互不相交的K类。K均值法先指定聚类数,目标是使每个数据到数据点所属聚类中心的总距离变异平方和最小,规定聚类中心时则是以该类数据点的平均值作为聚类中心。

 

01K均值法原理与步骤

对于有N个数据的数据集,我们想把它们聚成K类,开始需要指定K个聚类中心,假设第i类有ni个样本数据,计算每个数据点分别到聚类中心的距离平方和,距离这里直接用的欧式距离,还有什么海明距离、街道距离、余弦相似度什么的其实都可以,这里聚类的话,欧式距离就好。

(1)、所有类别样本数等于总样本数,即每个类类是互不相同的

K-means算法通俗原理及Python与R语言的分别实现-图片1

(2)、每一类(假设是第i类)中数据点到聚类中心距离平方总和di为:

xi表示第i类各点平均值(聚类中心)

K-means算法通俗原理及Python与R语言的分别实现-图片2

(3)、K类数据点距离之和为:

K-means算法通俗原理及Python与R语言的分别实现-图片3

这样就会有一个KN的距离平方和矩阵,每一列(比如第j列)的最小值对应的行数(比如第i行)就表明:第j个数据样本属于第i类别。这样,每个数据就会分别属于不同的类别了。

K-means算法通俗原理及Python与R语言的分别实现-图片4

比如,表格中红色部分数据点x2到第一类的聚类中心距离最小,则x2就属于第一类。

K均值步骤:

  1. 随机选取K个数据点作为(起始)聚类中心;
  2. 按照距离最近原则分配数据点到对应类;
  3. 计算每类的数据点平均值(新的聚类中心);
  4. 计算数据点到聚类中心总距离;
  5. 如果与上一次相比总距离下降,聚类中心替换;
  6. 直到总距离不再下降或者达到指定计算次数。

其实,这个过程相对比较简单,给我一组聚类中心,总能根据到聚类中心距离最小原则生成一组聚类方案,然后计算各个类别到聚类中心距离总和是否下降,如果距离总和下降,就继续计算每类数据点平均值(新的聚类中心),对应的聚类方案要好(还是那句话:给我一组聚类中心,总能根据到聚类中心距离最小原则生成一组聚类方案),然后不断计算,直到距离总和下降幅度很小(几乎收敛),或者达到指定计算次数。

K-means算法缺点主要是:

  1. 对异常值敏感;
  2. 需要提前确定k值;
  3. 结果不稳定;

02 K均值算法Python的实现

思路:

  1. 首先用random模块产生随机聚类中心;
  2. 用numpy包简化运算;
  3. 写了一个函数实现一个中心对应一种聚类方案;
  4. 不断迭代;
  5. matplotlib包结果可视化。

代码如下:

  1. import numpy as np
  2. import random as rd
  3. import matplotlib.pyplot as plt
  4. import math
  5. #数据
  6. dat = np.array([[14,22,15,20,30,18,32,13,23,20,21,22,23,24,35,18],
  7. [15,28,18,30,35,20,30,15,25,23,24,25,26,27,30,16]])
  8. print(dat)
  9. #聚类中心#
  10. n = len(dat[0])
  11. N = len(dat)n
  12. k = 3
  13. #-------随机产生-----#
  14. center = rd.sample(range(n),k)
  15. center = np.array([dat.T[i] for i in center])
  16. print(‘初始聚类中心为:’)
  17. print(center)
  18. print(‘-----------------------’)
  19.  
  20. #计算聚类中心
  21. def cent(x):
  22. return(sum(x)/len(x))
  23.  
  24. #计算各点到聚类中心的距离之和
  25. def dist(x):
  26. #聚类中心
  27. m0 = cent(x)
  28. dis = sum(sum((x-m0)2))
  29. return(dis)
  30.  
  31. #距离
  32. def f(center):
  33. c0 = []
  34. c1 = []
  35. c2 = []
  36. D = np.arange(k*n).reshape(k,n)
  37. d0 = center[0]-dat.T
  38. d1 = center[1]-dat.T
  39. d2 = center[2]-dat.T
  40. d = np.array([d0,d1,d2])
  41. for i in range(k):
  42. D[i] = sum((d[i]2).T)
  43. for i in range(n):
  44. ind = D.T[i].argmin()
  45. if(ind 0):
  46. c0.append(i)#分配类别
  47. else:
  48. if(ind 1):
  49. c1.append(i)
  50. else:
  51. c2.append(i)
  52. C0 = np.array([dat.T[i] for i in c0])
  53. C1 = np.array([dat.T[i] for i in c1])
  54. C2 = np.array([dat.T[i] for i in c2])
  55. C = [C0,C1,C2]
  56. print([c0,c1,c2])
  57. s = 0
  58. for i in C:
  59. s+=dist(i)
  60. return(s,C)
  61.  
  62. n_max = 50
  63. #初始距离和
  64. print(‘第1次计算!’)
  65. dd,C = f(center)
  66. print(‘距离和为’+str(dd))
  67. print(‘第2次计算!’)
  68. center = [cent(i) for i in C]
  69. Dd,C = f(center)
  70. print(‘距离和为’+str(Dd))
  71. K = 3
  72.  
  73. while(K<n_max):
  74. #两次差值很小并且计算了一定次数
  75. if(math.sqrt(dd-Dd)<1 and K>20):
  76. break;
  77. print(‘第’+str(K)+‘次计算!’)
  78. dd = Dd
  79. print(‘距离和为’+str(dd))
  80. #当前聚类中心
  81. center = [cent(i) for i in C]
  82. Dd,C = f(center)
  83. K+=1
  84.  
  85.  
  86. #—聚类结果可视化部分—#
  87.  
  88. j = 0
  89. for i in C:
  90. if(j 0):
  91. plt.plot(i.T[0],i.T[1],‘ro’)
  92. if(j 1):
  93. plt.plot(i.T[0],i.T[1],‘b+’)
  94. if(j == 2):
  95. plt.plot(i.T[0],i.T[1],‘g*’)
  96. j+=1
  97.  
  98. plt.show()

 

(1):聚类成功的例子:

对于不合适的初始随机聚类中心,一般而言不会失败,成功次数较多。

K-means算法通俗原理及Python与R语言的分别实现-图片5

可以看出,其实第五次就收敛了,共分成了三类。它们的标签序号为:

第一类:[1, 3, 8, 9, 10, 11, 12, 13];

第二类:[4, 6, 14];

第三类:[0, 2, 5, 7, 15]

聚类图:

K-means算法通俗原理及Python与R语言的分别实现-图片6

聚类结果与实际情况一致

(2):聚类失败的例子:

有时候可能会失败,运行实验了三次出现了一次败笔,迭代过程如下:

K-means算法通俗原理及Python与R语言的分别实现-图片7

散点图:

K-means算法通俗原理及Python与R语言的分别实现-图片8

聚类失败图

显然,由于初始点的随机选取不当,导致聚类严重失真!这聚类效果明显就很差,表明随机产生的初始聚类中心应该不合适,最后不管怎么迭代,都不可能生成合适的聚类了,这与k-means算法的原理确实可以解释的。这就是k-means的最显著的缺点!

03K均值算法的R语言实现

用的还是上面程序一样的数据,R语言聚类就很方便,直接调用kmeans(data,聚类数)就能方便完成:

  
  1. rm(list = ls())
  2. path <- ‘C:\Users\26015\Desktop\clu.txt’
  3. dat <- read.csv(path,header = FALSE)
  4. dat <- t(dat)
  5. kc <- kmeans(dat,3)
  6. summary(kc)
  7. kc

查看聚类结果:

  
  1. K-means clustering with 3 clusters of sizes 8, 3, 5
  2.  
  3. Cluster means:
  4. [,1] [,2]
  5. 1 21.87500 26.00000
  6. 2 32.33333 31.66667
  7. 3 15.60000 16.80000

聚成3类,分别有8,3,5个数据

Clustering vector:

V1  V2  V3  V4  V5  V6  V7  V8  V9

3   1   3  1   2   3   2   3  1

V10 V11 V12 V13 V14 V15 V16

1   1   1   1   1   2   3

第一类:2,4,9,10,11,12,13,14

第二类:1,3,6,8,16;

第三类:5,7,15

由于Python下标是从“0”开始,所以两种方法聚类结果实际上是一样

相关文章:

K-means算法通俗原理及Python与R语言的分别实现

K均值聚类方法是一种划分聚类方法&#xff0c;它是将数据分成互不相交的K类。K均值法先指定聚类数&#xff0c;目标是使每个数据到数据点所属聚类中心的总距离变异平方和最小&#xff0c;规定聚类中心时则是以该类数据点的平均值作为聚类中心。 01K均值法原理与步骤 对于有N个…...

使用 db2diag 工具来分析 db2diag 日志文件

供数据库和系统管理员使用的主日志文件为管理通知日志。db2diag 日志文件旨在供 IBM 软件支持机构用于进行故障诊断。 管理通知日志消息也以标准化消息格式记录到 db2diag 日志文件。 db2diag 工具用于对 db2diag 日志文件中的大量信息进行过滤和格式化。过滤 db2diag 日志文…...

在Pytorch中使用Tensorboard可视化训练过程

这篇是我对哔哩哔哩up主 霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享 本节课我们来讲一下如何在pytouch当中去使用我们的tensorboard 对我们的训练过程进行一个可视化 左边有一个visualizing models data and training with tensorboard 主要是这么一个教程 那么这里…...

Redis 命令全解析之 Hash类型

文章目录 ⛄介绍⛄命令⛄RedisTemplate API⛄应用场景 ⛄介绍 Hash类型&#xff0c;也叫散列&#xff0c;其value是一个无序字典&#xff0c;类似于Java中的 HashMap 结构。 String结构是将对象序列化为JSON字符串后存储&#xff0c;当需要修改对象某个字段时很不方便&#xf…...

postgresql数据库配置主从并配置ssl加密

1、先将postgresql数据库主从配置好 参考&#xff1a;postgresql主从配置 2、在主节点配置ssl加密&#xff0c;使用navicat测试是否可以连接 参考&#xff1a;postgresql配置ssl 3、正常连接无误后&#xff0c;将root.crt、server.crt、server.key复制到从数据库节点的存储…...

IO多路转接之select

IO多路转接之select 1. IO多路转接&#xff08;复用&#xff09;2. select2.1 函数原型2.2 细节描述 3. 并发处理3.1 处理流程3.2 通信代码 原文链接 1. IO多路转接&#xff08;复用&#xff09; IO多路转接也称为IO多路复用&#xff0c;它是一种网络通信的手段&#xff08;机…...

linux如何删除大文件的第一行(sed)

可以用sed命令实现&#xff1a; 删除文档的第一行 1. sed -i 1d <file>删除文档的最后一行 1. sed -i $d <file>在文档指定行中增加一行 # 示例如下&#xff1a; echo "1"; echo "2"; echo "4"; echo "5"; # 想要在echo…...

Navicat 技术指引 | 适用于 GaussDB 分布式的备份/还原功能

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…...

【广州华锐互动VRAR】VR戒毒科普宣传系统有效提高戒毒成功率

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐渗透到各个领域&#xff0c;为人们的生活带来了前所未有的便利。在教育科普领域&#xff0c;VR技术的应用也日益广泛&#xff0c;本文将详细介绍广州华锐互动开发的VR戒毒科普宣传系统&#xff0…...

守护安全,六氟化硫气体泄漏报警装置校准服务

在电力工业中&#xff0c;六氟化硫&#xff08;SF6&#xff09;气体是一种重要的介质&#xff0c;它用作封闭式中、高压开关的灭弧和绝缘气体。六氟化硫气体的卓越性能实现了装置经济化、低维护化的操作。与普通装置相比&#xff0c;可以节省最多90&#xff05;的空间。 六氟化…...

概率测度理论方法(第 2 部分)

一、说明 欢迎回到这个三部曲的第二部分&#xff01;在第一部分中&#xff0c;我们为测度论概率奠定了基础。我们探索了测量和可测量空间的概念&#xff0c;并使用这些概念定义了概率空间。在本文中&#xff0c;我们使用测度论来理解随机变量。 作为一个小回顾&#xff0c;在第…...

实战:Docker Compose 下 Nginx、Java、Mysql 和 Redis 服务协同部署(包含解决浏览器访问Linux部署服务器本地资源问题)

1. 背景 在该实战中&#xff0c;我们将探讨如何使用Docker Compose协同部署Nginx、Java、Mysql和Redis服务&#xff0c;实现一个视频上传与展示的应用。具体需求如下&#xff1a; Java应用负责上传视频和图片资源到Nginx目录下&#xff0c;作为资源服务器。Nginx服务作为静态…...

Docker 设置国内镜像源

Docker 设置国内镜像源 您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器 具体配置如下&#xff1a; {"registry-mirrors" : ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirro…...

通信协议 远程调用RPC

1.通讯协议 所有的HDFS通讯协议都是建立在TCP/IP协议之上。 客户端通过一个可配置的TCP端口连接到Namenode&#xff0c;通过ClientProtocol协议与Namenode交 互。而Datanode使用DatanodeProtocol协议与Namenode交互。 一个远程过程调用(RPC)模型被抽象出来封装ClientProtoc…...

决策树 算法原理

决策树 算法原理 决策树的原理 决策树: 从训练数据中学习得出一个树状结构的模型 决策树属于判别模型 决策树是一种树状结构&#xff0c;通过做出一系列决策 (选择) 来对数据进行划分&#xff0c;这类似于针对一系列问题进行选择。 决策树的决策过程就是从根节点开始&#…...

Git全局设置命令---设置提交人邮箱

介绍 使用git命令设置提交人邮箱。 命令 git config --global user.email "xxxxxxxx.com"...

3DCAT+上汽奥迪:打造新零售汽车配置器实时云渲染解决方案

在 5G、云计算等技术飞速发展的加持下&#xff0c;云渲染技术迎来了突飞猛进的发展。在这样的背景下&#xff0c;3DCAT应运而生&#xff0c;成为了业内知名的实时云渲染服务商之一。 交互式3D实时云看车作为云渲染技术的一种使用场景&#xff0c;也逐步成为一种新的看车方式&a…...

物联网+AI智慧工地云平台源码(SaaS模式)

智慧工地云平台充分运用数字化技术&#xff0c;聚焦施工现场岗位一线&#xff0c;依托物联网、互联网、AI等技术&#xff0c;围绕施工现场管理的人、机、料、法、环五大维度&#xff0c;以及施工过程管理的进度、质量、安全三大体系为基础应用&#xff0c;实现全面高效的工程管…...

python打开相机,用鼠标左键框选矩形区域,支持一次框选多个矩形区域,通过鼠标右标清除上一次画的矩形。

方案一 import cv2# Global variables rectangles [] current_rectangle [] drawing False# Mouse callback function def mouse_callback(event, x, y, flags, param):global rectangles, current_rectangle, drawingif event cv2.EVENT_LBUTTONDOWN:drawing Truecurren…...

卷积之后通道数为什么变了

通道数增多与卷积之后得到的图像特征数量有关 卷积层的作用本来就是把输入中的特征分离出来变成新的 feature map&#xff0c;每一个输出通道就是一个卷积操作提取出来的一种特征。在此过程中ReLU激活起到过滤的作用&#xff0c;把负相关的特征点去掉&#xff0c;把正相关的留…...

SEO_资深运营的SEO外链建设核心技巧

<h2>SEO外链建设&#xff1a;资深运营的核心技巧解析</h2> <p>在当今数字营销的竞争激烈环境中&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;外链建设是提升网站排名的关键因素之一。资深运营者在这一领域已经积累了丰富的经验&#xff0c;他们不仅仅…...

Meixiong Niannian与SpringBoot微服务架构

Meixiong Niannian与SpringBoot微服务架构 1. 引言 在当今快速发展的AI应用领域&#xff0c;如何将强大的画图引擎无缝集成到企业级系统中是一个关键挑战。Meixiong Niannian作为一款高性能的AI画图引擎&#xff0c;能够生成高质量的图像内容&#xff0c;而SpringBoot微服务架…...

OpenCV实战:用Python+SIFT+八点算法搞定双目视觉匹配(附完整代码)

OpenCV实战&#xff1a;PythonSIFT八点算法实现双目视觉精准匹配 在计算机视觉领域&#xff0c;立体匹配是一个经典而富有挑战性的问题。想象一下&#xff0c;当你用双眼观察世界时&#xff0c;大脑能自动计算出物体的距离——这正是双目视觉系统要模拟的过程。本文将带你用Pyt…...

Qwen3-ASR-0.6B WebUI实战:中文方言自动识别与结果导出操作

Qwen3-ASR-0.6B WebUI实战&#xff1a;中文方言自动识别与结果导出操作 1. 快速了解Qwen3-ASR-0.6B语音识别模型 Qwen3-ASR-0.6B是一个轻量级但性能强大的语音识别模型&#xff0c;专门为实际应用场景设计。这个模型只有6亿参数&#xff0c;但识别效果却相当出色&#xff0c;…...

DeepSeek-OCR-2实战教程:OCR结果JSON Schema解析与结构化数据入库指南

DeepSeek-OCR-2实战教程&#xff1a;OCR结果JSON Schema解析与结构化数据入库指南 1. 项目简介 DeepSeek-OCR-2是基于深度学习的智能文档解析工具&#xff0c;专门针对结构化文档内容提取而设计。与传统的OCR工具只能提取纯文本不同&#xff0c;这个工具能够精准识别文档的排…...

Nanbeige 4.1-3B赋能微信小程序:打造智能客服对话机器人

Nanbeige 4.1-3B赋能微信小程序&#xff1a;打造智能客服对话机器人 最近在帮一个做电商的朋友琢磨怎么优化他们的客服系统。他们每天要处理大量重复的咨询&#xff0c;比如“什么时候发货”、“怎么退换货”&#xff0c;人工客服忙得团团转&#xff0c;用户还得排队等。这让我…...

终极指南:如何快速搭建NixOS配置开发环境 [特殊字符]

终极指南&#xff1a;如何快速搭建NixOS配置开发环境 &#x1f680; 【免费下载链接】linux-nixos-hyprland-config-dotfiles Linux &#x1f427; configuration based on NixOS ❄️, Hyprland, and Catppuccin Macchiato theme &#x1f638; for a consistent, complete, a…...

从实验室到产品:脑机接口(BCI)开发中,EEG实时预处理流程设计与避坑指南

从实验室到产品&#xff1a;脑机接口(BCI)开发中EEG实时预处理流程设计与避坑指南 在咖啡馆见到那位渐冻症患者用脑电波操控机械臂喝咖啡时&#xff0c;我意识到脑机接口技术正从实验室走向真实世界。但鲜有人提及的是&#xff0c;这套酷炫系统背后藏着怎样的信号处理炼狱——当…...

JiYuTrainer:极域电子教室多任务学习解决方案 - 提升教学环境下的自主操作能力

JiYuTrainer&#xff1a;极域电子教室多任务学习解决方案 - 提升教学环境下的自主操作能力 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 在现代数字化教学环境中&#xff0c;极…...

一文搞懂训练大模型的数据怎么准备!

谈到大模型&#xff0c;很多人第一反应都是模型参数大、算力强&#xff0c;但其实数据才是大模型真正的底座。没有足够大、足够干净的数据&#xff0c;再先进的模型也发挥不出威力。今天就从数据层面&#xff0c;把大模型训练的几个关键环节梳理清楚。 数据采集与清洗 大模型训…...