程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

Python K-means聚类详解_python做聚类分析

hfteth 2025-02-16 20:58:26 技术文章 12 ℃

K-means 聚类是一种常见的无监督学习算法,主要用于将数据集分成 k个簇(clusters)。它基于迭代优化的方法,通过最小化簇内误差平方和(Within-Cluster Sum of Squares, WCSS)来找到最佳的聚类结果。

K-means算法步骤

  1. 选择 kkk 个初始聚类中心(质心, Centroids):通常随机选择数据点作为初始中心。
  2. 分配簇:计算每个数据点到各个聚类中心的欧氏距离,并将数据点分配给最近的簇。
  3. 更新聚类中心:计算每个簇内数据点的均值,并将均值作为新的聚类中心。
  4. 重复步骤 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()

代码运行结果如下:


代码解析

  1. 生成数据:使用 make_blobs 生成 2D 的聚类数据。
  2. K-means 训练:KMeans(n_clusters=n_clusters, init='k-means++', ...),fit_predict(X) 进行聚类,并返回每个点的簇标签。
  3. 可视化聚类结果:使用 plt.scatter() 绘制不同簇的数据点。以红色 X 标记聚类中心 (kmeans.cluster_centers_)。

Tags:

最近发表
标签列表