kmeans聚类理论篇

原文地址为: kmeans聚类理论篇

前言

kmeans是最简单的聚类算法之一,但是运用十分广泛。最近在工作中也经常遇到这个算法。kmeans一般在数据分析前期使用,选取适当的k,将数据分类后,然后分类研究不同聚类下数据的特点。

本文记录学习kmeans算法相关的内容,包括算法原理,收敛性,效果评估聚,最后带上R语言的例子,作为备忘。

 

算法原理

kmeans的计算方法如下:

1 随机选取k个中心点

2 遍历所有数据,将每个数据划分到最近的中心点中

3 计算每个聚类的平均值,并作为新的中心点

4 重复2-3,直到这k个中线点不再变化(收敛了),或执行了足够多的迭代

时间复杂度:O(I*n*k*m)

空间复杂度:O(n*m)

其中m为每个元素字段个数,n为数据量,I为跌打个数。一般I,k,m均可认为是常量,所以时间和空间复杂度可以简化为O(n),即线性的。

 

算法收敛

从kmeans的算法可以发现,SSE其实是一个严格的坐标下降(Coordinate Decendet)过程。设目标函数SSE如下:

SSE(clip_image002,clip_image004,…,clip_image006) = clip_image008

采用欧式距离作为变量之间的聚类函数。每次朝一个变量clip_image010的方向找到最优解,也就是求偏倒数,然后等于0,可得

c_i=clip_image012 其中m是c_i所在的簇的元素的个数

也就是当前聚类的均值就是当前方向的最优解(最小值),这与kmeans的每一次迭代过程一样。所以,这样保证SSE每一次迭代时,都会减小,最终使SSE收敛。

由于SSE是一个非凸函数(non-convex function),所以SSE不能保证找到全局最优解,只能确保局部最优解。但是可以重复执行几次kmeans,选取SSE最小的一次作为最终的聚类结果。

 

0-1规格化

由于数据之间量纲的不相同,不方便比较。举个例子,比如游戏用户的在线时长和活跃天数,前者单位是秒,数值一般都是几千,而后者单位是天,数值一般在个位或十位,如果用这两个变量来表征用户的活跃情况,显然活跃天数的作用基本上可以忽略。所以,需要将数据统一放到0~1的范围,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。具体计算方法如下:

clip_image014

其中clip_image016属于A。

轮廓系数

轮廓系数(Silhouette Coefficient)结合了聚类的凝聚度(Cohesion)和分离度(Separation),用于评估聚类的效果。该值处于-1~1之间,值越大,表示聚类效果越好。具体计算方法如下:

  1. 对于第i个元素x_i,计算x_i与其同一个簇内的所有其他元素距离的平均值,记作a_i,用于量化簇内的凝聚度。
  2. 选取x_i外的一个簇b,计算x_i与b中所有点的平均距离,遍历所有其他簇,找到最近的这个平均距离,记作b_i,用于量化簇之间分离度。
  3. 对于元素x_i,轮廓系数s_i = (b_i – a_i)/max(a_i,b_i)
  4. 计算所有x的轮廓系数,求出平均值即为当前聚类的整体轮廓系数

从上面的公式,不难发现若s_i小于0,说明x_i与其簇内元素的平均距离小于最近的其他簇,表示聚类效果不好。如果a_i趋于0,或者b_i足够大,那么s_i趋近与1,说明聚类效果比较好。

 

K值选取

在实际应用中,由于Kmean一般作为数据预处理,或者用于辅助分类贴标签。所以k一般不会设置很大。可以通过枚举,令k从2到一个固定值如10,在每个k值上重复运行数次kmeans(避免局部最优解),并计算当前k的平均轮廓系数,最后选取轮廓系数最大的值对应的k作为最终的集群数目。

 

实际应用

下面通过例子(R实现,完整代码见附件)讲解kmeans使用方法,会将上面提到的内容全部串起来

library(fpc) # install.packages("fpc")
data(iris)
head(iris)

加载实验数据iris,这个数据在机器学习领域使用比较频繁,主要是通过画的几个部分的大小,对花的品种分类,实验中需要使用fpc库估计轮廓系数,如果没有可以通过install.packages安装。

# 0-1 正规化数据
min.max.norm <- function(x){
(x-min(x))/(max(x)-min(x))
}
raw.data <- iris[,1:4]
norm.data <- data.frame(sl = min.max.norm(raw.data[,1]),
sw = min.max.norm(raw.data[,2]),
pl = min.max.norm(raw.data[,3]),
pw = min.max.norm(raw.data[,4]))

对iris的4个feature做数据正规化,每个feature均是花的某个不为的尺寸。

# k取2到8,评估K
K <- 2:8
round <- 30 # 每次迭代30次,避免局部最优
rst <- sapply(K, function(i){
print(paste("K=",i))
mean(sapply(1:round,function(r){
print(paste("Round",r))
result <- kmeans(norm.data, i)
stats <- cluster.stats(dist(norm.data), result$cluster)
stats$avg.silwidth
}))
})
plot(K,rst,type='l',main='轮廓系数与K的关系', ylab='轮廓系数')

评估k,由于一般K不会太大,太大了也不易于理解,所以遍历K为2到8。由于kmeans具有一定随机性,并不是每次都收敛到全局最小,所以针对每一个k值,重复执行30次,取并计算轮廓系数,最终取平均作为最终评价标准,可以看到如下的示意图,

 

image

 

当k取2时,有最大的轮廓系数,虽然实际上有3个种类。

# 降纬度观察
old.par <- par(mfrow = c(1,2))
k = 2 # 根据上面的评估 k=2最优
clu <- kmeans(norm.data,k)
mds = cmdscale(dist(norm.data,method="euclidean"))
plot(mds, col=clu$cluster, main='kmeans聚类 k=2', pch = 19)
plot(mds, col=iris$Species, main='原始聚类', pch = 19)
par(old.par)

聚类完成后,有源原始数据是4纬,无法可视化,所以通过多维定标(Multidimensional scaling)将纬度将至2为,查看聚类效果,如下

 

image

可以发现原始分类中和聚类中左边那一簇的效果还是拟合的很好的,右测原始数据就连在一起,kmeans无法很好的区分,需要寻求其他方法。

 

kmeans最佳实践

1. 随机选取训练数据中的k个点作为起始点

2. 当k值选定后,随机计算n次,取得到最小开销函数值的k作为最终聚类结果,避免随机引起的局部最优解

3. 手肘法选取k值:绘制出k--开销函数闪点图,看到有明显拐点(如下)的地方,设为k值,可以结合轮廓系数。

4. k值有时候需要根据应用场景选取,而不能完全的依据评估参数选取。

clip_image002

 

 

参考

[1] kmeans 讲义by Andrew NG

[2] 坐标下降法(Coordinate Decendent)

[3] 数据规格化

[4] 维基百科--轮廓系数

[5] kmeans算法介绍

[6] 降为方法—多维定标

[7] Week 8 in Machine Learning, by Andrew NG, Coursera


转载请注明本文地址: kmeans聚类理论篇
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 模糊聚类kmeans聚类是两种常见的聚类算法,它们都可以用于将数据集划分成不同的群组,但是它们的实现方式和结果略有不同。 模糊聚类是一种基于模糊集合理论聚类算法,它将每个数据点分配到所有的群组中,而不是像kmeans那样只分配到一个最近的群组。每个数据点与每个群组之间都有一个隶属度(membership degree)的值,表示这个数据点属于该群组的程度。模糊聚类的结果是一组模糊的群组,每个群组都由所有数据点的隶属度值组成。 与之相比,kmeans聚类是一种硬聚类算法,它将每个数据点分配到一个最近的群组中,每个群组都由其群心(centroid)表示。kmeans聚类的结果是一组硬的群组,每个群组都由其群心和所包含的数据点组成。 总的来说,模糊聚类kmeans聚类都有其优缺点,具体选择哪种算法取决于具体应用场景和数据特点。如果数据比较复杂或存在噪声,模糊聚类可能会更适合。如果数据比较简单、分布比较清晰,或者需要确定的群组数比较少,kmeans聚类可能更好。 ### 回答2: 模糊聚类和k-means聚类是两种常见的聚类算法,在目标和结果上有一些不同之处。K-means聚类是一种硬聚类方法,每个数据点被分配到一个确定的簇,而模糊聚类是一种软聚类方法,每个数据点可以被分配到多个簇,具有不同的隶属度。 在K-means聚类算法中,首先需要确定聚类数量k,然后随机选择k个中心点。然后计算每个数据点与中心点之间的距离,并将其分配给最近的中心点。然后根据分配结果更新中心点,并迭代进行,直到达到收敛条件。 相比之下,模糊聚类算法中的隶属度度量了每个数据点与每个簇之间的关系强度。数据点可以属于一个或多个簇,并具有在0到1之间的隶属度值。模糊聚类的目标是最小化数据点与所属簇中心的欧几里得距离和隶属度之间的距离。 模糊聚类和k-means聚类之间的另一个区别是对异常值的鲁棒性。模糊聚类对异常值具有一定的鲁棒性,因为数据点可以具有低隶属度值。然而,k-means对异常值非常敏感,可能会将其分配给错误的簇。 最后,模糊聚类的计算复杂度较高,因为需要计算数据点与每个簇中心的距离。而k-means聚类的计算复杂度较低,因为只需要计算数据点与所属簇中心的距离。 综上所述,模糊聚类和k-means聚类在目标、结果、鲁棒性和计算复杂度等方面存在一些不同。研究者和应用者可以根据具体任务和数据特点选择合适的聚类算法。 ### 回答3: 模糊聚类和k-means聚类是两种常用的聚类算法。它们在聚类过程和结果上存在一些不同之处。 首先,模糊聚类是一种软聚类方法,它允许样本在不同类别中具有不同的隶属度。每个样本对于不同类别的隶属度可以是一个概率值,表示其属于不同类别的程度。而k-means聚类是一种硬聚类方法,它将每个样本分配到一个确定的聚类中心,不允许具有多个类别隶属度。 其次,模糊聚类可以处理具有模糊性的数据,例如,当样本在不同特征上具有不同程度的相似性或差异性时。这使得模糊聚类更适合于具有重叠类别或不确定性的数据。而k-means聚类则假定样本在特征空间中是明确可分的,对于不具有清晰分界的样本,k-means聚类可能不太适用。 另外,模糊聚类聚类过程中考虑了局部和全局最小化损失函数,以确定最佳聚类中心。而k-means聚类则通过迭代计算每个样本与聚类中心之间的距离,并将样本分配到距离最近的聚类中心。 最后,模糊聚类的结果是每个样本属于每个类别的隶属度,可以呈现在一个隶属度矩阵中。而k-means聚类的结果是硬分类结果,即每个样本被分配到一个确定的类别。 综上所述,模糊聚类和k-means聚类聚类过程和结果上存在明显的差异。模糊聚类对于模糊性数据和重叠类别更有效,而k-means聚类则适用于清晰分界的数据。选择合适的聚类算法需要根据数据特点和需求来决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值