上期讲聚类算法的时候我们有提到过,聚类算法有很多种。其中一种层次聚类我已经分享过了。需要的请看我另外一篇文章。而几天,我们将聚类算法中的另外一个算法,也是用得最多的算法。它属于众机器学习算法中的必学知识。就如同线性回归、逻辑回归一样。那么BB了这么久,它到底是谁了?没错,就是K-Means算法。没错,K-Means是非常常见的聚类算法,所以它数以非监督学习的算法。这个算法最大的特点是简单,好理解,运算速度快,但是只能应用于连续型的数据。
要理解K-Means算法,你可以把它拆分成2部分。什么是K?什么是Means?(注意这里的Means是带s的哦)
所谓的***K***,其实就是一个数值整数。也就是我们需要将数据聚成多少类。比如我有一个小学的学生数据,我需要通过他们的年龄辨认学生读几年级。那么这时候K=6。
那么***Means***优势啥?中文翻译就是平均的意思。所以Mean其实就是当我们把数据聚成一个数据集的时候,我们需要计算它的中心点并以此为质心,也就是K。相当于一群士兵,我们需要找到一个将军做代表。刚刚又提到过s,之所以是Means就是我们需要得到***K***个数据集的质心。所以就是Means。
下面是K-Means的计算流程:
还是那样的套图。看了上面皱巴巴的理论之后,我们举一个栗子来加深对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的选择以及一些注意的问题。
你可能会问:我们才看完K-Means算法,怎么又出来一个K-Means++了?其实K-Means++是K-Means算法的优化。
大家都知道,K-Means算法一开始是随机选取K个质心,然后进行数据收敛的。而K-Means++只在初始化质心的时候做优化。具体步骤如下:
由于K-Means++是有目的的初始化质心。所以它对最后的结果误差有很大的改善,尽管它需要消耗的时间比K-Means更高。有网友提到过,它的速度比K-Means慢2倍,但是准确度增加了1000倍。所以在大部分情况下,还是值得大家尝试的。
K-Means算法属于无监督学习 。了解K-Means的核心就是K代表什么?Means代表什么?它的流程其实就数据不断的收敛。但有的同学可能会拿KNN和K-Means做比较。这里需要注意,K-Means是聚类算法,属于无监督学习。但KNN是分类算法,数据监督学习。他们两者存在非常大的差距,所以千万不要搞混了。具体聚类和分类分别是算么,我在给聚类算法开题的时候有讲过。(【机器学习】什么是聚类)关于KNN,等我大致讲完几个重要的聚类算法之后,我会开一个课题专门讲分类算法。但事后大家在一起学习。
喜欢机器学习的,热爱算法的,想要一起学习这个行业的知识的。欢迎关注我的博客,以后更多原创内容会分享给大家。
点我阅读更多算法分享