【聚类算法】K-Means算法详解

定义

上期讲聚类算法的时候我们有提到过,聚类算法有很多种。其中一种层次聚类我已经分享过了。需要的请看我另外一篇文章。而几天,我们将聚类算法中的另外一个算法,也是用得最多的算法。它属于众机器学习算法中的必学知识。就如同线性回归、逻辑回归一样。那么BB了这么久,它到底是谁了?没错,就是K-Means算法。没错,K-Means是非常常见的聚类算法,所以它数以非监督学习的算法。这个算法最大的特点是简单,好理解,运算速度快,但是只能应用于连续型的数据。
要理解K-Means算法,你可以把它拆分成2部分。什么是K?什么是Means?(注意这里的Means是带s的哦)

所谓的***K***,其实就是一个数值整数。也就是我们需要将数据聚成多少类。比如我有一个小学的学生数据,我需要通过他们的年龄辨认学生读几年级。那么这时候K=6。
那么***Means***优势啥?中文翻译就是平均的意思。所以Mean其实就是当我们把数据聚成一个数据集的时候,我们需要计算它的中心点并以此为质心,也就是K。相当于一群士兵,我们需要找到一个将军做代表。刚刚又提到过s,之所以是Means就是我们需要得到***K***个数据集的质心。所以就是Means。
下面是K-Means的计算流程:

  1. 数据准备 - 准备需要聚类的数据
  2. 设置K - 根据业务或数据的需求,确定一个适合的K值
  3. 初始化质心 - 随机在数据值里面初始化K个质心
  4. 聚类数据 - 计算每一个点与质心的距离(一般采用欧式距离),选择最近的质心并以其归为一类
  5. 优化质心 - 得到初步的多个簇之后,重新计算每个簇之间的质心,刷新质心点
  6. 数据收敛 - 重复4、5步骤,使数据不断收敛
  7. 得出结论 - 得出最后聚类的结果

下面是来自吴恩达老师的计算过程
在这里插入图片描述
在这里插入图片描述

样例

还是那样的套图。看了上面皱巴巴的理论之后,我们举一个栗子来加深对K-Means算法的了解。
我们首先初始化一堆数据,并设置3个质心。(K=3)注意:这里为了更好的理解我把图画得更明显,但实际数据不是这样的。
在这里插入图片描述
然后其他数据就会聚到与他们相近质心点上,比如黑色数据聚到质心1,红色数据聚到质心2,蓝色数据聚到质心3。
重新计算质心,再收敛数据。最后可能会得到这样的数据
在这里插入图片描述
经过多次类似的步骤之后,最后就得到我们所需要的聚类结果。

代码演示

我稍微想了一下,假如在分享中加入简单的代码演示。这样会不会让小伙伴们更容易学习到算法。
主要适用了Sklearn的Kmeans包。

from sklearn.cluster import KMeans
import numpy as np
X = np.array([[1, 2], [1, 4], [1, 0],
              [4, 2], [5, 4], [6, 0],
              [10, 2], [10, 4], [10, 0]])
>>> X
>[[ 1  2]
 [ 1  4]
 [ 1  0]
 [ 4  2]
 [ 5  4]
 [ 6  0]
 [10  2]
 [10  4]
 [10  0]]
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
print('labels:',kmeans.labels_)
print('centers:',kmeans.cluster_centers_)
>>> kmeans.labels_
>labels: [1 1 1 1 1 0 0 0 0]
>>> kmeans.cluster_centers_
>centers: [[9.  1.5]
[2.4 2.4]]
kmeans = KMeans(n_clusters=3, random_state=0).fit(X)
print('labels:',kmeans.labels_)
print('centers:',kmeans.cluster_centers_)
>>> kmeans.labels_
>labels: [0 0 0 2 2 2 1 1 1]
>>> kmeans.cluster_centers_
>centers: [[ 1.  2.]
 [10.  2.]
 [ 5.  2.]]

代码可能相对简单。但我写这段代码的目的是为了让你更容易明白K-Means原理,以及更容易自己code一下尝试。假如我写的过于复杂,或者假如画图的类库等,也许就变得不那么简单明了。所以希望各位见谅。毕竟目的是为了让大家了解这个算法。
从这段简单的代码可以看出,如果我们把K(n_clusters)的值调整成2或者3。对于聚类的结果(labels_)是有很大的影响的。所以接下来我将讲解K的选择以及一些注意的问题。

注意问题

  1. K值如何确定?
    很遗憾,K值其实没有什么公式或者规律来确定的。它更多的来自与我们个人经验或者项目实践。所以K的调整是K-Means项目实践中很重要的一步。这就需要我们针对数据做大量数据分析以及多次运行程序代码的结果。
  2. 如何初始化质心
    在K-Means中一开始是随机初始化质心的。然后通过不断的收敛过程,最后才能区分质心。然后把数据聚在质心附近。
  3. 质心坐标如何计算?
    质心的坐标是以点的平均值来算。比如我有两个点[[1,2],[3,4]],那么质心的坐标就是[(1+3)/2,(2+4)/2],也就是[2,3]
  4. 算法会不会进入无限循环?
    不会。因为除了第一次质心选取,后面每一次的质心选取都是基于上一次的计算结果而得到的。所以数据会慢慢的收敛。最后的结果会趋于稳定。
  5. 怎么计算距离?
    距离的计算其实在机器学习中是一个很大的学问。有人用欧式距离来计算,也有人用余弦相似度来衡量。所以这里没有一个固定的距离计算
  6. 是否需要进行噪音数据清理?
    理论上K-Means会将所有的数据都聚到与他们相近的簇。但不排除真的出现一些很奇异的数据点。所以具体是否需要先进行数据清理,这需要根据具体项目和数据来决定。但经验告诉我,噪音数据本身也是一个特殊的数据群体,所以它也具备一定的研究价值。

K-Means 与 K-Means++

你可能会问:我们才看完K-Means算法,怎么又出来一个K-Means++了?其实K-Means++是K-Means算法的优化。
大家都知道,K-Means算法一开始是随机选取K个质心,然后进行数据收敛的。而K-Means++只在初始化质心的时候做优化。具体步骤如下:

  1. 选择一个点作为质心
  2. 选择距离***远***的点作为另一个质心
  3. 重复循环第二步,知道选出K个质心位置
  4. 执行K-Means的常规步骤

由于K-Means++是有目的的初始化质心。所以它对最后的结果误差有很大的改善,尽管它需要消耗的时间比K-Means更高。有网友提到过,它的速度比K-Means慢2倍,但是准确度增加了1000倍。所以在大部分情况下,还是值得大家尝试的。

总结

K-Means算法属于无监督学习 。了解K-Means的核心就是K代表什么?Means代表什么?它的流程其实就数据不断的收敛。但有的同学可能会拿KNN和K-Means做比较。这里需要注意,K-Means是聚类算法,属于无监督学习。但KNN是分类算法,数据监督学习。他们两者存在非常大的差距,所以千万不要搞混了。具体聚类和分类分别是算么,我在给聚类算法开题的时候有讲过。(【机器学习】什么是聚类)关于KNN,等我大致讲完几个重要的聚类算法之后,我会开一个课题专门讲分类算法。但事后大家在一起学习。
喜欢机器学习的,热爱算法的,想要一起学习这个行业的知识的。欢迎关注我的博客,以后更多原创内容会分享给大家。
点我阅读更多算法分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值