最后一次回顾KMeans聚类算法。
KMeans聚类算法的原理
- 一个数据集如下,我们希望将它分为两个簇(因为通过人的观察,它看起来像是可以分成两个簇,KMeans聚类算法的K是需要操作人员自己选择的,这也是这个算法的弊端之一,可以通过肘部法则(手肘法)来改善)👇。
- KMeans聚类算法的第一步,是初始化聚类中心。通常我们使用随机初始化的方法,即,在已经给定的样本点中选取聚类中心。但此处为了说明问题,使用了另一种方法初始化聚类中心,但是无论使用哪种初始化的方法,最终都是有可能得到最佳结果的。
👆生成两个聚类中心,因为我们希望将数据集分为两个簇。 - 显然,KMeans聚类算法是一个需要迭代的方法,它通过不断的迭代,改变聚类中心的位置和样本点与聚类中心的关系划分,当迭代不使结果产生改变时 ,说明分类的工作已经完成,可以退出循环返回结果了。每一步的迭代,KMeans聚类算法要做两件事,第一件事是为样本点寻找合适的聚类中心,即,某个样本点与哪一个聚类中心的欧氏距离最近,那么就将这个样本点划分给哪个聚类中心。
- KMeans聚类算法要做的另一件事情,是改变聚类中心,由上图可知,由于该例中只需要将数据集分为两个簇,因此使用红色和蓝色代表两个簇的聚类中心和簇中样本点。改变聚类中心,说的是将某个簇的聚类中心重新放到属于这个簇的样本点的平均中心位置。
👆聚类中心改变前,聚类中心改变后👇
划分完聚类中心之后,便进入到了下一次迭代,此时要先重新为所有样本点选择新的聚类中心,因为上一次迭代的最后一步,聚类中心的位置改变了。之后再改变聚类中心的位置,依次迭代,直到聚类中心的位置和样本点的划分都不再发生改变,结束迭代,分类完成。
KMeans聚类算法的缺点
- 聚类的个数在开始就要设定。
- 聚类的结果取决于初始设定的聚类中心。
- 对异常值很敏感。
- 不适合用于发现非凸聚类问题。
- 不能保证得到全局最优解,它往往会陷入一个局部最优解。 此时重复运行算法是有可能得到全局最优解的。
KMeans聚类算法的Python实现
import numpy as np
import matplotlib.pyplot as plt
import random
from sklearn.datasets import make_blobs
np.random.seed(123)
# 从自带的机器学习库中获取数据,转移到变量中
X,y = make_blobs(centers=4,n_samples=1000) #四个聚类中心,1000个样本点
print(f'Shape of dataset:{X.shape}')# 打印数据集的大小
fig &