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”开始,所以两种方法聚类结果实际上是一样

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

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

相关文章

定时补偿方案

1&#xff1a;需求描述 支持NVR升级后通道数变更&#xff0c;完成升级后&#xff0c;设备SDK上报通道数量给A平台&#xff0c;A平台将NVR通道数量同步给B平台&#xff0c;B平台自动调用C平台接口&#xff0c;同步通道数量给C平台&#xff0c;C平台重新生成通道序列号&#xff…

SuperMap iObject.NET三维场景拖拽框选实现详解及完整源代码(一)——环境准备及项目配置

作者&#xff1a;超图研究院技术支持中心-于丁1 SuperMap iObject.NET三维场景拖拽框选实现详解及完整源代码&#xff08;一&#xff09;——环境准备及项目配置   三维场景框选是一种在三维空间中进行选择和操作的功能&#xff0c;它可以让使用者通过鼠标拖动来创建一个矩形…

【Azure 架构师学习笔记】- Azure Databricks (2) -集群

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (1) - 环境搭建 前言 在上文中提到了ADB 的其中一个核心就是集群&#xff0c;所以这里专门研究一下ADB 的集群。 ADB 集群 首先了解一下ADB…

golang学习笔记——go流水线示例

range与数组、切片、集合 Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值&#xff0c;在集合中返回 key-value 对。 for 循环的 range 格式可以对 slice、map、数组、字…

SVN的下载的文件/文件夹,绿色图标没出来的解决办法

文章目录 一、适用情况示例二、SVN中文件左下角图标消失的解决步骤1. 图标消失的原因2.打开注册表3.svn相关设置4.重启生效 一、适用情况示例 SVN 下载&#xff1a; 如下图&#xff0c;左侧绿/红色图标没出来&#xff1a; 二、SVN中文件左下角图标消失的解决步骤 1. 图标消失…

html通过CDN引入Vue组件抽出复用

html通过CDN引入Vue组件抽出复用 近期遇到个需求&#xff0c;就是需要在.net MVC的项目中&#xff0c;对已有的项目的首页进行优化&#xff0c;也就是写原生html和js。但是咱是一个写前端的&#xff0c;写html还可以&#xff0c;.net的话&#xff0c;开发也不方便&#xff0c;还…

Redis 五大经典业务问题

一 缓存穿透 缓存穿透是指当请求的数据既不在缓存中也不存在于数据库中时&#xff0c;请求会直接穿透缓存层&#xff0c;到达数据库层。这通常是由于恶意攻击或者程序错误造成的&#xff0c;比如攻击者故意请求不存在的大量数据&#xff0c;导致缓存不命中&#xff0c;所有的请…

Servlet学习笔记

简介 浏览器请求处理流程&#xff1a;浏览器发请求 > 服务器tomcat( > 应用程序 ( > servlet) ) Servlet应用的三大作用域&#xff1a;request&#xff0c;session&#xff0c;application tomcat存放项目的层级结构 注释&#xff1a;servlet原引用包名 javax.serv…

机场信息集成系统系列介绍(2):机场航班报文处理系统

本文介绍机场航班报文处理系统。#机场##sita##AFTN##航空# 一、定义 机场航班报文处理系统是一种基于计算机技术的自动化处理系统&#xff0c;用于接收、解析、处理和传递与航班相关的报文信息。这些报文可能包括航班计划、航班状态更新、旅客信息等&#xff0c;通常来源于航…

(C++)只出现一次的数字I--异或

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://le…

〖大前端 - 基础入门三大核心之JS篇㊿〗- 面向对象之对象的方法、遍历、深浅克隆

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

【Linux】进程间通信之共享内存/消息队列/信号量

文章目录 一、共享内存的概念及原理二、共享内存相关接口说明1.shmget函数2.ftok函数3.shmat函数4.shmdt函数5.shmctl函数 三、用共享内存实现server&client通信1.shm_server.cc2.shm_client.cc3.comm.hpp4.查看ipc资源及其特征5.共享内存的优缺点6.共享内存的数据结构 四、…

【GIS】JDK版本升级到17后,GeoServer的图层无法通过openLayer预览

JDK版本升级到17后&#xff0c;图层无法通过openLayer预览 1. 错误图示 终端输出的错误 网页端无法显示图层&#xff0c;并且输出错误提示 2.原因猜测 估计可能是由于java17的模块化&#xff0c;Java被分成了多个独立部署和运行的模块&#xff0c;这使得Java应用能够更快…

Wireshark添加自定义协议解析

最终效果如下&#xff1a; 参考文档&#xff1a;https://mika-s.github.io/topics/ 此参考文档中7个例子教我们如何编写lua脚本去识别我们自定义的协议 安装Wireshark https://www.wireshark.org/上下载安装包安装即可。我的安装路径是D:\Install\Wireshark&#xff0c;在W…

kafka学习笔记--基础知识概述

本文内容来自尚硅谷B站公开教学视频&#xff0c;仅做个人总结、学习、复习使用&#xff0c;任何对此文章的引用&#xff0c;应当说明源出处为尚硅谷&#xff0c;不得用于商业用途。 如有侵权、联系速删 视频教程链接&#xff1a;【尚硅谷】Kafka3.x教程&#xff08;从入门到调优…

IT新闻资讯系统,使用mysql作为后台数据库,此系统具有显示数据库中的所有信息和删除两大功能。

表的准备&#xff1a; -- MySQL Administrator dump 1.4 -- -- ------------------------------------------------------ -- Server version 5.1.40-community /*!40101 SET OLD_CHARACTER_SET_CLIENTCHARACTER_SET_CLIENT */; /*!40101 SET OLD_CHARACTER_SET_RESULTSCHAR…

nodejs+vue+微信小程序+python+PHP个性化服装搭配系统APP-计算机毕业设计推荐 android

考虑到实际生活中在个性化服装搭配方面的需要以及对该系统认真的分析,将app权限按管理员和用户这两类涉及用户划分。 (a) 管理员&#xff1b;管理员使用本系统涉到的功能主要有个人中心、用户管理、个性穿搭管理、我的衣橱管理、服饰分类管理、我的收藏管理、系统管理等功能。 …

Unity使用打成图集的Sprite作为模型贴图使用的问题

大家好&#xff0c;我是阿赵。   有时候用Unity引擎做项目的时候&#xff0c;会遇到这样的需求&#xff0c;美术做了一些模型或者特效&#xff0c;然后策划想在游戏运行的时候&#xff0c;读取一些游戏图标放在特效或者模型上面当做贴图使用。   这个需求实现起来很简单&am…

【Hive】启动beeline连接hive报错解决

1、解决报错2、在datagrip上连接hive 1、解决报错 刚开始一直报错&#xff1a;启动不起来 hive-site.xml需要配置hiveserver2相关的 在hive-site.xml文件中添加如下配置信息 <!-- 指定hiveserver2连接的host --> <property><name>hive.server2.thrift.bin…

DIP——边缘提取与分割

1.使用canny算法进行边缘提取 本实验比较简单&#xff0c;基本思路是对原图像进行一个高斯模糊处理&#xff0c;用于去噪&#xff0c;之后转换为灰度图&#xff0c;直接调用cv库中的canny记性边缘提取。若想直接得到彩色边缘&#xff0c;则通过按位与操作&#xff0c;将原始彩色…