K 表示 R 中的聚类:带示例的分步教程
已发表: 2020-02-17作为一名数据科学家,您将进行大量聚类。 有许多类型的聚类算法可用,您应该精通所有这些算法。 在本文中,我们将讨论一种流行的聚类算法 K-means,并了解它是如何在 R 中使用的。
您将了解 R 中 K-means 聚类背后的基本理论以及如何使用它。 我们还在本文后面讨论了一个实际示例。 请务必将此文章添加为书签以供将来参考。 阅读有关数据挖掘中聚类分析的更多信息。
在我们开始讨论 R 中的 K 表示聚类之前,我们应该看一下存在的聚类算法的类型,以便您更好地了解该算法如何处理它们。
阅读:数据科学领域的顶级 R 库
目录
聚类类型
当您将多个对象分组时,将彼此最相似的对象放在一个紧密的簇中,这称为聚类。 对象之间的距离可能与它们的相似性有关。 相似性显示了数据科学中两个不同对象之间关系的强度。 聚类是一种流行的数据挖掘技术。 聚类在许多行业和领域都有应用,包括图像分析、机器学习、数据压缩、模式识别等。
聚类有两种类型——硬的和软的。 让我们简要讨论一下它们。
- 在硬集群中,一个数据点将完全属于一个集群,或者根本不属于它。 中间没有。
- 在软集群中,由于某种可能性或概率,一个数据对象可能一次与多个集群相关。
从世界顶级大学在线学习数据科学课程。 获得行政 PG 课程、高级证书课程或硕士课程,以加快您的职业生涯。
聚类算法的类型
就像有不同类型的集群一样,也有不同类型的集群算法。 您可以根据它们的集群模型来区分算法。 这意味着您可以根据它们如何形成集群来区分它们。 如果我们开始谈论各种聚类算法,那么本指南将变得太长且远离重点。 因此,我们将只讨论几种突出类型的聚类算法。 有基于连通性、基于质心、基于密度和基于分布的聚类算法。
K-Means 的基本概念
K-means 的基本概念非常简单。 K-means 与定义集群有关,以便集群内的总变化尽可能小。 有多种 k-means 算法。 最常见的 k-means 算法是 Hartigan-Wong 算法,该算法指出簇内总变化等于质心与其项目之间的欧几里得距离平方距离之和:
W( C k )= x i C k ( x i – k ) 2
这里x i是指属于集群C k的数据点, k是指存在于集群 Ck 中的数据点的平均值。
x i的值应使x i和k之间的平方距离之和最小。
什么是 K-means 算法?
要使用该算法,我们首先必须说明将出现在结果中的簇数 K。 该算法首先随机选择 K 个对象作为初始聚类中心。 我们称这些对象为簇质心或均值。 然后我们将剩余的对象分配给它们最近的质心。 聚类质心和对象之间的欧几里得距离决定了它们的距离。
在我们将对象分配给它们各自的质心之后,算法会计算聚类的平均值。 在重新计算之后,我们重新检查观察结果,看看它们是否可能更接近不同的集群。 然后,我们相应地将对象重新分配给质心。 我们不断重复这些步骤,直到分配集群停止。 这意味着当迭代中形成的集群与其前一次迭代中的集群相同时,我们停止重复迭代。
使用 K-Means 聚类(示例)
现在您已经知道 R 中的 K-means 算法是什么以及它是如何工作的,让我们讨论一个示例以便更好地说明。 在此示例中,我们将使用批发客户数据库对组织的客户进行聚类。 此问题的数据可在 Berkley UCI 的机器学习存储库中获得。 你可以在这里查看。
首先,我们将读取数据。 然后得到它的摘要。 阅读数据并查看其摘要后,您会发现不同类别的顶级消费者之间存在一些明显差异。 您会发现一些异常值,这些异常值无法通过标准化(或缩放)轻松删除。 有了这些数据,企业就希望了解他们的中端客户大部分时间都在购买什么。 那是因为一家公司会对他们的顶级客户购买什么有一个不错的了解。
打造中层客户集群,首先要从各个品类中剔除顶层客户。 所以我们将删除前 5 个并创建一个新集合。 我们将这样做:
top.n.custs <- function (data,cols,n=5) { #需要一些数据框和前N个删除
idx.to.remove <-integer(0) #初始化一个向量来保存被移除的客户
for (c in cols){ # 对于我们传递给此函数的数据中的每一列
col.order <-order(data[,c],decreasing=T) #按降序对列“c”进行排序(顶部较大)
#Order 返回排序后的索引(例如第 15、3、7、1、...行),而不是排序后的实际值。
idx <-head(col.order, n) #取排好序的列C的前n
idx.to.remove <-union(idx.to.remove,idx) #合并和去重需要移除的row id
}
return(idx.to.remove) #返回要移除的客户的索引
}
top.custs <-top.n.custs(数据,cols=3:8,n=5)
length(top.custs) #需要移除多少个客户?
data[top.custs,] #查看可用客户
data.rm.top<-data[-c(top.custs),] #删除需要的客户

有了这个新文件,我们就可以开始进行聚类分析了。 要执行聚类分析,我们将使用以下代码:
set.seed(76964057) #为可重复性设置种子
k <-kmeans(data.rm.top[,-c(1,2)],centers=5) #创建5个簇,去掉1和2列
k$centers #显示集群中心
table(k$cluster) #给出每个簇中数据点的个数
在给定数据库上运行此代码后,您将获得以下结果:
- 第一个集群将有高质量的洗涤剂,但新鲜食品的数量很少
- 第三个集群将有更多的新鲜产品
您需要使用 insidess 和 betweenss 来详细解释结果。 k$withinss 等于每个数据对象到集群中心的距离平方和。 范围越低,结果越好。 如果您的数据中的内部度量值很高,则意味着存在许多异常值,您需要执行数据清理。 k$betweenss 是聚类不同中心之间距离平方的总和。 聚类中心之间的距离应尽可能高。
阅读:R中6个更常用的数据结构
您应该借助反复试验来获得最准确的结果。 为此,您需要尝试不同的 K 值。当您的结果图表未显示集群内部的增量时,该点将是最适合 K 的值。您可以找到该值K 通过以下代码:
rng<-2:20 #K 从 2 到 20
尝试 <-100 #运行 K 均值算法 100 次
avg.totw.ss <-integer(length(rng)) #设置一个空向量来保存所有的点
for(v in rng){ # 对于范围变量的每个值
v.totw.ss <-integer(tries) #设置一个空向量来保存100次尝试
for(i in 1:tries){
k.temp <-kmeans(data.rm.top,centers=v) #运行kmeans
v.totw.ss[i] <-k.temp$tot.withinss#存储总内部
}
avg.totw.ss[v-1] <-mean(v.totw.ss) #平均100个总内数
}
plot(rng,avg.totw.ss,type=”b”, main=”SS 内的各种 K 总数”,
ylab =“平方和内的平均总数”,
xlab="K 值")
而已。 现在,您可以使用从此代码中获得的图表来获得 K 的最佳值,并使用它来获得所需的结果。 使用此示例来尝试您对 R 中的 K-means 聚类的了解。以下是我们在示例中使用的所有代码:
数据 <-read.csv(“批发客户数据.csv”,header=T)
摘要(数据)
top.n.custs <- function (data,cols,n=5) { #需要一些数据框和前N个删除
idx.to.remove <-integer(0) #初始化一个向量来保存被移除的客户
for (c in cols){ # 对于我们传递给此函数的数据中的每一列
col.order <-order(data[,c],decreasing=T) #按降序对列“c”进行排序(顶部较大)
#Order 返回排序后的索引(例如第 15、3、7、1、...行),而不是排序后的实际值。
idx <-head(col.order, n) #取排好序的列C的前n
idx.to.remove <-union(idx.to.remove,idx) #合并和去重需要移除的row id
}
return(idx.to.remove) #返回要移除的客户的索引
}
top.custs <-top.n.custs(数据,cols=3:8,n=5)
length(top.custs) #要删除多少客户?
data[top.custs,] #检查客户
data.rm.top <-data[-c(top.custs),] #移除客户
set.seed(76964057) #为可重复性设置种子
k <-kmeans(data.rm.top[,-c(1,2)],centers=5) #创建5个簇,去掉1和2列
k$centers #显示聚类中心
table(k$cluster) #给每个簇中数据点的个数
rng<-2:20 #K 从 2 到 20
Trys<-100 #运行 K 均值算法 100 次
avg.totw.ss<-integer(length(rng)) #设置一个空向量来保存所有的点
for(v in rng){ # 对于范围变量的每个值
v.totw.ss<-integer(tries) #设置一个空向量来保存100次尝试
for(i in 1:tries){
k.temp<-kmeans(data.rm.top,centers=v) #运行kmeans
v.totw.ss[i]<-k.temp$tot.withinss#存储总内部
}
avg.totw.ss[v-1]<-mean(v.totw.ss) #平均100个内sss
}
plot(rng,avg.totw.ss,type=”b”, main=”SS 内的各种 K 总数”,
ylab =“平方和内的平均总数”,
xlab="K 值")
结论
我们希望您喜欢本指南。 我们试图保持简洁和全面。 如果您对 K-means 算法有任何疑问,请随时向我们提问。 我们很乐意回答您的疑问。
如果您想了解数据科学,请查看 IIIT-B 和 upGrad 的数据科学执行 PG 计划,该计划是为在职专业人士创建的,提供 10 多个案例研究和项目、实用的实践研讨会、行业专家的指导、1与行业导师一对一,400 多个小时的学习和顶级公司的工作协助。
使用 K-means 有哪些缺点?
离群值可以拉出质心,或者离群值可能会被赋予自己的集群而不是被忽略。 由于 K-means 是随机的,它不能确保找到全局最优的聚类解决方案。 实际上,异常值和噪声数据可能会使算法高度敏感。 在分组之前,请考虑消除或删除异常值。 在对具有可变大小和密度的数据进行分组时,K-means 有困难。 您必须泛化 K-means 来对此类数据进行聚类。 即使它们明显属于同一个簇,k-means 算法也不允许相距较远的数据点共享同一个簇。
K-means中的肘部方法是什么?
k-means 方法在很大程度上依赖于找到适当数量的集群。 肘部方法是一种广泛使用的确定最佳 K 值的方法。 肘部技术在数据集上针对图上的一系列 K 值执行 K 均值聚类,然后针对每个 K 值计算所有聚类的平均得分。失真得分,即到每个点的平方距离之和到其指定的中心,默认计算。 其他数据驱动模型,例如表征数据集的主要组件的数量,可以利用相同的技术来确定参数的数量。
我们如何在 K-means 中找到异常值?
可以使用基于距离和基于集群的技术来发现 K-Means 聚类中的异常值。 在层次聚类的情况下,使用树状图发现异常值。 该项目的目标是发现和消除异常值,以使聚类更加准确。 在基于 K-means 的异常值识别方法中,通过将数据分配到最近的聚类中心,将数据划分为 K 个组。 然后我们可以计算每个项目与其聚类中心之间的距离或相异度,并选择距离最大的异常值。 由于极值可能会很快影响平均值,因此 K-means 聚类方法对异常值很敏感。