K-均值聚类(K-Means Clustering)。作为一种无监督学习算法,K-均值聚类可以自动将相似的数据点归为一类,而无需事先标注数据,在数据挖掘、客户细分、图像分割等领域有广泛应用。下面就让我们一起来了解K-均值算法的基本原理、优缺点以及Python实现吧。
一、K-均值聚类的基本原理
K-均值聚类的核心思想很简单:将 n 个数据点划分到 k 个聚类中,使得每个聚类内数据点到聚类中心的距离平方和最小。其中,k 需要预先设定。算法流程如下:
- 随机选择 k 个数据点作为初始聚类中心
- 重复下面步骤,直到聚类结果不再变化:
a. 对每个数据点,计算到 k 个聚类中心的距离,并将其分配到距离最近的聚类
b. 更新每个聚类的中心为该聚类内所有点的均值
二、Python实现K-均值聚类
利用sklearn库,我们可以很容易实现K-均值聚类:
from sklearn.cluster import KMeans
import numpy as np
# 随机生成样本数据
X = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]])
# 设置聚类数为2,进行聚类
kmeans = KMeans(n_clusters=2)
kmeans.fit(X)
# 聚类结果
print(kmeans.labels_)
print(kmeans.cluster_centers_)
输出:
[0 0 1 1 0 1]
[[1.16666667 1.46666667]
[7.33333333 9. ]]
可以看到,算法将6个点聚成2类,每一类的中心点坐标也被计算出来了。我们还可以用matplotlib将结果可视化:
import matplotlib.pyplot as plt
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_, cmap='rainbow')
plt.scatter(kmeans.cluster_centers_[:,0], kmeans.cluster_centers_[:,1], color='black')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
三、K-均值优缺点分析
优点:
- 原理简单,实现容易,收敛速度快
- 当聚类数k较小,样本分布均匀时,聚类效果不错
- 适合发现近似圆形的紧凑聚类
缺点:
- 需要预先确定聚类数k,实际应用中k难以估计
- 对噪声和异常点敏感,少量的异常点可能显著影响聚类结果
- 容易收敛到局部最优,聚类结果依赖于初始聚类中心的选择
- 只适合发现球形聚类,对于其他形状分布的数据聚类效果较差
四、改进方法
针对K-均值的缺点,学者们提出了多种改进算法,例如:
- K-Means++算法,优化初始聚类中心的选择,提高聚类质量
- Mini Batch K-Means,通过小批量梯度下降优化,提高聚类效率
- Bisecting K-Means算法,先对所有点做2-均值聚类,再递归地对每个聚类进行2-均值,直到达到k个聚类,克服陷入局部最优的问题
此外,为了寻找最优聚类数k,常用的方法有手肘法和轮廓系数法等。由于K-均值难以发现非凸形状聚类,人们又发展了密度聚类、谱聚类等算法。
K-均值聚类是一种简单实用的无监督学习利器。尽管存在一些局限性,但通过合理的改进和调优,依然可以很好地服务于各类聚类任务。