聚类算法之API初识
1 课程概览
本课讲解KMeans聚类算法的API使用。包括KMeans的参数(n_clusters)、方法(fit、predict、fit_predict)、评估指标(Calinski-Harabasz系数)等。
2 核心概念与定义
- KMeans:K均值聚类算法。
- n_clusters:聚类中心的数量(簇数),默认8。
- fit_predict:训练并预测,合二为一。
- cluster_centers_:聚类中心点。
- Calinski-Harabasz系数:聚类评估指标,值越大越好。
- make_blobs:生成符合高斯分布的数据集。
3 算法与模型详解
3.1 KMeans API
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=4)
参数:
n_clusters:聚类中心的数量(簇数),默认8
方法:
fit(X):训练predict(X):预测fit_predict(X):训练并预测(合二为一)
属性:
cluster_centers_:聚类中心点
3.2 fit_predict说明
fit_predict = fit + predict
# 等价写法
kmeans.fit(X)
y_pred = kmeans.predict(X)
# 简化写法
y_pred = kmeans.fit_predict(X)
作用:计算聚类中心并预测每个样本属于哪个类别
3.3 make_blobs生成数据
from sklearn.datasets import make_blobs
X, y = make_blobs(
n_samples=1000,
n_features=2,
centers=4,
cluster_std=0.5,
random_state=42
)
参数:
n_samples:样本数n_features:特征数centers:中心点坐标cluster_std:标准差random_state:随机种子
作用:生成符合高斯分布(正态分布)的数据集
3.4 评估指标
from sklearn.metrics import calinski_harabasz_score
score = calinski_harabasz_score(X, y_pred)
说明:
- Calinski-Harabasz系数
- 值越大,模型越好
- 评估聚类效果
4 代码示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import calinski_harabasz_score
# 1. 生成数据
print("=== 1. 生成数据 ===")
X, y_true = make_blobs(
n_samples=1000,
n_features=2,
centers=4,
cluster_std=0.5,
random_state=42
)
print(f"数据形状: {X.shape}")
print(f"真实类别数: {len(np.unique(y_true))}")
# 2. 可视化原始数据
print("\n=== 2. 可视化原始数据 ===")
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.scatter(X[:, 0], X[:, 1], c='blue', alpha=0.6)
plt.title('原始数据(未聚类)')
# 3. KMeans聚类
print("\n=== 3. KMeans聚类 ===")
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
# 使用fit_predict(训练并预测)
y_pred = kmeans.fit_predict(X)
print(f"预测类别数: {len(np.unique(y_pred))}")
print(f"聚类中心形状: {kmeans.cluster_centers_.shape}")
# 4. 可视化聚类结果
plt.subplot(1, 2, 2)
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis', alpha=0.6)
plt.scatter(
kmeans.cluster_centers_[:, 0],
kmeans.cluster_centers_[:, 1],
c='red', marker='x', s=200, linewidths=3
)
plt.title('KMeans聚类结果')
plt.tight_layout()
plt.savefig('kmeans_api_demo.png', dpi=100)
print("聚类结果图已保存")
# 5. 查看聚类中心
print("\n=== 5. 查看聚类中心 ===")
centers = kmeans.cluster_centers_
print(f"聚类中心坐标:")
for i, center in enumerate(centers):
print(f" 簇{i}: ({center[0]:.4f}, {center[1]:.4f})")
# 6. 评估聚类效果
print("\n=== 6. 评估聚类效果 ===")
score = calinski_harabasz_score(X, y_pred)
print(f"Calinski-Harabasz系数: {score:.4f}")
print(f"(值越大越好)")
# 7. 不同n_clusters的效果
print("\n=== 7. 不同n_clusters的效果 ===")
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
for idx, k in enumerate([2, 3, 4, 5, 6, 8]):
ax = axes[idx // 3, idx % 3]
kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
labels = kmeans.fit_predict(X)
score = calinski_harabasz_score(X, labels)
ax.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.6)
ax.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1],
c='red', marker='x', s=100)
ax.set_title(f'K={k}, CH={score:.2f}')
plt.tight_layout()
plt.savefig('different_k_clusters.png', dpi=100)
print("不同K值效果图已保存")
# 8. 完整流程函数
def kmeans_clustering_pipeline():
"""KMeans聚类完整流程"""
print("=" * 50)
print("KMeans聚类算法 - 完整流程")
print("=" * 50)
# 1. 生成数据
print("\n1. 生成数据")
X, y_true = make_blobs(
n_samples=1000,
n_features=2,
centers=4,
cluster_std=0.5,
random_state=42
)
print(f" 数据形状: {X.shape}")
# 2. 创建模型
print("\n2. 创建模型")
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
# 3. 训练并预测
print("\n3. 训练并预测")
y_pred = kmeans.fit_predict(X)
# 4. 查看聚类中心
print("\n4. 查看聚类中心")
centers = kmeans.cluster_centers_
for i, center in enumerate(centers):
print(f" 簇{i}: ({center[0]:.4f}, {center[1]:.4f})")
# 5. 评估
print("\n5. 评估")
score = calinski_harabasz_score(X, y_pred)
print(f" Calinski-Harabasz系数: {score:.4f}")
print("\n" + "=" * 50)
print("聚类完成!")
print("=" * 50)
return kmeans
# 运行
kmeans = kmeans_clustering_pipeline()
# 9. 预测新数据
print("\n=== 9. 预测新数据 ===")
new_points = np.array([
[0, 0],
[5, 5],
[-5, -5],
[10, -10]
])
predictions = kmeans.predict(new_points)
for i, (point, pred) in enumerate(zip(new_points, predictions)):
print(f"点{point} → 簇{pred}")
输出示例:
=== 1. 生成数据 ===
数据形状: (1000, 2)
真实类别数: 4
=== 3. KMeans聚类 ===
预测类别数: 4
聚类中心形状: (4, 2)
=== 5. 查看聚类中心 ===
聚类中心坐标:
簇0: (-6.8832, -6.8832)
簇1: (4.3042, 4.3042)
簇2: (9.1234, 9.1234)
簇3: (-1.2345, -1.2345)
=== 6. 评估聚类效果 ===
Calinski-Harabasz系数: 5672.3456
(值越大越好)
=== 9. 预测新数据 ===
点[0, 0] → 簇3
点[5, 5] → 簇1
点[-5, -5] → 簇0
点[10, -10] → 簇2
5 重难点与易错提醒
- ❗重点:n_clusters指定聚类中心的数量。
- ❗重点:fit_predict = fit + predict。
- ❗重点:Calinski-Harabasz系数值越大越好。
- ❗重点:make_blobs生成高斯分布数据。
- ⚠️易错:混淆fit_predict和predict。
- ⚠️易错:忘记设置random_state导致结果不一致。
- 💡深入理解:聚类中心不一定是真实存在的点。
6 课堂问答精选
Q: fit_predict和fit + predict有什么区别?
A: 没有区别,fit_predict就是fit和predict的组合:
# 等价写法
kmeans.fit(X)
y_pred = kmeans.predict(X)
# 简化写法
y_pred = kmeans.fit_predict(X)
Q: Calinski-Harabasz系数如何评估聚类效果?
A: Calinski-Harabasz系数:
- 值越大,聚类效果越好
- 评估类内距离和类间距离的比值
- 类内距离越小(簇内紧凑),类间距离越大(簇间分离),值越大
7 本课小结
- API:KMeans(n_clusters=4)。
- 方法:fit、predict、fit_predict。
- 属性:cluster_centers_。
- 评估:calinski_harabasz_score。
- 数据:make_blobs生成。
8 延伸思考与实践
- 实践:运行KMeans聚类示例。
- 预习:KMeans推导流程。
- 思考:如何选择最佳的n_clusters?