老饼讲解:一步一步上手学习
k-means聚类(K均值聚类)是最实用的聚类算法之一,它的计算量低,且效果又不错,所以成为了聚类算法中的扛把子,是每个机器学习人士必学的一种聚类算法,那今天就让我们一起来看看k-means聚类的算法流程、聚类效果,并讲解它的距离公式、优缺点,以及展示kmeans聚类的具体代码实现和使用例子~
我们先来快速了解一下k-means聚类到底是怎么一回事,再来具体详细的说它的算法流程。
k-means聚类又称为K均值聚类,算法非常简单,它先初始化k个类别中心,然后找出各个类别的样本,再把类别中心更新到质心(也就是样本的均值),如此循环迭代即可:

如图所示,先初始化k个类别(红色),然后找一下属于各个类别的样本,再更新类别中心,如此反复,就是kmeans聚类算法了。
好了,下面我们再看下k-means的完整算法流程。
先来上个算法流程图,结合下面的文字描述来理解就可以了,如下:

kmeans聚类的算法流程如下:
1. 初始化K个聚类中心
2. 将每个样本划分到离它最近的聚类中心
这里需要先计算各个样本与聚类中心的距离,再进行划分
3. 将每个聚类中心更新为样本质心
将所有属于第i个聚类中心的样本的均值,作为第k个聚类中心的位置
4. 重复2、3,直到达到终止条件
终止条件为:达到最大迭代次数或聚类中心变化很小
在k-means算法中,在划分样本时,需要计算各个样本与聚类中心的距离,可以使用的距离计算方法有:欧氏距离,余弦距离, 曼哈顿距离,切比雪夫距离 、闵可夫斯基距离、马氏距离等等。其中欧氏距离,余弦距离, 曼哈顿距离是较常用的,我们来看下这三个距离的计算公式。
欧氏距离的计算公式如下:
余弦距离的计算公式如下:
曼哈顿距离计算公式如下:
虽然距离的计算方法有很多,但日常中基本都用欧氏距离,一般欧氏距离效果不好再考虑其它距离。
k-means对k值和初始化都是比较敏感的,需多次尝试,然后选择最好的效果。
效果的评估可以使用SSE(误差平方和),SSE的计算公式如下:
: 所属的聚类中心
从公式可以知道,SSE也就是所有样本到其所属聚类中心的距离平方之和。
在sklearn中,只需要使用cluster.KMeans()方法就能实现一个kmeans聚类,下面我们就用它来实现一个k-means聚类吧!具体代码如下:
'''
本代码展示如何用sklearn实现kmeans聚类
本代码来自《老饼讲解-机器学习》 www.bbblearn.com
'''
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn import cluster
# -----------生成数据-----------------
X, y = make_blobs(n_samples=150, random_state=10,centers=5) #生成数据
# ---------模型训练与预测-------------
clf = cluster.KMeans(n_clusters=5, max_iter=300,random_state=0) # 初始化k-means聚类模型
clf.fit(X) # 进行聚类
y = clf.predict(X) # 输出每个样本的类别
# --------------打印结果---------------
print('\n聚类中心:\n',clf.cluster_centers_) # 打印聚类中心
#展示结果,以颜色标示类别
fig, axes = plt.subplots(2, 1,figsize=(8, 6)) # 初始化画布
plt.subplots_adjust(wspace=0.2, hspace=0.3) # 调整子图之间的间隔
plt.rcParams["font.sans-serif"] = ["SimHei"] # 设置中文
plt.rcParams['axes.unicode_minus'] = False # 设置坐标轴负号显示方式
axes[0].set_title('原始样本') # 设置第一个子图的标题
axes[0].scatter(X[:, 0], X[:, 1]) # 画出聚类前的样本分布
axes[1].set_title('k-means 聚类结果') # 设置第一个子图的标题
axes[1].scatter(X[:, 0], X[:, 1], c=y) # 画出聚类后的各个样本的类别
plt.show() # 展示画布运行结果如下:


可以看到,K-means聚类能很好地把每一簇样本聚为一类。
好了,最后我们来说下kmeans算法的优缺点。
K-means的优点是计算量低,相比其它聚类算法,不会因为样本量而暴增,k-means每次只需计算样本与类别的距离,而不是样本与样本间的距离,而类别个数是很小的,所以k-means相对于其它聚类算法计算量不大。
1. K值需要先验经验去决定
k值需要用先验经验决定,而往往这恰好是缺失的,如果k值设置得不好,会严重影响聚类结果。
2. 对异常点较敏感
k-means对异常点较为敏感,异常点极大时会严重影响聚类中心的位置。
3.对球状的数据比较好用
kmeans对球状的数据比较好用,但在数据为非球状数据时,效果可能会不佳。
k-means最最最大的优点就是计算较为简单,聚类的方法千千万种,但K-means经典不衰就是因为它的计算量在众多聚类算法中是最简单的。
kmeans就是初始化k个聚类中心,然后不断地把聚类中心更新到类别的质心,直到稳定。kmeans的优点是计算量较小,计算量不会因为样本量的增加而暴增,同时它在实践中取得较好的效果,所以大家都比较喜欢用,但它的缺点是对球状数据比较好用、且对异常点敏感等等,另外,在使用kmeans时,要多尝试不同的k值与多随机初始化几次,这样可以得到更好的效果。
评论