### Python 实现 KMeans 聚类算法并绘制流程图
以下是使用 `scikit-learn` 的 `KMeans` 类来实现 KMeans 聚类算法的完整代码示例,并结合 Matplotlib 绘制聚类结果以及流程图。
#### 1. 使用 Scikit-Learn 实现 KMeans 聚类
下面是一个完整的 Python 示例,展示如何应用 KMeans 算法到样本数据集上:
```python
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
# 创建随机二维数据作为样例
np.random.seed(0)
X = np.random.rand(150, 2)
# 初始化 KMeans 模型
km = KMeans(
n_clusters=3,
init="random",
n_init=10,
max_iter=300,
tol=1e-04,
random_state=0
)
y_km = km.fit_predict(X) # 训练模型并对数据进行预测
# 可视化聚类结果
plt.scatter(
X[y_km == 0, 0], X[y_km == 0, 1],
s=50, c='lightgreen',
marker='s', edgecolor='black',
label='Cluster 1'
)
plt.scatter(
X[y_km == 1, 0], X[y_km == 1, 1],
s=50, c='orange',
marker='o', edgecolor='black',
label='Cluster 2'
)
plt.scatter(
X[y_km == 2, 0], X[y_km == 2, 1],
s=50, c='lightblue',
marker='v', edgecolor='black',
label='Cluster 3'
)
plt.scatter(
km.cluster_centers_[:, 0], km.cluster_centers_[:, 1],
s=250, marker='*',
c='red', edgecolor='black',
label='Centroids'
)
plt.legend(scatterpoints=1)
plt.grid()
plt.show()
```
此部分展示了如何初始化 KMeans 并将其应用于给定的数据集中[^1]。通过设置参数如 `n_clusters`, `init`, 和 `max_iter` 来控制算法的行为。
---
#### 2. 流程图可视化
为了更好地理解 KMeans 算法的工作原理,可以创建一个简单的流程图描述其主要步骤。这里我们将借助 `matplotlib` 或者专门的绘图工具包 `graphviz` 来完成这一任务。
##### 方法一:Matplotlib 绘制简单流程图
以下代码片段演示了如何用 Matplotlib 构建基本的流程图结构:
```python
import matplotlib.patches as mpatches
import matplotlib.lines as mlines
fig, ax = plt.subplots(figsize=(8, 6))
# 添加矩形框代表各个阶段
rect1 = mpatches.Rectangle((0.1, 0.7), 0.2, 0.1, linewidth=1, edgecolor='black', facecolor='white')
ax.add_patch(rect1)
ax.text(0.2, 0.75, 'Initialize Centroids', ha='center')
rect2 = mpatches.Rectangle((0.1, 0.5), 0.2, 0.1, linewidth=1, edgecolor='black', facecolor='white')
ax.add_patch(rect2)
ax.text(0.2, 0.55, 'Assign Points to Nearest Cluster', ha='center')
rect3 = mpatches.Rectangle((0.1, 0.3), 0.2, 0.1, linewidth=1, edgecolor='black', facecolor='white')
ax.add_patch(rect3)
ax.text(0.2, 0.35, 'Recalculate Centroids', ha='center')
rect4 = mpatches.Rectangle((0.1, 0.1), 0.2, 0.1, linewidth=1, edgecolor='black', facecolor='white')
ax.add_patch(rect4)
ax.text(0.2, 0.15, 'Check Convergence', ha='center')
# 连接箭头
arrow1 = mlines.Line2D([0.2, 0.2], [0.6, 0.4], color='black', arrowstyle='-|>')
arrow2 = mlines.Line2D([0.2, 0.2], [0.4, 0.2], color='black', arrowstyle='-|>')
arrow3 = mlines.Line2D([0.2, 0.2], [0.2, 0.0], color='black', linestyle='dashed', arrowstyle='<->')
ax.add_line(arrow1)
ax.add_line(arrow2)
ax.add_line(arrow3)
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
ax.axis('off') # 关闭坐标轴显示
plt.show()
```
这段代码定义了一个由四个矩形组成的流程图,分别对应 KMeans 中的主要步骤:初始化质心、分配点至最近簇、重新计算质心和检查收敛条件[^1]。
---
#### 3. 结合两者的结果
最终可以通过将上述两部分内容结合起来,在同一界面下展示聚类结果及其对应的流程逻辑。
---
###