K-means 聚类算法简介
K-means是一种广泛使用的聚类算法,旨在将数据集分成K个不同的簇(群组)。该算法的核心思想是通过迭代的方式找到数据点的最优分组,使得同一组中的数据点尽可能相似,而不同组之间的数据点尽可能不同。在这篇文章中,我们将深入讲解K-means算法的基本原理、伪代码实现以及Python代码示例,并通过可视化的方式展示聚类结果。
K-means算法原理
K-means算法的工作流程大致如下:
- 初始化: 随机选择K个初始聚类中心(centroids)。
- 聚类分配: 将每个数据点分配到离其最近的聚类中心。
- 更新中心: 重新计算每个聚类的中心点。
- 重复迭代: 重复步骤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聚类算法有更深入的了解,并能够在实际问题中灵活运用该算法。