大家好,我是爱酱。继上一篇层次聚类(Hierarchical Clustering)之后,本期我们聚焦于K均值聚类(K-Means Clustering)。K均值是最经典、应用最广的无监督聚类算法之一,广泛用于客户分群、图像处理、传感器数据分析等领域。本文将系统介绍K均值聚类的原理、算法流程、数学表达、实际应用、优缺点,并配以公式,便于你直接用于技术文档和学习。
注:本文章含大量数学算式、详细例子说明及代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!
一、K均值聚类是什么?
K均值聚类是一种**基于质心(centroid-based)**的无监督算法,目标是将数据划分为K个不同的簇,使得同一簇内的数据点尽量相似,不同簇之间的数据点尽量不同。
-
簇中心(质心):每个簇有一个中心点(质心),代表该簇的“平均”位置。
-
K值:需要用户预先指定簇的数量K。例如K=3,K=4 等等。
二、K均值聚类的数学目标
K均值的优化目标是最小化所有数据点到其所属簇质心的距离平方和(即簇内误差平方和,Within-Cluster Sum of Squares, WCSS)。
其中 表示第
个簇,
为第
个簇的质心,
为分配到该簇的样本点。
三、K均值聚类的算法流程
K均值算法的核心流程如下:
1. 选择簇数K
-
由用户指定K值(如K=3),也可通过肘部法则等方法辅助选择。
2. 初始化K个质心
-
随机选择K个数据点作为初始质心,或用其他初始化方法(如K-Means++)。
3. 分配样本到最近质心
-
计算每个数据点到所有质心的距离(常用欧氏距离):
-
将每个点分配到最近的质心所属的簇。
4. 更新质心
-
对每个簇,计算所有成员点的均值,作为新的质心:
5. 重复分配与更新
-
重复步骤3和4,直到质心不再变化或达到最大迭代次数,算法收敛。
四、K均值聚类案例流程
我们用一个简单二维数据例子,手动走一遍K均值流程,帮助新手直观理解。
数据集
假设有如下6个二维点:
点 | ||
---|---|---|
A | 1 | 2 |
B | 1 | 4 |
C | 1 | 0 |
D | 10 | 2 |
E | 10 | 4 |
F | 10 | 0 |
我们设定 ,希望分成两簇。
Step 1:初始化质心
随机选择A和D作为初始质心:
Step 2:分配样本到最近质心
计算每个点到两个质心的欧氏距离:
-
点A到
距离为0,到
距离为
-
点B到
为2,到
为
-
点C到
为2,到
为
-
点D到
为9,到
为0
-
点E到
为
,到
为2
-
点F到
为
,到
为2
分配结果:
-
簇1(
):A, B, C
-
簇2(
):D, E, F
Step 3:更新质心
计算每个簇的新质心:
-
簇1:A(1,2), B(1,4), C(1,0)
-
簇2:D(10,2), E(10,4), F(10,0)
发现质心没有变化,算法收敛。
Step 4:可视化
此时聚类结果如下:
-
簇1:A、B、C(左下角一组)
-
簇2:D、E、F(右下角一组)
五、Python代码实现
注:记得要先 pip install scikit-learn Library喔~
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# Example data
X = np.array([[1,2],[1,4],[1,0],[10,2],[10,4],[10,0]])
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
labels = kmeans.labels_
centers = kmeans.cluster_centers_
plt.figure(figsize=(8, 6))
plt.scatter(X[:,0], X[:,1], c=labels, cmap='viridis', s=100)
plt.scatter(centers[:,0], centers[:,1], c='red', marker='x', s=200)
# Draw circles around clusters
for i in range(2):
cluster_points = X[labels == i]
center = centers[i]
# Calculate max distance from center to points in cluster
radius = np.max(np.linalg.norm(cluster_points - center, axis=1))
circle = plt.Circle(center, radius, color='red', fill=False, linestyle='--', linewidth=2)
plt.gca().add_patch(circle)
plt.title('K-Means Clustering Result with Cluster Circles')
plt.xlabel('X')
plt.ylabel('Y')
plt.grid(True)
plt.show()
六、K均值聚类的优缺点
优点
-
高效、易实现,适合大数据集,时间复杂度低。
-
对球状、均匀分布的数据表现好。
-
结果直观,便于解释和可视化。
缺点
-
需预先指定K值,K选错影响聚类效果。
-
对初始质心敏感,可能陷入局部最优。
-
不适合非球状、密度不均或含异常值的数据。
-
对高维数据和不同尺度特征敏感。
七、K的选择与评估
1. 肘部法则(Elbow Method)
-
计算不同K值下的簇内误差平方和(WCSS),绘制K与WCSS曲线,拐点处为最佳K。
2. 轮廓系数(Silhouette Coefficient)
-
衡量聚类紧密度与分离度,值越高聚类效果越好。
八、总结
K均值聚类是无监督学习中应用最广、效率最高的聚类算法之一。它通过迭代优化使簇内样本尽量相似、簇间样本尽量不同,适合大多数球状分布的数据。实际应用中,需注意K值选择、初始化方法和异常值处理,结合肘部法则、轮廓系数等方法评估聚类效果。希望本篇内容能帮助你深入理解K均值聚类的原理与实操。
谢谢你看到这里,你们的每个赞、收藏跟转发都是我继续分享的动力。
如需进一步案例、代码实现或与其他聚类算法对比,欢迎留言交流!我是爱酱,我们下次再见,谢谢收看!