k均值和kmeans的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k均值和kmeans的区别相关的知识,希望对你有一定的参考价值。

k均值和kmeans的区别,聚类是一种机器学习技术,它涉及到数据点的分组。给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组。理论上,同一组中的数据点应该具有相似的属性和/或特征,而不同组中的数据点应该具有高度不同的属性和/或特征。 聚类是一种无监督学习的方法 ,是许多领域中常用的统计数据分析技术。

常用的算法包括 K-MEANS、高斯混合模型(Gaussian Mixed Model,GMM)、自组织映射神经网络(Self-Organizing Map,SOM)

2. k-means(k均值)算法

2.1 算法过程

K-均值是普及的聚类算法,算法接受一个未标记的数据集,然后将数据聚类成不同的组。

K-均值是一个迭代算法,假设我们想要将数据聚类成 n 个组,其方法为:

首先选择?个随机的点,称为聚类中心(cluster centroids);

对于数据集中的每一个数据,按照距离?个中心点的距离,将其与距离近的中心点关联起来,与同一个中心点关联的所有点聚成一类。

计算每一个组的平均值,将该组所关联的中心点移动到平均值的位置。

重复步骤,直至中心点不再变化。





来表示聚类中心,用?(1),?(2),…,?(?)来存储与第?个实例数据近的聚类中心的索引,K-均值算法的伪代码如下:

Repeat

for i = 1 to m

c(i) := index (form 1 to K) of cluster centroid closest to x(i)

for k = 1 to K

μk := average (mean) of points assigned to cluster k



算法分为两个步骤,个 for 循环是赋值步骤,即:对于每一个样例?,计算其应该属于的类。第二个 for 循环是聚类中心的移动,即:对于每一个类?,重新计算该类的质心。

K-均值算法也可以很便利地用于将数据分为许多不同组,即使在没有非常明显区分的组群的情况下也可以。下图所示的数据集包含身高和体重两项特征构成的,利用 K-均值算法将数据分为三类,用于帮助确定将要生产的 T-恤衫的三种尺寸。



2.2 损失函数

K-均值小化问题,是要小化所有的数据点与其所关联的聚类中心点之间的距离之和,因此 K-均值的代价函数(又称畸变函数 Distortion function)为:



其中



)代表与



)近的聚类中心点。 我们的的优化目标便是找出使得代价函数小的



,c^(2),…,c^(m))和





2.3 k值的选择

在运行 K-均值算法的之前,我们首先要随机初始化所有的聚类中心点,下面介绍怎样做:

我们应该选择? < ?,即聚类中心点的个数要小于所有训练集实例的数量。

随机选择?个训练实例,然后令?个聚类中心分别与这?个训练实例相等K-均值的一个问题在于,它有可能会停留在一个局部小值处,而这取决于初始化的情况。

为了解决这个问题,我们通常需要多次运行 K-均值算法,每一次都重新进行随机初始化,后再比较多次运行 K-均值的结果,选择代价函数小的结果。这种方法在?较小的时候(2—10)还是可行的, 但是如果?较大,这么做也可能不会有明显地改善。

没有所谓好的选择聚类数的方法,通常是需要根据不同的问题,人工进行选择的。选择的时候思考我们运用 K-均值算法聚类的动机是什么。有一个可能会谈及的方法叫作 “肘部法则” 。关 于“肘部法则”,我们所需要做的是改变?值,也就是聚类类别数目的总数。我们用一个聚类来运行 K 均值聚类方法。这就意味着,所有的数据都会分到一个聚类里,然后计算成本函数或者计算畸变函数?。?代表聚类数字。



我们可能会得到一条类似于这样的曲线。像一个人的肘部。这就是“肘部法则”所做的,让我们来看这样一个图,看起来就好像有一个很清楚的肘在那儿。你会发现这种模式,它的畸变值会迅速下降,从 1 到 2,从 2 到 3 之后,你会在 3 的时候达到一个肘点。在此之后,畸变值就下降的非常慢,看起来就像使用 3 个聚类来进行聚类是正确的, 这是因为那个点是曲线的肘点,畸变值下降得很快,? = 3之后就下降得很慢,那么我们就选? = 3。 当你应用“肘部法则”的时候,如果你得到了一个像上面这样的图,那么这将是一种用来选择聚类个数的合理方法。

2.4 KNN与K-means区别?

K近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是简单的机器学习算法之一。

KNNK-Means
参考技术A Kmeans是无监督学习算法,意味着数据集没有label,它根据无label的数据点和事先设定的超参数K值,它利用无标记的数据点去学习和计算每个点与均值的距离以实现聚类划分。 参考技术B K-means算法是聚类分析中使用最广泛的算法之一。它把n个对象根据他们的属性分为k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小

R中的k均值返回值

【中文标题】R中的k均值返回值【英文标题】:k-means return value in R 【发布时间】:2012-01-28 01:50:54 【问题描述】:

我在 R 中使用 kmeans() 函数,我很好奇返回对象的 totsstot.withinss 属性之间有什么区别。从文档来看,它们似乎返回了相同的东西,但在我的数据集上应用 totss 的值为 66213.63,tot.withinss 的值为 6893.50。 如果您熟悉 mroe 详细信息,请告诉我。 谢谢!

马吕斯。

【问题讨论】:

【参考方案1】:

给定平方和 betweenss 之间的平方和以及每个簇 withinss 平方和之内的向量,公式如下:

totss = tot.withinss + betweenss
tot.withinss = sum(withinss)

例如,如果只有一个集群,那么betweenss 将是0,那么withinsstotss = tot.withinss = withinss 中将只有一个组件。

为了进一步澄清,我们可以在给定集群分配的情况下自己计算这些不同的数量,这可能有助于澄清它们的含义。考虑help(kmeans) 示例中的数据x 和集群分配cl$cluster。定义平方和函数如下 - 这从该列中减去 x 的每一列的平均值,然后是剩余矩阵的每个元素的平方和:

# or ss <- function(x) sum(apply(x, 2, function(x) x - mean(x))^2)
ss <- function(x) sum(scale(x, scale = FALSE)^2)

然后我们有以下内容。请注意,cl$centers[cl$cluster, ] 是拟合值,即它是一个矩阵,每个点有一行,因此第 i 行是第 i 个点所属的簇的中心。

example(kmeans) # create x and cl

betweenss <- ss(cl$centers[cl$cluster,]) # or ss(fitted(cl))

withinss <- sapply(split(as.data.frame(x), cl$cluster), ss)
tot.withinss <- sum(withinss) # or  resid <- x - fitted(cl); ss(resid)

totss <- ss(x) # or tot.withinss + betweenss

cat("totss:", totss, "tot.withinss:", tot.withinss, 
  "betweenss:", betweenss, "\n")

# compare above to:

str(cl)

编辑:

自从回答了这个问题以来,R 已经添加了额外的类似 kmeans 示例 (example(kmeans)) 和一个新的 fitted.kmeans 方法,我们现在在代码行后面的 cmets 中展示拟合方法如何适应上述内容。

【讨论】:

嗯。所以 tot.withinss 应该是集群内的总变化,而 totss 应该是整体数据变化。集群内的总变异 + 集群中心的 ss。对吗? 我已经添加了一些进一步的说明。 因此,如果想找出簇内变异的总数,那么 tot.whitinss 就是其中之一。谢谢。 也就是说 between_SS / total_SS (%) 越高,聚类效果越好??不是吗?? @ToNoY,对。试试kmeans(rep(1:2, 4), 2) 看看完美契合。【参考方案2】:

我认为您在文档中发现了一个错误......它说:

withinss     The within-cluster sum of squares for each cluster.
totss        The total within-cluster sum of squares.
tot.withinss     Total within-cluster sum of squares, i.e., sum(withinss).

如果您使用帮助页面示例中的示例数据集:

> kmeans(x,2)$tot.withinss
[1] 15.49669
> kmeans(x,2)$totss
[1] 65.92628
> kmeans(x,2)$withinss
[1] 7.450607 8.046079

我认为应该有人向 r-devel 邮件列表写一个请求,要求修改帮助页面。如果你不愿意,我愿意这样做。

【讨论】:

感谢您的快速反应。我也是这么想的..文档中有错误..不幸的是,我看到的不是唯一一个。如果您想向他们提出请求,您可以写信。要点是我也在使用遗传 k-means 算法,我想比较结果。现在我不知道应该考虑哪个.. 用哪一个做什么? (代词和形容词太多,在你的混淆陈述或我的反问中都没有足够的名词。) :/ 如果不涉及编程语言语法,你会选择语法吗?我想将遗传 k-means 算法的结果与 R 中的 kmeans 函数的结果进行比较。主要的一点是尽量减少集群内的变化。 R 中返回的 kmeans 对象有 2 个在文档中定义相同的属性。只有一个结果要比较。 语义,而不是语法。我(甚至还)无法弄清楚你想要做什么样的比较。我怎么知道“遗传 k 均值”函数(无论它可能被实现)返回了什么? 呵呵呵呵.. 我确定你会说语义 :] 那么这个想法是 kmeans 算法是一个优化问题。遗传算法在这个领域有相当大的适用性,适应度函数(在这种情况下)是基于平方和的集群内总变异的最小化。因此,遗传算法也返回集群内变化的总数,但 R 函数返回的 kmeans 对象有两个属性,它们应该提供相同的特性。我不知道这两者中哪一个是可以与我的结果进行比较的正确的。

以上是关于k均值和kmeans的区别的主要内容,如果未能解决你的问题,请参考以下文章

matlab 聚类分析kmeans和cluster的区别

“k 均值”和“模糊 c 均值”目标函数有啥区别?

聚类算法---Kmeans算法K均值算法

第十篇:K均值聚类(KMeans)

「聚类分析」16聚类分析之KMeans算法与K中心点算法

机器学习之路:python k均值聚类 KMeans 手写数字