K-means 聚类是一种常见的无监督学习算法,主要用于将数据集分成 k个簇(clusters)。它基于迭代优化的方法,通过最小化簇内误差平方和(Within-Cluster Sum of Squares, WCSS)来找到最佳的聚类结果。
K-means算法步骤
- 选择 kkk 个初始聚类中心(质心, Centroids):通常随机选择数据点作为初始中心。
- 分配簇:计算每个数据点到各个聚类中心的欧氏距离,并将数据点分配给最近的簇。
- 更新聚类中心:计算每个簇内数据点的均值,并将均值作为新的聚类中心。
- 重复步骤 2 和 3,直到聚类中心不再发生显著变化或达到最大迭代次数。
K-means的关键点
- 距离度量:通常使用欧几里得距离来计算数据点之间的相似性。
- 初始中心选择:随机选择初始中心可能会影响最终聚类效果,可使用 K-means++ 来优化初始点选择。
- 确定簇数 kkk:常用的方法有 肘部法(Elbow Method) 和 轮廓系数(Silhouette Score)。
K-means的优缺点
优点
? 简单、易于实现
? 计算效率高,适用于大规模数据
? 结果易于解释
缺点
? 需要手动指定簇数k
? 对初始中心敏感,可能陷入局部最优
? 对异常值和噪声数据较敏感
? 适用于球形簇,不能处理复杂形状的簇
K-means应用
①图像分割②客户分类(如市场营销中的用户分群)③异常检测④推荐系统
下面是展示一个 K-means 聚类 的 Python 实现示例,使用 sklearn 进行聚类,并在 2D 空间中可视化结果。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
# 生成模拟数据
n_samples = 300
n_features = 2
n_clusters = 3
random_state = 42
X, _ = make_blobs(n_samples=n_samples, n_features=n_features, centers=n_clusters, random_state=random_state)
# K-means 聚类
kmeans = KMeans(n_clusters=n_clusters, init='k-means++', n_init=10, max_iter=300, random_state=random_state)
y_kmeans = kmeans.fit_predict(X)
# 可视化结果
plt.figure(figsize=(8, 6))
for i in range(n_clusters):
plt.scatter(X[y_kmeans == i, 0], X[y_kmeans == i, 1], label=f'Cluster {i+1}')
# 画出簇中心
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='red', marker='X', label='Centroids')
plt.title('K-means Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.show()
代码运行结果如下:
代码解析
- 生成数据:使用 make_blobs 生成 2D 的聚类数据。
- K-means 训练:KMeans(n_clusters=n_clusters, init='k-means++', ...),fit_predict(X) 进行聚类,并返回每个点的簇标签。
- 可视化聚类结果:使用 plt.scatter() 绘制不同簇的数据点。以红色 X 标记聚类中心 (kmeans.cluster_centers_)。