R实现KMeans聚类算法教程

2023-05-16

本文和你一起学习无监督机器学习算法 ———— kmeans算法,并在R中给详细的实现示例和步骤。

什么是k-means聚类算法

聚类是从数据集中对观测值进行聚类的机器学习方法。它的目标是聚类相似观测值,不同类别之间差异较大。聚类是一种无监督学习方法,因为它仅尝试从数据集中发现结构,而不是预测应变量的值。

下面是一个市场营销中对客户分类的场景,通过下面客户信息:

  • 家庭收入
  • 住房面积
  • 户主职业
  • 据城区距离

我们利用这些信息进行聚类,可识别相似家庭,从而能够识别某类型家庭可能购买某种产品或对某种类型的广告反应更好。

最常用的聚类算法就是k-means聚类算法,下面我们介绍k-means算法并通过示例进行说明。

k-means聚类算法把数据集中每个观测值分为K个类别。每个分类中的观测值相当类似,K类之间彼此差异较大。实际应用中执行下列几步实现k-means聚类算法:

  1. 确定K值

首先确定把数据集分为几类。通常我们简单测试几个不同值K,然后分析结果,确定那个值更有现实意义。

  1. 将每个观察结果随机分配到一个初始簇中,从1到K。

  2. 执行以下步骤,直到集群分配停止变化。

  • 对于K个集群中的每一个,计算集群的质心。这仅仅是第k个簇中观测的p特征的向量。
  • 将每个观测值分配到质心最近的簇中。在这里最接近的是用欧氏距离来定义的。

下面通过示例展示R的实现过程。

R 实现kmeans聚类算法

加载包

首先加载两个包,包括kmeans算法的一些辅助函数。

library(factoextra)
library(cluster)

加载示例数据

对于本例我们将使用R中内置的usarrest数据集,该数据集包含1973年美国每个州每10万居民因谋杀、袭击和强奸而被捕的人数,以及每个州居住在城市地区的人口百分比(UrbanPop)。

#load data
df <- USArrests

#remove rows with missing values
df <- na.omit(df)

#scale each variable to have a mean of 0 and sd of 1
df <- scale(df)

#view first six rows of dataset
head(df)

#                Murder   Assault   UrbanPop         Rape
# Alabama    1.24256408 0.7828393 -0.5209066 -0.003416473
# Alaska     0.50786248 1.1068225 -1.2117642  2.484202941
# Arizona    0.07163341 1.4788032  0.9989801  1.042878388
# Arkansas   0.23234938 0.2308680 -1.0735927 -0.184916602
# California 0.27826823 1.2628144  1.7589234  2.067820292
# Colorado   0.02571456 0.3988593  0.8608085  1.864967207

上面代码首先加载USArrests数据集,删除缺失值,对数据值进行标准化。

寻找最佳聚类数量

执行kmeans聚类算法,我们可以使用内置包stat中的kmeans()函数,语法如下:

kmeans(data, centers, nstart)

  • data : 数据集名称
  • centers: 聚类数量,即选择k的值
  • nstart: 初始配置个数。因为不同的初始启动集合可能会导致不同的结果,所以建议使用几种不同的初始配置。k-means算法将找到导致簇内变异最小的初始配置。

既然在使用kmeans函数之前并不确定最优聚类数量,下面通过两个图来辅助我们决定:

  1. 聚类数量 vs. 总体平方和

首先使用 fviz_nbclust 函数创建一个图,展示聚类数量及总体平方和之间的关系:

fviz_nbclust(df, kmeans, method = "wss")

在这里插入图片描述

通常我们创建这类图形寻找某个K类对应的平方和值开始弯曲或趋于平缓的肘形。这通常是最理想的聚类数量。上图中显然在k = 4个时出现肘形

  1. 聚类数量 vs. 差距统计

另一个决定最佳聚类数量的是使用指标:差距统计。它用于比较不同k值聚类差距变化情况。使用cluster包中的clusGap()以及fviz_gap_stat()函数画图:

#calculate gap statistic based on number of clusters
gap_stat <- clusGap(df,
                    FUN = kmeans,
                    nstart = 25,
                    K.max = 10,
                    B = 50)

#plot number of clusters vs. gap statistic
fviz_gap_stat(gap_stat)

在这里插入图片描述

从上图可以看到k=4时,差距统计最大,这与前面图的结果一致。

使用最优k执行kmeans聚类

最后,我们执行kmeans函数,使用k=4作为最优值:

# 设置随机种子,让结果可以重现
set.seed(1)

# 调用kmeans聚类算法 k = 4
km <- kmeans(df, centers = 4, nstart = 25)

# 查看结果
km

# Show in New Window
# Clustering k = 1,2,..., K.max (= 10): .. done
# Bootstrapping, b = 1,2,..., B (= 50)  [one "." per sample]:
# .................................................. 50 
# R Console
# 
# 
# Show in New Window
# K-means clustering with 4 clusters of sizes 13, 13, 16, 8
# 
# Cluster means:
#       Murder    Assault   UrbanPop        Rape
# 1 -0.9615407 -1.1066010 -0.9301069 -0.96676331
# 2  0.6950701  1.0394414  0.7226370  1.27693964
# 3 -0.4894375 -0.3826001  0.5758298 -0.26165379
# 4  1.4118898  0.8743346 -0.8145211  0.01927104
# 
# Clustering vector:
#        Alabama         Alaska        Arizona       Arkansas     California       Colorado 
#              4              2              2              4              2              2 
#    Connecticut       Delaware        Florida        Georgia         Hawaii          Idaho 
#              3              3              2              4              3              1 
#       Illinois        Indiana           Iowa         Kansas       Kentucky      Louisiana 
#              2              3              1              3              1              4 
#          Maine       Maryland  Massachusetts       Michigan      Minnesota    Mississippi 
#              1              2              3              2              1              4 
#       Missouri        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
#              2              1              1              2              1              3 
#     New Mexico       New York North Carolina   North Dakota           Ohio       Oklahoma 
#              2              2              4              1              3              3 
#         Oregon   Pennsylvania   Rhode Island South Carolina   South Dakota      Tennessee 
#              3              3              3              4              1              4 
#          Texas           Utah        Vermont       Virginia     Washington  West Virginia 
#              2              3              1              3              3              1 
#      Wisconsin        Wyoming 
#              1              3 
# 
# Within cluster sum of squares by cluster:
# [1] 11.952463 19.922437 16.212213  8.316061
#  (between_SS / total_SS =  71.2 %)
# 
# Available components:
# 
# [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
# [6] "betweenss"    "size"         "iter"         "ifault"     

从结果可见:

  • 16 州分在第一个类
  • 13 州分在第二个类
  • 13 州分在第三个类
  • 8 州分在第四个类

我们可以通过fviz_cluster()函数在二维空间中以散点图方式展示结果:

#plot results of final k-means model
fviz_cluster(km, data = df)

在这里插入图片描述

也可以使用aggregate()函数查看每个类中变量的均值:

#find means of each cluster
aggregate(USArrests, by=list(cluster=km$cluster), mean)

# cluster	  Murder   Assault	UrbanPop	    Rape
# 				
# 1	3.60000	  78.53846	52.07692	12.17692
# 2	10.81538 257.38462	76.00000	33.19231
# 3	5.65625	 138.87500	73.87500	18.78125
# 4	13.93750 243.62500	53.75000	21.41250

输出结果解释如下:

  • 在第一类中的州中平均每100,000人谋杀数为 3.6
  • 在第一类中的州中平均每100,000人袭击数为 78.5
  • 在第一类中的州中平均每100,000人城区居民率为 52.1%
  • 在第一类中的州中平均每100,000人强奸数为 3.6 12.2

最后我们把聚类结果附加到原始数据集中:

#add cluster assigment to original data
final_data <- cbind(USArrests, cluster = km$cluster)

#view final data
head(final_data)

# 	    Murder	Assault	UrbanPop  Rape	 cluster
# 				
# Alabama	    13.2	236	58	  21.2	 4
# Alaska	    10.0	263	48	  44.5	 2
# Arizona	     8.1	294	80	  31.0	 2
# Arkansas     8.8	190	50	  19.5	 4
# California   9.0	276	91	  40.6	 2
# Colorado     7.9	204	78	  38.7	 2

kmeans 算法的优缺点

优点:

  • 很快的算法
  • 能够处理大数据集

缺点:

  • 在执行算法之前需要指定聚类数量
  • 对异常值敏感

总结

本文我们讨论了kmeans算法的概念,并在R中给详细实现示例和步骤。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R实现KMeans聚类算法教程 的相关文章

  • 在Matlab实现Kmeans算法(每行代码带注释)

    目录 一 前言 二 VQ概述 三 Kmeans算法 K means 的算法步骤为 四 Matlab代码实现过程 五 一点点可选改动 个人看法 参考链接 一 前言 本人对机器学习 人工智能算法方面没什么研究 只是学习过程中恰好碰到了 一开始看
  • python中的k-means:确定哪些数据与每个质心相关联

    我一直在使用scipy cluster vq kmeans用于进行一些 k 均值聚类 但想知道是否有一种方法可以确定每个数据点 假定 与哪个质心相关联 显然你可以手动执行此操作 但据我所知 kmeans 函数不会返回此值 有一个功能kmea
  • Java读取wav文件

    我想用 Java 读取 wav 文件 并且将使用 K means 对它们进行分类 我怎样才能读取Java中的wav文件并将它们分配到一个数组或类似的东西 你可以建议它的想法 来对它们进行分类 EDIT 我想使用 API 来读取 wav 文件
  • Spark MLLib Kmeans 来自数据帧,然后再次返回

    我的目标是使用 Spark 1 3 1 MLLib 将 kmeans 聚类算法应用于非常大的数据集 我已经使用 Spark 中的 hiveContext 调用了 HDFS 中的数据 并且最终希望以这种方式将其放回原处 以这种格式 I D c
  • Kmeans 对 pandas 数据框中的每个组进行聚类并分配聚类

    我想通过使用 kmeans 聚类对组月的 X2 和 X3 进行聚类 我需要对两个变量进行聚类 另外 我想根据每个簇的平均值将簇 0 簇 1 和簇 2 分配为 强 平均 弱 最高意味着强簇 下面是我的示例数据集 df pd DataFrame
  • 在 Apache Spark Python 中自定义 K-means 距离公式

    现在我使用 K means 进行聚类和跟踪本教程 and API 但我想使用自定义公式来计算距离 那么如何使用 PySpark 在 k means 中传递自定义距离函数呢 一般来说 使用不同的距离度量没有意义 因为 k 均值 与k 中心点
  • 如何在 K - 均值算法中优化 K [重复]

    这个问题在这里已经有答案了 可能的重复 使用 k 均值聚类时如何确定 k https stackoverflow com questions 1793532 how do i determine k when using k means c
  • 使用 k 均值算法进行异常值检测

    我希望你能帮助我解决我的问题 我正在尝试使用 kmeans 算法来检测异常值 首先 我执行算法并选择那些距聚类中心距离较远的对象作为可能的异常值 我不想使用绝对距离 而是想使用相对距离 即对象到聚类中心的绝对距离与聚类中所有对象到其聚类中心
  • scipy 中的 kmeans 和 kmeans2 有什么区别?

    我是机器学习的新手 想知道 scipy 中 kmeans 和 kmeans2 之间的区别 根据文档 它们都使用 k means 算法 但是如何选择它们呢 根据文档 kmeans2 似乎是标准的 k 均值算法 并且运行直到收敛到局部最优 并且
  • SOM(自组织映射)和 K 均值有什么区别?

    stackoverflow中只有一个与此相关的问题 更多的是关于哪个更好 我只是不太明白其中的区别 我的意思是它们都使用向量 这些向量被随机分配给集群 它们都使用不同集群的质心来确定获胜的输出节点 我的意思是 差异到底在哪里 在 K 均值中
  • OpenCV K 均值 (kmeans2)

    我正在使用 Opencv 的 K means 实现来对一大组 8 维向量进行聚类 它们聚类得很好 但我找不到任何方法来查看聚类过程创建的原型 这可能吗 OpenCV 似乎只提供对集群索引 或标签 的访问 如果没有 我想是时候自己实现了 我不
  • 使用谱聚类对看不见的点进行聚类

    我在用谱聚类 http papers nips cc paper 2092 on spectral clustering analysis and an algorithm方法对我的数据进行聚类 实施似乎工作正常 但是 我有一个问题 我有一
  • mutate/tibble 中的自定义函数

    我正在关注一个tutorial https cran r project org web packages broom vignettes kmeans html我正在尝试将这部分应用于我的数据 问题 kclusts lt tibble k
  • Apache Spark MLLib - 使用 IDF-TF 向量运行 KMeans - Java 堆空间

    我正在尝试从 大 文本文档集合 TF IDF 向量 在 MLLib 上运行 KMeans 文档通过 Lucene 英语分析器发送 稀疏向量由 HashingTF transform 函数创建 无论我使用的并行程度如何 通过合并函数 KMea
  • 从彩色背景中提取黑色对象

    人眼很容易辨别black来自其他颜色 但是计算机呢 我在普通的A4纸上打印了一些色块 由于组成彩色图像有青色 品红色和黄色三种墨水 所以我设置每个块的颜色C 20 C 30 C 40 C 50 以及其余两种颜色是 0 这是我的源图像的第一列
  • Scikit Learn - K-Means - 肘部 - 标准

    今天我想学习一些关于 K means 的知识 我已经了解该算法并且知道它是如何工作的 现在我正在寻找正确的 k 我发现肘部准则作为检测正确的 k 的方法 但我不明白如何将它与 scikit learn 一起使用 在 scikit learn
  • 哪里可以找到可靠的 K-medoid(不是 k-means)开源软件/工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在学习 K medoids 算法 所以如果我提出不恰当的问题 我很抱歉 据我所知 K medoid
  • Apache Spark 和 scikit_learn 之间的 KMeans 结果不一致

    我正在使用 PySpark 对数据集执行聚类 为了找到簇的数量 我对一系列值 2 20 进行了聚类 并找到了wsse 簇内平方和 每个值的值k 在这里我发现了一些不寻常的东西 根据我的理解 当你增加集群数量时 wsse单调递减 但我得到的结
  • scikit-learn kmeans 聚类的初始质心

    如果我已经有一个可以作为初始质心的 numpy 数组 我该如何正确初始化 kmeans 算法 我正在使用 scikit learn Kmeans 类 这个帖子 具有选定初始中心的 k 均值 https stackoverflow com q
  • 如何可视化多维数据上的 kmeans 聚类

    我在 mnist 数据集上使用 kmeans 聚类算法 并希望可视化聚类后的图 到目前为止我做了这个 from mnist import MNIST mndata MNIST Datasets X train y train mndata

随机推荐

  • 微擎按照UID获取用户绑定手机号

    按照UID获取用户信息 users 61 pdo fetch 34 select from 34 tablename 39 users 39 34 where uid 61 W 39 uid 39 34 按照UID获取用户绑定手机号 thi
  • AD-----间距、线宽、阻焊、铺铜规则设置

    1 间距规则 快捷键 D 43 R xff0c 出现如下界面 xff0c 在Clearance 中 即可设置对应的规则 Track 走线 SMD Pad 贴片式焊盘 TH Pad 通孔焊盘 Via xff1a 过孔 Copper xff1a
  • 【Python】程序员情人节搞事情的程序

    程序员情人节搞事情的程序 效果展示源码备注1 这段代码用 python 实现2 用 pyinstaller 打包成exe3 没有 pyinstaller 的话 xff0c 可以直接用 pip 安装 效果展示 源码 import pygame
  • Maven项目在编译及导入Eclipse时出现的错误汇总处理

    Maven项目在编译及导入Eclipse时出现的错误处理汇总 Maven在构建项目时确实是比较强大 xff0c 而且也越来越流行 xff0c 目前不但越来越多的开源项目 xff0c 甚至越来越多的商业项目都在使用Maven 但是不得不说Ma
  • AS导入项目报错:Plugin with id ‘com.android.application‘ not found

    转自 xff1a https www cnblogs com cuichen16 p 10785951 html 从github或第三方Demo中获取的项目导入到AndroidStudio中报错Plugin with id com andr
  • C#向Excel报表中插入图片的2种方法

    这几天做向Excel插入数据 xff0c 其中有插入图片的需求 xff0c 经试验 xff0c 下面2种方法都可以插入图片 xff0c 但各有不同的用处 现将这2种方法共享出来 xff0c 希望需要的朋友进行参考 xff0c 代码中已经有详
  • Response.Redirect 打开新窗口的两种方法

    一般情况下 xff0c Response Redirect 方法是在服务器端进行转向 xff0c 因此 xff0c 除非使用 Response Write 34 lt script gt window location 61 39 http
  • C# 实现向浏览器的兼容性视图列表中添加、删除网站和检查网站是否在兼容性网站列表中

    今天回答论坛上的一个问题 xff0c 搜索了一下网上 xff0c 并没有找到一个完整的例子 xff0c 下面根据网上的一些资料 xff0c 经过转换 完善成一个完整的例子 下面的例子可以实现添加 删除 检测网站是否在兼容性网站列表中的功能
  • Excel中 ColorIndex 属性值和颜色对照表

    Excel中 ColorIndex 属性值和颜色对照表 资料参考 http msdn microsoft com en us library cc296089 aspx http www mvps org dmcritchie excel
  • AJAX(XMLHttpRequest)进行跨域请求方法详解(一)

    注意 xff1a 以下代码请在Firefox 3 5 Chrome 3 0 Safari 4之后的版本中进行测试 IE8的实现方法与其他浏览不同 跨域请求 xff0c 顾名思义 xff0c 就是一个站点中的资源去访问另外一个不同域名站点上的
  • 分享30道Redis面试题,面试官能问到的我都找到了

    1 什么是Redis xff1f 简述它的优缺点 xff1f Redis本质上是一个Key Value类型的内存数据库 xff0c 很像memcached xff0c 整个数据库统统加载在内存当中进行操作 xff0c 定期通过异步操作把数据
  • AJAX(XMLHttpRequest)进行跨域请求方法详解(二)

    注意 xff1a 以下代码请在Firefox 3 5 Chrome 3 0 Safari 4之后的版本中进行测试 IE8的实现方法与其他浏览不同 2 xff0c 预检请求 预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTION
  • 将文本文件的内容或者文字保存成图片

    调用方法 xff1a ConvertTextFileToImage Server MapPath 34 Log txt 34 Server MapPath 34 Log png 34 实现代码 xff1a void ConvertTextF
  • Windows 文件资源管理器中搜索带特殊字符文件名的方法

    今天处理一些文件 xff0c 文件夹这包含有类似 16年普通高等学校招生全国统一考试 英语 的文件名 xff0c 想全部找出来删除掉 xff0c 直接在文件资源管理器里面输入 是搜索不到想要的文件的 xff0c 这些是特殊字符 xff0c
  • 脑成像坐标系: MNI + Talairach

    一 脑成像坐标系 xff1a MNI Talairach MNI 脑 Montreal Neurological Institute 是基于大量的正常被试MRI扫描结果得到的标准脑 xff08 当然是欧罗巴人群的 xff09 Talaira
  • windows10隐藏分区(隐藏efi系统分区)

    我们需要使用diskpart来移除这个误显示的盘符 可能使用的命令 xff1a 1 以管理员身份运行CMD xff1b 2 运行diskpart命令 xff1b 3 list disk 显示所有安装的磁盘 xff1b 4 select di
  • 干支纪年和纪日算法

    怎样从已知年份和日期得到对应的干支纪年和纪日 文 xff0f 葛民勤 摘要 xff1a 从已知年份计算干支纪年很简单 xff1a 年份数减3 xff0c 除以10的余数是天干 xff0c 除以12的余数是地 支 从已知日期计算干支纪日的公式
  • Shell 脚本监控磁盘空间

    df 命令可以展示文件系统的磁盘有效空间信息 如果不指定文件名 xff0c 则当前所有挂载的文件系统有效空间信息 实现步骤 使用 df 查看磁盘信息使用 grep命令 过滤文件系统 xff0c 获取空间使用百分比通过Shell 脚本进行监控
  • R 实现熵权法计算权重

    按照信息论基本原理的解释 xff0c 信息是系统有序程度的一个度量 xff0c 熵是系统无序程度的一个度量 xff1b 根据信息熵的定义 xff0c 对于某项指标 xff0c 可以用熵值来判断某个指标的离散程度 xff0c 其信息熵值越小
  • R实现KMeans聚类算法教程

    本文和你一起学习无监督机器学习算法 kmeans算法 xff0c 并在R中给详细的实现示例和步骤 什么是k means聚类算法 聚类是从数据集中对观测值进行聚类的机器学习方法 它的目标是聚类相似观测值 xff0c 不同类别之间差异较大 聚类