# K-means聚类算法
# 直观理解
想象你走进一个大型图书馆,看到成千上万的书籍杂乱地摆放着。作为图书管理员,你需要将这些书籍整理成几个主要类别,方便读者查找。你会怎么做呢?
你可能会这样做:
- 先决定分成几个大类(比如科技、文学、历史等)
- 为每个类别找一个代表性的位置(书架)
- 把每本书放到最接近其内容的类别书架
- 根据已经分类的书籍,调整每个类别的具体位置
- 重复3-4步,直到所有书都在最合适的位置
这就是K-means聚类算法的工作方式!
# 算法原理
K-means就像是一个智能图书管理员,它通过不断调整和优化,将杂乱的数据点(书籍)自动分组成K个类别(书架)。每个类别都有一个中心点(书架位置),算法的目标是让每个数据点都尽可能靠近它所属类别的中心。
# 基本概念(以图书馆为例)
- 聚类中心:每个类别的中心位置(比如每个书架的位置)
- 距离度量:衡量相似程度的方法(比如书籍内容的相似度)
- 迭代优化:不断调整书架位置和书籍分类,直到达到最佳效果
# 算法流程
# 数学原理
# 目标函数
最小化所有数据点到其聚类中心的距离平方和:
其中:
- 是第i个数据点
- 是第k个聚类中心
- 是指示变量,当点i属于类k时为1,否则为0
# 聚类中心更新
每次迭代更新聚类中心:
# 算法步骤
- 初始化:随机选择K个聚类中心
- 分配:将每个数据点分配到最近的聚类中心
- 更新:重新计算每个类的聚类中心
- 重复:重复步骤2-3直到收敛
# 优缺点
# 优点
- 算法简单,易于实现
- 收敛速度快
- 对大数据集有效
- 聚类结果直观
# 缺点
- 需要预先指定K值
- 对初始值敏感
- 只能发现球形聚类
- 对异常值敏感
# 应用场景
客户分群
- 用户画像
- 消费行为分析
- 市场细分
图像处理
- 图像分割
- 颜色量化
- 特征聚类
数据压缩
- 向量量化
- 特征提取
- 降维处理
# 代码示例
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import numpy as np
# 生成示例数据
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
# 创建K-means聚类器
kmeans = KMeans(n_clusters=4, init='k-means++', random_state=0)
# 训练模型
kmeans.fit(X)
# 预测
y_pred = kmeans.predict(X)
# 获取聚类中心
centers = kmeans.cluster_centers_
# 计算惯性(所有点到其聚类中心的距离平方和)
inertia = kmeans.inertia_
print(f"聚类惯性: {inertia:.2f}")
# 查看每个类别的样本数
unique, counts = np.unique(y_pred, return_counts=True)
for i, count in zip(unique, counts):
print(f"类别 {i}: {count} 个样本")
# 调优技巧
K值选择
- 肘部法则
- 轮廓系数
- Gap统计量
初始化方法
- k-means++
- 分层采样
- 多次随机初始化
预处理
- 特征缩放
- 异常值处理
- 降维处理
# 常见问题与解决方案
K值确定
- 使用评估指标
- 业务知识指导
- 可视化分析
局部最优
- 多次运行
- 优化初始值
- 使用k-means++
特征处理
- 特征选择
- 特征变换
- 处理异常值