# K-means聚类算法

# 直观理解

想象你走进一个大型图书馆,看到成千上万的书籍杂乱地摆放着。作为图书管理员,你需要将这些书籍整理成几个主要类别,方便读者查找。你会怎么做呢?

你可能会这样做:

  1. 先决定分成几个大类(比如科技、文学、历史等)
  2. 为每个类别找一个代表性的位置(书架)
  3. 把每本书放到最接近其内容的类别书架
  4. 根据已经分类的书籍,调整每个类别的具体位置
  5. 重复3-4步,直到所有书都在最合适的位置

这就是K-means聚类算法的工作方式!

# 算法原理

K-means就像是一个智能图书管理员,它通过不断调整和优化,将杂乱的数据点(书籍)自动分组成K个类别(书架)。每个类别都有一个中心点(书架位置),算法的目标是让每个数据点都尽可能靠近它所属类别的中心。

# 基本概念(以图书馆为例)

  • 聚类中心:每个类别的中心位置(比如每个书架的位置)
  • 距离度量:衡量相似程度的方法(比如书籍内容的相似度)
  • 迭代优化:不断调整书架位置和书籍分类,直到达到最佳效果

# 算法流程

# 数学原理

# 目标函数

最小化所有数据点到其聚类中心的距离平方和:

J=i=1nk=1Kwikxiμk2J = \sum_{i=1}^n \sum_{k=1}^K w_{ik}||x_i - \mu_k||^2

其中:

  • xix_i 是第i个数据点
  • μk\mu_k 是第k个聚类中心
  • wikw_{ik} 是指示变量,当点i属于类k时为1,否则为0

# 聚类中心更新

每次迭代更新聚类中心:

μk=i=1nwikxii=1nwik\mu_k = \frac{\sum_{i=1}^n w_{ik}x_i}{\sum_{i=1}^n w_{ik}}

# 算法步骤

  1. 初始化:随机选择K个聚类中心
  2. 分配:将每个数据点分配到最近的聚类中心
  3. 更新:重新计算每个类的聚类中心
  4. 重复:重复步骤2-3直到收敛

# 优缺点

# 优点

  • 算法简单,易于实现
  • 收敛速度快
  • 对大数据集有效
  • 聚类结果直观

# 缺点

  • 需要预先指定K值
  • 对初始值敏感
  • 只能发现球形聚类
  • 对异常值敏感

# 应用场景

  1. 客户分群

    • 用户画像
    • 消费行为分析
    • 市场细分
  2. 图像处理

    • 图像分割
    • 颜色量化
    • 特征聚类
  3. 数据压缩

    • 向量量化
    • 特征提取
    • 降维处理

# 代码示例

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} 个样本")

# 调优技巧

  1. K值选择

    • 肘部法则
    • 轮廓系数
    • Gap统计量
  2. 初始化方法

    • k-means++
    • 分层采样
    • 多次随机初始化
  3. 预处理

    • 特征缩放
    • 异常值处理
    • 降维处理

# 常见问题与解决方案

  1. K值确定

    • 使用评估指标
    • 业务知识指导
    • 可视化分析
  2. 局部最优

    • 多次运行
    • 优化初始值
    • 使用k-means++
  3. 特征处理

    • 特征选择
    • 特征变换
    • 处理异常值