本文和你一起学习无监督机器学习算法 ———— 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中给详细实现示例和步骤。

R实现KMeans聚类算法教程相关推荐

  1. 手把手的K-means聚类算法教程(含简介及教育数据应用实例 Python实现)

    手把手的K-means聚类算法教程(含简介及教育数据应用实例 Python实现) 1. K-MEANS的基本原理 2. 数据预处理 2.1 数据读取:from Excel 2.2 数据预处理:标准化Z ...

  2. R语言中K-Means聚类算法

    K-Means聚类算法 # 设置工作空间 # 把"数据及程序"文件夹拷贝到F盘下,再用setwd设置工作空间 setwd("E:\\R_workspace\\R语言数据分 ...

  3. macOS Swift精品项目之查找图像的主色App 使用CIE LAB颜色空间和k-means聚类算法(教程含源码)

    实战需求 macOS Swift精品项目之查找图像的主色App 使用CIE LAB颜色空间和k-means聚类算法 本文价值与收获 看完本文后,您将能够作出下面的界面 基础知识 Color Space ...

  4. R语言KMeans聚类模型示例

    R语言KMeans聚类模型示例 K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大.该算法认为簇是由距离靠近的对象组成的,因此把得到 ...

  5. 基于经典的机器学习k-means聚类算法实现对三通道图片的压缩操作

    https://www.toutiao.com/a6573221465104056846/ 压缩图片的原理 k-means算法实现图像的压缩是k-means聚类算法的一个经典的应用,它把一个彩色图压缩 ...

  6. K-means聚类算法的三种改进(K-means++,ISODATA,Kernel K-means)介绍与对比

    原文:http://www.cnblogs.com/yixuan-xu/p/6272208.html K-means聚类算法的三种改进(K-means++,ISODATA,Kernel K-means ...

  7. K-Means聚类算法进行压缩图片

    K-Means聚类算法(二):算法实现及其优化 清雨影 2 年前 (最近在车间干活的时候把手砸伤了,所以打字还是有点不便,大家原谅我更新的慢,加上赞比较少,心情比较低落TAT) 首先介绍一下题图,这个 ...

  8. 机器学习算法精讲20篇(一)-k-means聚类算法应用案例(附示例代码)

    前言 k-means算法是非监督聚类最常用的一种方法,因其算法简单和很好的适用于大样本数据,广泛应用于不同领域,本文详细总结了k-means聚类算法原理 . 以下是我为大家准备的几个精品专栏,喜欢的小 ...

  9. MATLAB实战系列(三十八)-基于K-means聚类算法的MATLAB图像分割

    前言 以下是我为大家准备的几个精品专栏,喜欢的小伙伴可自行订阅,你的支持就是我不断更新的动力哟! MATLAB-30天带你从入门到精通 MATLAB深入理解高级教程(附源码) tableau可视化数据 ...

  10. Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解

        Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解 在Hadoop分布式环境下实现K-Means聚类算法的伪代码如下: 输入:参数0--存储样本数据的文本文件inpu ...

最新文章

  1. LDPC译码算法代码概述
  2. 浅谈代码的执行效率(2):编译器的威力
  3. 成功解决IndexError: index 14 is out of bounds for axis 1 with size 14
  4. 因子和(类素数筛选法)
  5. dart系列之:在dart中使用生成器
  6. 监管大屏系统_“警视”警务情指一体大屏可视化决策系统
  7. shell脚本实时监控进程连接数
  8. 本机不装Oracle,使用plsql连接远程Oracle的方法
  9. TIOBE 12 月编程语言排行榜:争夺年度编程语言,Java、C、Python、C# 即将开战!...
  10. 光模块基础知识【快速入门】02
  11. 中国互联网+政务建设产业运行状况分析及前景战略研究报告2022-2028年版
  12. 【舞女编程语言】:Ballerina 最新版和Ballerina Central
  13. php web音视频通话,实现音视频通话(Web)
  14. Python查找算法之狄克斯特拉算法
  15. zbrush是什么软件呢?可以用来做什么
  16. IMPERVA- 系统导出
  17. Linux:CPU状态信息us,sy,ni,id,wa,hi,si,st含义
  18. 十岁不愁、二十不悔、三十而立、四十不惑、五十知天命、六十耳顺、七十古来稀...
  19. 【数学】幂运算与快速幂取余
  20. python海龟画小猪佩奇动画片全集_用python画个小猪佩奇

热门文章

  1. 1.使用百度AI识图api,进行识图
  2. 淘宝技术这十年(子柳著)读书笔记
  3. 英雄连2一直显示连接relic服务器,英雄连2 联机PleaseWait问题解决详细教程
  4. 最近游戏更新 未整理 无图片 续3
  5. SEO学习必上的网址大全
  6. css怎么实现三角形边框,css border实现的三角形图案
  7. 通信系统、基本原理概念
  8. cruzer php sandisk 闪迪u盘量产工具_sandisk cruzer 32G U盘量产工具下载
  9. 彻底了解Windows XP操作系统登录类型
  10. c# JSON转变量实例