K均值聚类(K-Means Clustering)是一种基于距离的无监督学习算法,通过迭代优化将数据集划分为K个簇,使得簇内数据点相似度最大化,簇间相似度最小化。其目标是最小化簇内平方误差和(Within-Cluster Sum of Squares, WCSS)。
数学目标函数:
J=i=1∑nk=1∑Krik∥xi−μk∥2
其中,rik 表示样本 xi 是否属于簇 k,μk 为簇k的质心。
import numpy as np
import matplotlib.pyplot as plt
def k_means(X, k, max_iters=100):
# 随机初始化质心
centroids = X[np.random.choice(X.shape[0], k, replace=False)]
for _ in range(max_iters):
# 分配样本到最近质心
distances = np.linalg.norm(X[:, np.newaxis] - centroids, axis=2)
labels = np.argmin(distances, axis=1)
# 更新质心
new_centroids = np.array([X[labels == i].mean(axis=0) for i in range(k)])
# 判断收敛
if np.all(np.abs(new_centroids - centroids) < 1e-4):
break
centroids = new_centroids
return labels, centroids
# 生成测试数据
X = np.vstack([np.random.normal(loc, 0.8, (100,2)) for loc in [(2,2), (-2,-2), (2,-2)]])
labels, centroids = k_means(X, k=3)
# 可视化
plt.scatter(X[:,0], X[:,1], c=labels, cmap='viridis')
plt.scatter(centroids[:,0], centroids[:,1], c='red', marker='x')
plt.title('K-Means Clustering')
plt.show()
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
# 生成数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.6)
# 模型训练
kmeans = KMeans(n_clusters=4, init='k-means++', random_state=42)
kmeans.fit(X)
labels = kmeans.labels_
centroids = kmeans.cluster_centers_
# 可视化
plt.scatter(X[:,0], X[:,1], c=labels, cmap='viridis')
plt.scatter(centroids[:,0], centroids[:,1], c='red', s=200, marker='X')
plt.show()
1.K-Means++初始化 通过概率选择初始质心,提升聚类稳定性:
kmeans = KMeans(n_clusters=3, init='k-means++', n_init=10)
2.肘部法确定K值 绘制不同K值对应的WCSS曲线,选择“肘点”:
wcss = [] for k in range(1, 11):
kmeans = KMeans(n_clusters=k)
kmeans.fit(X)
wcss.append(kmeans.inertia_)
plt.plot(range(1,11), wcss, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
3.轮廓系数评估 衡量簇内紧密度和簇间分离度:
from sklearn.metrics import silhouette_score score = silhouette_score(X, labels)
场景 | 示例 | 说明 |
---|---|---|
客户分群 | 零售业客户消费行为分析 | 按购买力划分客户群体 |
图像分割 | 医学影像分析 | 分离不同组织区域 |
异常检测 | 工业设备传感器数据监控 | 识别设备异常状态 |
推荐系统 | 用户兴趣聚类 | 为相似用户推荐内容 |
算法 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
K-Means | 计算快,适合大规模数据 | 需预设K值,对噪声敏感 | 球形簇、数值型数据 |
层次聚类 | 无需预设K值,可视化强 | 计算复杂度高(O(n²)) | 小数据集、树状结构分析 |
DBSCAN | 处理噪声和任意形状簇 | 难以确定密度参数 | 复杂分布数据 |
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。