我的编程空间,编程开发者的网络收藏夹
学习永远不晚

R语言实现KMeans聚类算法实例教程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

R语言实现KMeans聚类算法实例教程

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

什么是k-means聚类算法

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

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

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

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

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

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

1.确定K值

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

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

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

对于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个时出现肘形。

2.聚类数量 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中给详细实现示例和步骤。

总结

到此这篇关于R语言实现KMeans聚类算法教程的文章就介绍到这了,更多相关R语言KMeans聚类算法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

R语言实现KMeans聚类算法实例教程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何利用python的KMeans和PCA包实现聚类算法

如何利用python的KMeans和PCA包实现聚类算法,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。题目: 通过给出的驾驶员行为数据(trip.csv),对驾
2023-06-02

如何使用Python语言实现K-Means聚类算法

这篇文章给大家分享的是有关如何使用Python语言实现K-Means聚类算法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 概述1.1 无监督学习 在一个典型的监督学习中,我们有一个有标签的训练集,我
2023-06-26

C语言如何写类实现教程示例

这篇文章主要为大家介绍了C语言如何写类的实现教程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-17

Python实现DBSCAN聚类算法并样例测试

什么是聚类算法 聚类是一种机器学习技术,它涉及到数据点的分组。给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组。理论上,同一组中的数据点应该具有相似的属性和/或特征,而不同组中的数据点应该具有高度不同的属性和/或特征。聚类
2022-06-02

R语言中怎么实现随机森林算法

在R语言中,您可以使用 randomForest 包来实现随机森林算法。以下是一个简单的示例代码,演示如何在R中使用随机森林算法进行分类或回归:首先,安装并加载 randomForest 包:install.packages("rando
R语言中怎么实现随机森林算法
2024-04-03

K均值聚类算法的Java版实现代码示例

1.简介K均值聚类算法是先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。一旦全部对象都被分配了,每个聚类的聚类中心会根据聚
2023-05-30

Go语言基础教程:四则运算的实现方法

Go语言基础教程:四则运算的实现方法,需要具体代码示例引言:Go语言作为一门开发云原生应用的编程语言,受到越来越多开发者的青睐。作为学习Go语言的初学者,掌握基本的运算操作是必不可少的。本文将介绍Go语言下实现四则运算的基本方法,并提供具体
Go语言基础教程:四则运算的实现方法
2023-12-23

使用R语言怎么实现一个随机森林算法

这篇文章给大家介绍使用R语言怎么实现一个随机森林算法,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。R语言包“randomForest”用于创建随机森林。安装R包在R语言控制台中使用以下命令安装软件包。 您还必须安装相关
2023-06-15

java语言实现权重随机算法完整实例

前言现在app就是雨后春笋,嗖嗖的往外冒啊,有经验的、没经验的、有资历的、没资历的都想着创业,创业的90%以上都要做一个app出来,好像成了创业的标配。做了app就得推广啊,怎么推,发券送钱是最多用的被不可少的了,现在好多产品或者运营都要求
2023-05-30

R语言实现各种数据可视化的超详细教程

Python语言越来越流行,尤其是在机器学习与深度学习等领域,但是R语言在数据分析与可视化方面仍然具有绝对的优势,下面这篇文章主要给大家介绍了关于R语言实现各种数据可视化的超详细教程,需要的朋友可以参考下
2022-11-13

K-means聚类算法介绍与利用python实现的代码示例

聚类 今天说K-means聚类算法,但是必须要先理解聚类和分类的区别,很多业务人员在日常分析时候不是很严谨,混为一谈,其实二者有本质的区别。 分类其实是从特定的数据中挖掘模式,作出判断的过程。比如Gmail邮箱里有垃圾邮件分类器,一开始的时
2022-06-04

python利用K-Means算法实现对数据的聚类案例详解

目的是为了检测出采集数据中的异常值。所以很明确,这种情况下的簇为2:正常数据和异常数据两大类 1、安装相应的库import matplotlib.pyplot as plt # 用于可视化 from sklearn.cluster imp
2022-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录