K-means 聚类算法简介

K-means是一种广泛使用的聚类算法,旨在将数据集分成K个不同的簇(群组)。该算法的核心思想是通过迭代的方式找到数据点的最优分组,使得同一组中的数据点尽可能相似,而不同组之间的数据点尽可能不同。在这篇文章中,我们将深入讲解K-means算法的基本原理、伪代码实现以及Python代码示例,并通过可视化的方式展示聚类结果。

K-means算法原理

K-means算法的工作流程大致如下:

  1. 初始化: 随机选择K个初始聚类中心(centroids)。
  2. 聚类分配: 将每个数据点分配到离其最近的聚类中心。
  3. 更新中心: 重新计算每个聚类的中心点。
  4. 重复迭代: 重复步骤2和步骤3,直到聚类中心不再发生变化(或者变化在允许的范围内)。

以下是K-means算法的伪代码:

输入:数据集D,聚类数K
输出:K个聚类和对应的中心

1. 随机选择K个初始中心点C
2. while 中心点C变化:
    a. 将每个数据点分配到最近的中心C
    b. 重新计算聚类中心C
3. 结束

Python实现

为了使算法更加真实,我们通过Python实现K-means算法,并使用Matplotlib库绘制聚类的饼状图和状态图。

K-means的Python实现

以下是完整的K-means算法的Python代码示例:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs

# 初始化K-means
def kmeans(X, k, n_iterations=100):
    # 随机选取K个初始中心
    initial_indices = np.random.choice(X.shape[0], k, replace=False)
    centroids = X[initial_indices]
    
    for _ in range(n_iterations):
        # 计算每个数据点到中心的距离
        distances = np.linalg.norm(X[:, np.newaxis] - centroids, axis=2)
        # 分配每个数据点到最近的中心
        closest_indices = np.argmin(distances, axis=1)
        
        # 更新中心
        new_centroids = np.array([X[closest_indices == i].mean(axis=0) for i in range(k)])
        
        # 如果中心不再变化,则结束
        if np.all(centroids == new_centroids):
            break
        centroids = new_centroids
    
    return closest_indices, centroids

# 生成数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 运行K-means
k = 4
labels, centroids = kmeans(X, k)

# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, s=30, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=200, alpha=0.75, marker='X')
plt.title('K-means 聚类结果')
plt.xlabel('特征1')
plt.ylabel('特征2')
plt.show()

数据可视化:饼状图

我们可以将每个簇的大小以饼状图的形式展示。以下是绘制饼状图的代码示例:

# 统计每个簇的样本数量
unique, counts = np.unique(labels, return_counts=True)

# 绘制饼状图
plt.figure(figsize=(8, 6))
plt.pie(counts, labels=unique, autopct='%1.1f%%', startangle=140)
plt.title('K-means 聚类样本分布')
plt.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.
plt.show()

状态图

使用状态图可以可视化K-means算法的工作流程。以下是一个简单的状态图:

stateDiagram
    [*] --> 初始化
    初始化 --> 聚类分配
    聚类分配 --> 更新中心
    更新中心 --> 聚类分配 : 中心点变化
    更新中心 --> [*] : 中心点不变

结论

K-means聚类是一种有效且易于实现的聚类算法,能够在各种数据集中取得良好的聚类效果。通过Python的实现和可视化手段,我们可以直观地理解K-means的工作原理以及它在实际应用中的表现。虽然K-means算法有其局限性,例如对初始中心的敏感性和无法处理非球形分布的簇,但它仍然是数据挖掘和机器学习领域的重要工具之一。

希望大家能够对K-means聚类算法有更深入的了解,并能够在实际问题中灵活运用该算法。